too many open files 與程式網路連線資料檢視[轉載自北風之神巨佬的文章]

mmmm發表於2021-01-26

本文轉載自北風之神大佬的文章,經大佬同意在此轉發
原文連結:segmentfault.com/a/119000003887837...
程式的網路相關知識請與大佬聊,我只是轉發!!!
先以redis為例解釋一下一個程式執行時它的網路資料【其它網路程式也是如此】

1 redis-server 是個什麼檔案
圖片.png

2 redis-server 執行時能呼叫的函式庫
圖片.png

3 redis-server 啟動時
圖片.png

4 執行redis-servrer呼叫execve函式
圖片.png

5 載入linux 的函式庫檔案【當然它會載入所有引入的函式庫,只能只截圖一張】
圖片.png
你可以清晰的看到它會讀取elf檔案,因為函式庫即.so它也是elf檔案的一種。
6 redis 程式關係
圖片.png

圖片.png
圖片.png

7 啟動服務後,程式建立/開啟了哪些檔案【在linux中不管管道檔案,socket檔案,目錄,epoll函式建立的控制程式碼他們都稱為檔案】
圖片.png

PS:列印列出的COMMAND,PID,FD,USER,NAME啥意思?我怎麼百度不到??? 在linux中你man lsof 就可以看到解釋了,小朋友
圖片.png
圖片.png
圖片.png
圖片.png

8 程式記憶體資料檢視
圖片.png
圖片.png

9 程式的內部網路資料
圖片.png
各個檔案的含義
圖片.png
圖片.png

網路狀態st欄位說明
圖片.png
10的十六進位制就是A

監聽socket的相關狀態
圖片.png

redis程式使用監聽socket情況
圖片.png

10 accept 後 【你們喜歡稱為客戶端連線】客戶端的連線【檔案】長啥樣?
圖片.png

圖片.png
圖片.png
圖片.png
它的連線狀態為ESTABLEISH =1 ,大家可以看一下相關資料即TCP狀態轉移與三次握手的關係,我就沒有必要在這裡說了。
當它接收到客戶端連線後,就會生成一個檔案,並且該檔案是有相應的資料的,畢竟它只是一個網路連線,如網路狀態,對端地址,對應的node結點等資料,以及收發相關的緩衝區,

11 程式啟動後在做什麼
圖片.png

程式執行後能建立多少個檔案【它能支援多少個客戶端連線】
圖片.png

一般來說程式會動態的修改程式資源限制【如setrlimit函式呼叫後可進行修改,php就是posix_setrlimit】

下面拿php網路程式【跟語言沒有關係】測試
圖片.png

它已經建立的檔案
圖片.png

當我修改open files 為6時,啟動
圖片.png
此時它已經影響到bash程式了。

再調整引數
圖片.png

圖片.png
圖片.png

大家可以看到,當我設定為5後,它就不能再建立更多的檔案了【socket 網路連線accept函式呼叫時會建立檔案並返回fd】
產生too open many fiels的錯誤[除了系統的限制之外,當系統資源緊張時也有可能產生此類問題,導致的結果就是無法再接收更多的客戶端連線,而這個客戶端連線只是一個網路連線socket檔案]

除了這些因素,還有Linux的相關配置引數,file-max,ulimit,open files。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章