先以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。