本文轉載自北風之神大佬的文章,經大佬同意在此轉發
原文連結:segmentfault.com/a/119000003887837...
程式的網路相關知識請與大佬聊,我只是轉發!!!
先以redis為例解釋一下一個程式執行時它的網路資料【其它網路程式也是如此】
1 redis-server 是個什麼檔案
2 redis-server 執行時能呼叫的函式庫
3 redis-server 啟動時
4 執行redis-servrer呼叫execve函式
5 載入linux 的函式庫檔案【當然它會載入所有引入的函式庫,只能只截圖一張】
你可以清晰的看到它會讀取elf檔案,因為函式庫即.so它也是elf檔案的一種。
6 redis 程式關係
7 啟動服務後,程式建立/開啟了哪些檔案【在linux中不管管道檔案,socket檔案,目錄,epoll函式建立的控制程式碼他們都稱為檔案】
PS:列印列出的COMMAND,PID,FD,USER,NAME啥意思?我怎麼百度不到??? 在linux中你man lsof 就可以看到解釋了,小朋友
8 程式記憶體資料檢視
9 程式的內部網路資料
各個檔案的含義
網路狀態st欄位說明
10的十六進位制就是A
監聽socket的相關狀態
redis程式使用監聽socket情況
10 accept 後 【你們喜歡稱為客戶端連線】客戶端的連線【檔案】長啥樣?
它的連線狀態為ESTABLEISH =1 ,大家可以看一下相關資料即TCP狀態轉移與三次握手的關係,我就沒有必要在這裡說了。
當它接收到客戶端連線後,就會生成一個檔案,並且該檔案是有相應的資料的,畢竟它只是一個網路連線,如網路狀態,對端地址,對應的node結點等資料,以及收發相關的緩衝區,
11 程式啟動後在做什麼
程式執行後能建立多少個檔案【它能支援多少個客戶端連線】
一般來說程式會動態的修改程式資源限制【如setrlimit函式呼叫後可進行修改,php就是posix_setrlimit】
下面拿php網路程式【跟語言沒有關係】測試
它已經建立的檔案
當我修改open files 為6時,啟動
此時它已經影響到bash程式了。
再調整引數
大家可以看到,當我設定為5後,它就不能再建立更多的檔案了【socket 網路連線accept函式呼叫時會建立檔案並返回fd】
產生too open many fiels的錯誤[除了系統的限制之外,當系統資源緊張時也有可能產生此類問題,導致的結果就是無法再接收更多的客戶端連線,而這個客戶端連線只是一個網路連線socket檔案]
除了這些因素,還有Linux的相關配置引數,file-max,ulimit,open files。
本作品採用《CC 協議》,轉載必須註明作者和本文連結