linux內核分析網路
❶ 關於 linux 網路,你必須知道這些
我們一起學習了文件系統和磁碟 I/O 的工作原理,以及相應的性能分析和優化方法。接下來,我們將進入下一個重要模塊—— Linux 的網路子系統。
由於網路處理的流程最復雜,跟我們前面講到的進程調度、中斷處理、內存管理以及 I/O 等都密不可分,所以,我把網路模塊作為最後一個資源模塊來講解。
同 CPU、內存以及 I/O 一樣,網路也是 Linux 系統最核心的功能。網路是一種把不同計算機或網路設備連接到一起的技術,它本質上是一種進程間通信方式,特別是跨系統的進程間通信,必須要通過網路才能進行。隨著高並發、分布式、雲計算、微服務等技術的普及,網路的性能也變得越來越重要。
說到網路,我想你肯定經常提起七層負載均衡、四層負載均衡,或者三層設備、二層設備等等。那麼,這里說的二層、三層、四層、七層又都是什麼意思呢?
實際上,這些層都來自國際標准化組織制定的開放式系統互聯通信參考模型(Open System Interconnection Reference Model),簡稱為 OSI 網路模型。
但是 OSI 模型還是太復雜了,也沒能提供一個可實現的方法。所以,在 Linux 中,我們實際上使用的是另一個更實用的四層模型,即 TCP/IP 網路模型。
TCP/IP 模型,把網路互聯的框架分為應用層、傳輸層、網路層、網路介面層等四層,其中,
為了幫你更形象理解 TCP/IP 與 OSI 模型的關系,我畫了一張圖,如下所示:
當然了,雖說 Linux 實際按照 TCP/IP 模型,實現了網路協議棧,但在平時的學習交流中,我們習慣上還是用 OSI 七層模型來描述。比如,說到七層和四層負載均衡,對應的分別是 OSI 模型中的應用層和傳輸層(而它們對應到 TCP/IP 模型中,實際上是四層和三層)。
OSI引入了服務、介面、協議、分層的概念,TCP/IP借鑒了OSI的這些概念建立TCP/IP模型。
OSI先有模型,後有協議,先有標准,後進行實踐;而TCP/IP則相反,先有協議和應用再提出了模型,且是參照的OSI模型。
OSI是一種理論下的模型,而TCP/IP已被廣泛使用,成為網路互聯事實上的標准。
有了 TCP/IP 模型後,在進行網路傳輸時,數據包就會按照協議棧,對上一層發來的數據進行逐層處理;然後封裝上該層的協議頭,再發送給下一層。
當然,網路包在每一層的處理邏輯,都取決於各層採用的網路協議。比如在應用層,一個提供 REST API 的應用,可以使用 HTTP 協議,把它需要傳輸的 JSON 數據封裝到 HTTP 協議中,然後向下傳遞給 TCP 層。
而封裝做的事情就很簡單了,只是在原來的負載前後,增加固定格式的元數據,原始的負載數據並不會被修改。
比如,以通過 TCP 協議通信的網路包為例,通過下面這張圖,我們可以看到,應用程序數據在每個層的封裝格式。
這些新增的頭部和尾部,增加了網路包的大小,但我們都知道,物理鏈路中並不能傳輸任意大小的數據包。網路介面配置的最大傳輸單元(MTU),就規定了最大的 IP 包大小。在我們最常用的乙太網中,MTU 默認值是 1500(這也是 Linux 的默認值)。
一旦網路包超過 MTU 的大小,就會在網路層分片,以保證分片後的 IP 包不大於 MTU 值。顯然,MTU 越大,需要的分包也就越少,自然,網路吞吐能力就越好。
理解了 TCP/IP 網路模型和網路包的封裝原理後,你很容易能想到,Linux 內核中的網路棧,其實也類似於 TCP/IP 的四層結構。如下圖所示,就是 Linux 通用 IP 網路棧的示意圖:
我們從上到下來看這個網路棧,你可以發現,
這里我簡單說一下網卡。網卡是發送和接收網路包的基本設備。在系統啟動過程中,網卡通過內核中的網卡驅動程序注冊到系統中。而在網路收發過程中,內核通過中斷跟網卡進行交互。
再結合前面提到的 Linux 網路棧,可以看出,網路包的處理非常復雜。所以,網卡硬中斷只處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理。
我們先來看網路包的接收流程。
當一個網路幀到達網卡後,網卡會通過 DMA 方式,把這個網路包放到收包隊列中;然後通過硬中斷,告訴中斷處理程序已經收到了網路包。
接著,網卡中斷處理程序會為網路幀分配內核數據結構(sk_buff),並將其拷貝到 sk_buff 緩沖區中;然後再通過軟中斷,通知內核收到了新的網路幀。
接下來,內核協議棧從緩沖區中取出網路幀,並通過網路協議棧,從下到上逐層處理這個網路幀。比如,
最後,應用程序就可以使用 Socket 介面,讀取到新接收到的數據了。
為了更清晰表示這個流程,我畫了一張圖,這張圖的左半部分表示接收流程,而圖中的粉色箭頭則表示網路包的處理路徑。
了解網路包的接收流程後,就很容易理解網路包的發送流程。網路包的發送流程就是上圖的右半部分,很容易發現,網路包的發送方向,正好跟接收方向相反。
首先,應用程序調用 Socket API(比如 sendmsg)發送網路包。
由於這是一個系統調用,所以會陷入到內核態的套接字層中。套接字層會把數據包放到 Socket 發送緩沖區中。
接下來,網路協議棧從 Socket 發送緩沖區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。比如,傳輸層和網路層,分別為其增加 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,並按照 MTU 大小進行分片。
分片後的網路包,再送到網路介面層,進行物理地址定址,以找到下一跳的 MAC 地址。然後添加幀頭和幀尾,放到發包隊列中。這一切完成後,會有軟中斷通知驅動程序:發包隊列中有新的網路幀需要發送。
最後,驅動程序通過 DMA ,從發包隊列中讀出網路幀,並通過物理網卡把它發送出去。
多台伺服器通過網卡、交換機、路由器等網路設備連接到一起,構成了相互連接的網路。由於網路設備的異構性和網路協議的復雜性,國際標准化組織定義了一個七層的 OSI 網路模型,但是這個模型過於復雜,實際工作中的事實標准,是更為實用的 TCP/IP 模型。
TCP/IP 模型,把網路互聯的框架,分為應用層、傳輸層、網路層、網路介面層等四層,這也是 Linux 網路棧最核心的構成部分。
我結合網路上查閱的資料和文章中的內容,總結了下網卡收發報文的過程,不知道是否正確:
當發送數據包時,與上述相反。鏈路層將數據包封裝完畢後,放入網卡的DMA緩沖區,並調用系統硬中斷,通知網卡從緩沖區讀取並發送數據。
了解 Linux 網路的基本原理和收發流程後,你肯定迫不及待想知道,如何去觀察網路的性能情況。具體而言,哪些指標可以用來衡量 Linux 的網路性能呢?
實際上,我們通常用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網路的性能。
除了這些指標,網路的可用性(網路能否正常通信)、並發連接數(TCP 連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網路包比例)等也是常用的性能指標。
分析網路問題的第一步,通常是查看網路介面的配置和狀態。你可以使用 ifconfig 或者 ip 命令,來查看網路的配置。我個人更推薦使用 ip 工具,因為它提供了更豐富的功能和更易用的介面。
以網路介面 eth0 為例,你可以運行下面的兩個命令,查看它的配置和狀態:
你可以看到,ifconfig 和 ip 命令輸出的指標基本相同,只是顯示格式略微不同。比如,它們都包括了網路介面的狀態標志、MTU 大小、IP、子網、MAC 地址以及網路包收發的統計信息。
第一,網路介面的狀態標志。ifconfig 輸出中的 RUNNING ,或 ip 輸出中的 LOWER_UP ,都表示物理網路是連通的,即網卡已經連接到了交換機或者路由器中。如果你看不到它們,通常表示網線被拔掉了。
第二,MTU 的大小。MTU 默認大小是 1500,根據網路架構的不同(比如是否使用了 VXLAN 等疊加網路),你可能需要調大或者調小 MTU 的數值。
第三,網路介面的 IP 地址、子網以及 MAC 地址。這些都是保障網路功能正常工作所必需的,你需要確保配置正確。
第四,網路收發的位元組數、包數、錯誤數以及丟包情況,特別是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,通常表示出現了網路 I/O 問題。其中:
ifconfig 和 ip 只顯示了網路介面收發數據包的統計信息,但在實際的性能問題中,網路協議棧中的統計信息,我們也必須關注。你可以用 netstat 或者 ss ,來查看套接字、網路棧、網路介面以及路由表的信息。
我個人更推薦,使用 ss 來查詢網路的連接信息,因為它比 netstat 提供了更好的性能(速度更快)。
比如,你可以執行下面的命令,查詢套接字信息:
netstat 和 ss 的輸出也是類似的,都展示了套接字的狀態、接收隊列、發送隊列、本地地址、遠端地址、進程 PID 和進程名稱等。
其中,接收隊列(Recv-Q)和發送隊列(Send-Q)需要你特別關注,它們通常應該是 0。當你發現它們不是 0 時,說明有網路包的堆積發生。當然還要注意,在不同套接字狀態下,它們的含義不同。
當套接字處於連接狀態(Established)時,
當套接字處於監聽狀態(Listening)時,
所謂全連接,是指伺服器收到了客戶端的 ACK,完成了 TCP 三次握手,然後就會把這個連接挪到全連接隊列中。這些全連接中的套接字,還需要被 accept() 系統調用取走,伺服器才可以開始真正處理客戶端的請求。
與全連接隊列相對應的,還有一個半連接隊列。所謂半連接是指還沒有完成 TCP 三次握手的連接,連接只進行了一半。伺服器收到了客戶端的 SYN 包後,就會把這個連接放到半連接隊列中,然後再向客戶端發送 SYN+ACK 包。
類似的,使用 netstat 或 ss ,也可以查看協議棧的信息:
這些協議棧的統計信息都很直觀。ss 只顯示已經連接、關閉、孤兒套接字等簡要統計,而 netstat 則提供的是更詳細的網路協議棧信息。
比如,上面 netstat 的輸出示例,就展示了 TCP 協議的主動連接、被動連接、失敗重試、發送和接收的分段數量等各種信息。
接下來,我們再來看看,如何查看系統當前的網路吞吐量和 PPS。在這里,我推薦使用我們的老朋友 sar,在前面的 CPU、內存和 I/O 模塊中,我們已經多次用到它。
給 sar 增加 -n 參數就可以查看網路的統計信息,比如網路介面(DEV)、網路介面錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就可以得到網路介面統計信息:
這兒輸出的指標比較多,我來簡單解釋下它們的含義。
其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:
其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:
我們通常使用帶寬、吞吐量、延時等指標,來衡量網路的性能;相應的,你可以用 ifconfig、netstat、ss、sar、ping 等工具,來查看這些網路的性能指標。
小狗同學問到: 老師,您好 ss —lntp 這個 當session處於listening中 rec-q 確定是 syn的backlog嗎?
A: Recv-Q為全連接隊列當前使用了多少。 中文資料里這個問題講得最明白的文章: https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ
看了源碼發現,這個地方講的有問題.關於ss輸出中listen狀態套接字的Recv-Q表示全連接隊列當前使用了多少,也就是全連接隊列的當前長度,而Send-Q表示全連接隊列的最大長度
❷ 一張圖看懂Linux內核運行交互關系,值得收藏!
很多朋友如果接觸過Linux的都知道Kernel的含義,kernel是操作系統的核心或者最重要的部分。眾所周知的是,幾乎整個互聯網都運行在 Linux上,從網路協議,到伺服器,到你平常訪問的絕大多數網站,都能看到它的身影,Linux 內核就是最復雜最流行的開源項目之一。
無意中看到MakeLinux 製作的Linux內核交互圖,講的很全面,這里分享給大家。
俗話說「一圖勝千言」,下面通過一張完整的 Linux 內核運行原理圖,可以很方便地讓你學習內核知識。在 Linux 內核中,有許多層次、模塊、功能調用和函數。要把其中的每一塊兒都弄明白是很不容易的,MakeLinux做了一個非常酷的完整的內核交互圖,上面非常清晰地標注了每一個組件部分及之間的關系,這張Linux內核交互圖可以很好的幫助你不用一一細讀 Linux 內核代碼,就能弄明白各個內核子系統間復雜的內部聯系。因為比較大,所以這里我做個拆分。
這張圖上包含有超過400個關鍵函數,這400個關鍵函數被分進了一些主要的子系統,彼此之間的關系用連線標明了,清晰明了。
考慮到很多朋友可能需要原圖,所以放網路雲了,大家私信 「內核」 就可以領取了。也希望大家幫忙多多轉發,謝謝~
❸ 簡述Linux內核和Linux發行版的區別.DNY版
做伺服器運維工作,要經常和Linux的版本號打交道,但一直搞不明白Linux內核和Linux發行版到底是個啥東西。其實要理解Linux內核和Linux發行版之間的關系,只要能理解下面的關系就可以了:
1.類似於游戲引擎《虛幻4》和游戲《絕地求生》之間的關系。沒有虛幻4這款引擎,就沒有絕地求生的游戲,但是有了虛幻4這款引擎,可以開發各種各樣的游戲。
2.類似於汽車的核心三大件(發動機、變速箱、底盤)和寶馬汽車之間的關系。汽車最重要的東西就是發動機、變速箱、底盤,寶馬汽車和賓士汽車可能用的都是同樣的發動機,但是寶馬汽車和賓士汽車的外觀是完全不一樣的。
3.類似於電腦的核心硬體(CPU、內存、硬碟、主板、顯卡)和戴爾電腦之間的關系。不管是聯機的電腦,還是戴爾的電腦,CPU都是Intel或者AMD的。
4.類似於安卓系統和華為手機或者說和華為手機操作系統之間的關系。三星、華為、小米、Vivo這些手機的操作系統都是安卓的操作系統,除去手機硬體的外觀不說,在操作使用上就存在差異。並且同是華為的品牌,手機型號不同,使用的安卓的內核版本號也不相同。
簡單的說,內核就是內部的核心的東西,大家的內核都是一樣的,發行版對應的則是外部的東西,例如功能、特性、外觀、操作啊,大家的發行版都是不一樣的。
Linux內核是Linux操作系統創始人主持的網站www.kernel.org上發布的操作系統的最基本的那些東西。Linux發行版則是在前述那些東西的基礎上添加了一些工具、軟體,構成的一套龐大復雜的操作系統。雖然內核都是一樣的,但添加部分各不相同,這就構成了不同的發行版本。Linux本身指的是一個操作系統內核,只有內核是無法直接使用的。我們需要的是可以使用的操作系統,是一個包含了內核和一批有用的程序的一個集合體,這個就是Linux發行版。其中,Ubuntu、RedHat就是Linux的不同的發行版。
外延1:既然內核這么牛逼,那麼Linux的內核長啥樣兒,幹啥的?
參考1: https://www.cnblogs.com/yuanqiangfei/p/10225202.html
文中給出了Linux內核的整體架構。根據內核的核心功能,Linux內核提出了5個子系統,分別負責如下的功能:1. Process Scheler,也稱作進程管理、進程調度。2. Memory Manager,內存管理。3. VFS(Virtual File System),虛擬文件系統。4. Network,網路子系統。5. IPC(Inter-Process Communication),進程間通信。
到此打住,不再繼續研究Linux內核了,否則偏離了文章的主題,而且Linux內核這方面的知識也不是一兩天就能掌握的。
外延2:既然Linux有內核,那麼Windows有內核么?
參考2: https://www.cnblogs.com/skyer/p/8608113.html
Windows顯然也是有內核的說法的,只不過一個內核版本對應一個發行版本。說到這我真要吐槽一把Linux的版本問題,做伺服器運維,經常遇到因為Linux的版本不同,導致應用程序死活裝不上,庫文件版本號死活對不上,依賴包死活找不到......這些一提起來就讓人惡心的問題。
外延3:Linux內核版和發行版之間大致是怎麼一種聯系?
參考3: https://www.jianshu.com/p/f96880637e42
通過上面的解釋,當我們的頭腦里能區分出內核版和發行版的概念之後,再看兩者之間的關系,就很清晰了。
外延4:如何查看Linux內核版本號和發行版本號?
參考4: https://blog.csdn.net/haiziccc/article/details/90203967
查看操作系統版本一般有三個命令:
1. lsb_release -a,適用於所有Linux發行版
2. cat /etc/redhat-release,適用於Redhat
3. cat /etc/issue,適用於所有Linux發行版
查看系統內核版本一般有兩個命令:
1. cat /proc/version
2. uname -a
❹ Linux內核源碼剖析的介紹
《Linux內核源碼剖析》是由樊東東,莫瀾編著,機械工業出版社於2011年1月1日出版的一本書籍。本書詳細論述了Linux內核2.6.20版本中TCP/IP的實現。書中給出了大量的源代碼,通過對源代碼的詳細注釋,幫助讀者掌握TCP/IP的實現。本書根據協議棧層次,從驅動層逐步論述到傳輸層,包括驅動的實現、介面層的輸入輸出、IP層的輸入輸出以及IP選項的處理、鄰居子系統、路由、套介面及傳輸層等內容,全書基本涵蓋了網路體系架構全部的知識點。特別是TCP,包括TCP連接的建立和終止、輸入與輸出,以及擁塞控制的實現。
❺ linux內核網路實現分析 這本書有全部的么
我讀過的書有下面幾本,在網上也很容易找到: Linux.Kernel.Development.Second.Edition.chm(中文叫LINUX內核設計與實現,這本書入門很適合的) OReilly.,DElVRD
❻ Linux常用內核網路參數及修改方法
在修改內核參數前,需要注意以下幾點:
本文提供以下兩種修改Linux實例內核參數的方法。
/proc/sys/ 目錄是Linux內核在啟動後生成的偽目錄,其目錄下的 net 文件夾中存放了當前系統中開啟的所有內核參數,目錄樹結構與參數的完整名稱相關,如 net.ipv4.tcp_tw_recycle ,它對應的文件是 /proc/sys/net/ipv4/tcp_tw_recycle 文件,文件的內容就是參數值。方法一中修改的參數值僅在當前運行中生效,系統重啟後會回滾到歷史值,一般用於臨時性驗證修改的效果。若需要永久性修改,請參見方法二。
❼ Linux微內核(鴻蒙分析)
1、最近鴻蒙炒的火熱,19年就說ipc是谷歌fuchsia的5倍,但他當時沒有對比宏內核,正常宏內核的ipc效率肯定很高。
我自己覺得微內核確實是體積小了但是外面的那些驅動什麼的又需要開發者去開發,這些開發者前期也就只有華為的開發人員去弄
鴻蒙獨立了跑到國外谷歌全家桶又是一個不可逾越的鴻溝,GMS用不了國外就沒希望,何況fuchsia這個谷歌的備用還在那擺著,所以鴻蒙切入點在國內,以萬物互聯為主題是最佳發展方式。
個人比較喜歡鴻蒙的一些東西,也相信它一定會成功,或許3年或許更久,但是現在取代安卓是不可能的的,不過打破壟斷全新開源,重新定義5G萬物互聯時代,作為一個學生還是開了眼的。
2、相對與安卓來說全場景、分布式是鴻蒙OS2.0的最大優勢,鴻蒙OS2.0首先在分布式能力上經行了提升分布式軟匯流排、分布式數據管理、並提升了分布式安全能力,(手錶電視 汽車 中控外加美的九陽老闆電器)、EMUI11借鑒了鴻蒙的分布式技術,多屏協同。
3、GPL:谷歌曾提出影響開源世界最大的障礙就是GPL,GPL規定要求代碼使用者代碼衍生出來的東西永遠開源。谷歌為了隔離gpl的開源,提出了Apache(阿帕奇)協議,就是我開源你隨便。
谷歌把一個魔改後的linux作為內核封裝起來,中間加了一層類庫,讓其他所有部分對內核的調用,都像是兩個軟體之間的調用一樣,然後把所有涉及到GPL授權的代碼全部替換重寫,開源並以Apache協議授權。
這就導致linux社區不滿,因為它違反了Linux開源精神如果非強制會導致沒人願意開源,2012年安卓在linux分支樹上被永遠除名
話說回來要不是Apache哪裡來的EMUI Flyme Coloros,要是GPL的話那不是給人打工嗎。
4、安卓的linux內核包含了許可權管理,CPU指令適配、設備驅動等等
微內核簡單理解就是:裁剪了一下,更小了,手機平板手錶通用,手機攝像頭給手錶用,內核一樣,手機上有攝像頭的設備驅動,不同於wifi、藍牙華為可以通過分布式軟匯流排來實現信息的傳遞,這一步5G起到了關鍵作用。關於分布式軟匯流排的介紹在博客最後。
優勢1:靈活的全場景適用,不同屏幕大小、功耗和性能要求的設備可以靈活選擇,這樣一個應用就有可能在多個設備或者華為所說的全設備上運行,這對於5G萬物互聯來說非常方便
優勢2:安全,惡意代碼只能在某個模塊下運行,不再是宏內核整個root許可權下隨便運行
5、當前鴻蒙智慧屏上鴻蒙1.0是linux 鴻蒙 liteos三核並存,因為他生存初期必須要保證鴻蒙系統的可用性,他前期要兼容安卓,一點一點替換安卓的驅動等等,開源的世界有現成的就沒人會去造輪子。
6、對於鴻蒙的分布式,也就是軟硬體資源共享,其實是基於微內核的,宏內核要實現ipc通信就需要用戶空間進程調度到內核空間內核空間再到另一個用戶進程空間實現資源傳遞,宏內核的內核空間是共享的,所謂的新建一個進程可以說是只是說新建了自己獨立的用戶空間,這裡面的ipc通信效率目前來說是要比微內核的效率要高的,而華為的分布式ipc是要通過軟匯流排來實現的,如果藉助tcp來實現安全可以保證,但是協議繁瑣效率降低,這對於我們物聯網的交互來說是不可採取的,所以軟匯流排相當於一個魔改的tcp。
分布式軟匯流排將原本計算機網路通訊協議七層結構中的 表示層、會話層、傳輸層和網路層等協議精簡為一層 ,稱為 分布式軟匯流排的極簡協議 ,能提升有效載荷。
通過報文簡化、包頭簡化、交互簡化,基於應用場景的緩沖機制等方式,提升有效的傳輸負荷、解決傳統 TCP/IP 協議過於復雜的協議層次模型、層層增加包頭和解包,充分發揮物理通信通道的最大效能。
通過對協議的優化,分布式軟匯流排無線連接、高帶寬、低時延、低功耗、安全接入的優點。分布式軟匯流排實現小於20ms的低時延,端到端時延小於20ms,有效吞吐量達到1.2Gbps,抗丟包性達到25%, 高性能IPC將進程間的通信效率提升了5倍 。
簡單理解可以把它想像成優化的tcp更快實現資源共享。
❽ linux1.2.13內核網路棧實現源代碼分析 怎麼樣
這段時間一直在為畢業論文糾結,論文題目是關於Linux進程模塊的源代碼分析與研究。 以前拜讀過《操作系統設計與實現》,《Linux內核設計與實現》,《understanding the linux kernel 3rd》等等,桌面還有大把的網路下下來的資料。 初識這本書,是大三時候一位同學跟我提起,當時覺得還沒到閱讀源代碼的程度。一直到做這篇論文,在我最糾結的時候,忽然想起朋友說過這本書,於是下了電子版本。 理所當然,我完全被這本書吸引。 我難掩心中的激動,幾乎要歡呼起來,這何嘗不是一本可以當做小說閱讀的書籍! 這本書不像前兩本那樣,僅僅只是羅列出Linux的特性,數據結構,相關的技術等等,他是在帶領你去走進Linux源代碼的世界,順著代碼的調用,一路斬荊披棘,最後帶你到底目的地。途中雖然驚險,但一路過來,卻是充滿了趣味,更是享受到了智力上的成就感。 關於書的語言。 讀這本書,彷彿是你的好朋友就坐在你面前跟你講話,他把Linux源碼中的枯燥的理論跟生活中普遍的事物聯系起來,像進程的task_struct結構體,相當於我們的「戶口本」,進程轉換到"zombie」狀態,「進程死亡了無法幫自己注銷戶口登記,要父進程幫忙」等等,這些解釋非常地形象。所謂的大師也便是如此,用最通俗的語言把最深奧的道理講明白,我想,這本書的作者做到了。 此書的不足。 這本書也存在著不足之處。第一點,此書是2001年出版的,所以是以2.4版本的源代碼為基礎的,而現在已經長期停留在2.6版本了;第二是,書中的圖片嚴重不足,很多原理只要附加張圖片便能讓讀者明了,可是作者花了不少的篇幅去解釋而沒有附加圖片,這很讓人費解,或者這是因為錄入不是作者本人做的原因;第三,這跟很多國內書籍類似,沒有索引,查找代碼的講解是件很痛苦的事情。 距離這本書第一次出版已經有八年的時間了,希望作者能抽出時間再修訂,在此基礎上做2.6版本源代碼的分析。 這是我見過的國內比較好的真正用心去寫的計算機書籍,在此之前也只讀過一本關於匯編語言的書籍,作者是王爽。依稀還記得當年舍友都睡了的時候,一個人小心翼翼地趴在筆記本前仔細閱讀的情景,如今甚是懷念。 這是本好書。
❾ 《Linux內核精髓精通Linux內核必會的75個絕技》epub下載在線閱讀,求百度網盤雲資源
《Linux內核精髓》(Munehiro IKEDA)電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/1IkPuS83Etm-rDtH3TdgR3g
書名:Linux內核精髓
作者:Munehiro IKEDA
譯者:楊婷
豆瓣評分:7.0
出版社:機械工業出版社華章公司
出版年份:2013-3-1
頁數:424
內容簡介:
經過近20年的發展,Linux操作系統已經成為當今最成功的開源軟體之一,使用廣泛,影響深遠。隨著Linux操作系統功能的不斷豐富和完善,Linux內核的源代碼也從最初的幾萬行增加到如今的數百萬行,龐大無比,對於Linux內核的研究者和開發者而言,要系統研究Linux內核絕非易事。鑒於此,本書選取了Linux內核的資源管理(CPU、內存、進程等)、文件系統、網路、虛擬化、省電、調試、概要分析、追蹤、內核調整等核心主題進行了深入剖析和講解,總結出了75個能使讀者深刻理解Linux內核精髓的技巧和最佳實踐。
作者簡介
池田 宗廣(Munehiro IKEDA),大學時代,親眼看到X68000的gcc生成比主流編譯器還要快好幾倍的代碼,因此開始確信免費軟體/開源軟體的可能性。此後,在歷經咖啡店店員、生產技術人員、硬體工程師後,終於開始從事Linux內核開發。這個行業最吸引人的就是能夠跨公司甚至跨國界與世界最優秀的技術人員進行交流。現居住在美國,愛好音樂演奏,當過鼓手,也當過主唱,最近幾年一直在彈貝斯。不管是作為技術人員還是貝斯手都喜歡做幕後工作,只不過天生就不喜歡半途而廢。
❿ 一般優化linux的內核,需要優化什麼參數
作為高性能WEB伺服器,只調整Nginx本身的參數是不行的,因為Nginx服務依賴於高性能的操作系統。
以下為常見的幾個Linux內核參數優化方法。
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syn_retries
net.ipv4.tcp_synack_retries
net.ipv4.ip_local_port_range
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
對於tcp連接,服務端和客戶端通信完後狀態變為timewait,假如某台伺服器非常忙,連接數特別多的話,那麼這個timewait數量就會越來越大。
畢竟它也是會佔用一定的資源,所以應該有一個最大值,當超過這個值,系統就會刪除最早的連接,這樣始終保持在一個數量級。
這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7系統,你可以使用sysctl -a |grep tw_buckets來查看它的值,默認為32768,
你可以適當把它調低,比如調整到8000,畢竟這個狀態的連接太多也是會消耗資源的。
但你不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,
如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。
該參數的作用是快速回收timewait狀態的連接。上面雖然提到系統會自動刪除掉timewait狀態的連接,但如果把這樣的連接重新利用起來豈不是更好。
所以該參數設置為1就可以讓timewait狀態的連接快速回收,它需要和下面的參數配合一起使用。
該參數設置為1,將timewait狀態的連接重新用於新的TCP連接,要結合上面的參數一起使用。
tcp三次握手中,客戶端向服務端發起syn請求,服務端收到後,也會向客戶端發起syn請求同時連帶ack確認,
假如客戶端發送請求後直接斷開和服務端的連接,不接收服務端發起的這個請求,服務端會重試多次,
這個重試的過程會持續一段時間(通常高於30s),當這種狀態的連接數量非常大時,伺服器會消耗很大的資源,從而造成癱瘓,
正常的連接進不來,這種惡意的半連接行為其實叫做syn flood攻擊。
設置為1,是開啟SYN Cookies,開啟後可以避免發生上述的syn flood攻擊。
開啟該參數後,服務端接收客戶端的ack後,再向客戶端發送ack+syn之前會要求client在短時間內回應一個序號,
如果客戶端不能提供序號或者提供的序號不對則認為該客戶端不合法,於是不會發ack+syn給客戶端,更涉及不到重試。
該參數定義系統能接受的最大半連接狀態的tcp連接數。客戶端向服務端發送了syn包,服務端收到後,會記錄一下,
該參數決定最多能記錄幾個這樣的連接。在CentOS7,默認是256,當有syn flood攻擊時,這個數值太小則很容易導致伺服器癱瘓,
實際上此時伺服器並沒有消耗太多資源(cpu、內存等),所以可以適當調大它,比如調整到30000。
該參數適用於客戶端,它定義發起syn的最大重試次數,默認為6,建議改為2。
該參數適用於服務端,它定義發起syn+ack的最大重試次數,默認為5,建議改為2,可以適當預防syn flood攻擊。
該參數定義埠范圍,系統默認保留埠為1024及以下,以上部分為自定義埠。這個參數適用於客戶端,
當客戶端和服務端建立連接時,比如說訪問服務端的80埠,客戶端隨機開啟了一個埠和服務端發起連接,
這個參數定義隨機埠的范圍。默認為32768 61000,建議調整為1025 61000。
tcp連接的狀態中,客戶端上有一個是FIN-WAIT-2狀態,它是狀態變遷為timewait前一個狀態。
該參數定義不屬於任何進程的該連接狀態的超時時間,默認值為60,建議調整為6。
tcp連接狀態里,有一個是established狀態,只有在這個狀態下,客戶端和服務端才能通信。正常情況下,當通信完畢,
客戶端或服務端會告訴對方要關閉連接,此時狀態就會變為timewait,如果客戶端沒有告訴服務端,
並且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時需要該參數來判定。
比如客戶端已經斷網了,但服務端上本次連接的狀態依然是established,服務端為了確認客戶端是否斷網,
就需要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值為7200秒,建議設置為30秒。
該參數和上面的參數是一起的,服務端在規定時間內發起了探測,查看客戶端是否在線,如果客戶端並沒有確認,
此時服務端還不能認定為對方不在線,而是要嘗試多次。該參數定義重新發送探測的時間,即第一次發現對方有問題後,過多久再次發起探測。
默認值為75秒,可以改為3秒。
第10和第11個參數規定了何時發起探測和探測失敗後再過多久再發起探測,但並沒有定義一共探測幾次才算結束。
該參數定義發起探測的包的數量。默認為9,建議設置2。
設置和範例
在Linux下調整內核參數,可以直接編輯配置文件/etc/sysctl.conf,然後執行sysctl -p命令生效