too many open files 與進(jìn)程網(wǎng)絡(luò)連接數(shù)據(jù)查看
先以redis為例解釋一下一個(gè)進(jìn)程運(yùn)行時(shí)它的網(wǎng)絡(luò)數(shù)據(jù)【其它網(wǎng)絡(luò)程序也是如此】
1 redis-server 是個(gè)什么文件
2 redis-server 運(yùn)行時(shí)能調(diào)用的函數(shù)庫(kù)
3 redis-server 啟動(dòng)時(shí)
4 運(yùn)行redis-servrer調(diào)用execve函數(shù)
5 加載linux 的函數(shù)庫(kù)文件【當(dāng)然它會(huì)加載所有引入的函數(shù)庫(kù),只能只截圖一張】
你可以清晰的看到它會(huì)讀取elf文件,因?yàn)楹瘮?shù)庫(kù)即.so它也是elf文件的一種。
6 redis 進(jìn)程關(guān)系


7 啟動(dòng)服務(wù)后,進(jìn)程創(chuàng)建/打開(kāi)了哪些文件【在linux中不管管道文件,socket文件,目錄,epoll函數(shù)創(chuàng)建的句柄他們都稱(chēng)為文件】
PS:打印列出的COMMAND,PID,FD,USER,NAME啥意思?我怎么百度不到???在linux中你man lsof 就可以看到解釋了,小朋友



8 進(jìn)程內(nèi)存數(shù)據(jù)查看

9 進(jìn)程的內(nèi)部網(wǎng)絡(luò)數(shù)據(jù)
各個(gè)文件的含義

網(wǎng)絡(luò)狀態(tài)st字段說(shuō)明
10的十六進(jìn)制就是A
監(jiān)聽(tīng)socket的相關(guān)狀態(tài)
redis進(jìn)程使用監(jiān)聽(tīng)socket情況
10 accept 后 【你們喜歡稱(chēng)為客戶(hù)端連接】客戶(hù)端的連接【文件】長(zhǎng)啥樣?



它的連接狀態(tài)為ESTABLEISH =1 ,大家可以看一下相關(guān)資料即TCP狀態(tài)轉(zhuǎn)移與三次握手的關(guān)系,我就沒(méi)有必要在這里說(shuō)了。
當(dāng)它接收到客戶(hù)端連接后,就會(huì)生成一個(gè)文件,并且該文件是有相應(yīng)的數(shù)據(jù)的,畢竟它只是一個(gè)網(wǎng)絡(luò)連接,如網(wǎng)絡(luò)狀態(tài),對(duì)端地址,對(duì)應(yīng)的node結(jié)點(diǎn)等數(shù)據(jù),以及收發(fā)相關(guān)的緩沖區(qū),
11 進(jìn)程啟動(dòng)后在做什么
進(jìn)程運(yùn)行后能創(chuàng)建多少個(gè)文件【它能支持多少個(gè)客戶(hù)端連接】
一般來(lái)說(shuō)程序會(huì)動(dòng)態(tài)的修改進(jìn)程資源限制【如setrlimit函數(shù)調(diào)用后可進(jìn)行修改,php就是posix_setrlimit】
下面拿php網(wǎng)絡(luò)程序【跟語(yǔ)言沒(méi)有關(guān)系】測(cè)試
它已經(jīng)創(chuàng)建的文件
當(dāng)我修改open files 為6時(shí),啟動(dòng)
此時(shí)它已經(jīng)影響到bash進(jìn)程了。
再調(diào)整參數(shù)


大家可以看到,當(dāng)我設(shè)置為5后,它就不能再創(chuàng)建更多的文件了【socket 網(wǎng)絡(luò)連接accept函數(shù)調(diào)用時(shí)會(huì)創(chuàng)建文件并返回fd】
產(chǎn)生too open many fiels的錯(cuò)誤[除了系統(tǒng)的限制之外,當(dāng)系統(tǒng)資源緊張時(shí)也有可能產(chǎn)生此類(lèi)問(wèn)題,導(dǎo)致的結(jié)果就是無(wú)法再接收更多的客戶(hù)端連接,而這個(gè)客戶(hù)端連接只是一個(gè)網(wǎng)絡(luò)連接socket文件]
除了這些因素,還有Linux的相關(guān)配置參數(shù),file-max,ulimit,open files。
