linux句柄泄露問(wèn)題查看
背景:
我們?cè)陂_(kāi)發(fā)linux在線服務(wù)器的時(shí)候經(jīng)常會(huì)遇會(huì)句柄泄露的問(wèn)題。因?yàn)樵趌inux系統(tǒng)設(shè)計(jì)里面遵循一切都是文件的原則,即磁盤(pán)文件、目錄、網(wǎng)絡(luò)套接字、磁盤(pán)、管道等,所有這些都是文件,在我們進(jìn)行打開(kāi)的時(shí)候會(huì)返回一個(gè)fd,即是文件句柄。如果頻繁的打開(kāi)文件,或者打開(kāi)網(wǎng)絡(luò)套接字而忘記釋放就會(huì)有句柄泄露的現(xiàn)象。在linux系統(tǒng)中對(duì)進(jìn)程可以調(diào)用的文件句柄數(shù)進(jìn)行了限制,在默認(rèn)情況下每個(gè)進(jìn)程可以調(diào)用的最大句柄數(shù)是1024個(gè),如果超過(guò)了這個(gè)限制,進(jìn)程將無(wú)法獲取新的句柄,而從導(dǎo)致不能打開(kāi)新的文件或者網(wǎng)絡(luò)套接字,對(duì)于線上服務(wù)器即會(huì)出現(xiàn)服務(wù)被拒絕的情況。
查看與修改句柄:
在linux系統(tǒng)中可以通過(guò)ulimit–n查看每個(gè)進(jìn)程限制的最大句柄數(shù),通過(guò)ulimit –HSn 10240修改進(jìn)程的最大句柄數(shù)。當(dāng)句柄數(shù)目達(dá)到限制后,就回出現(xiàn)”too many files open”。
查看進(jìn)程占用的句柄數(shù)有幾種辦法:
1) 通過(guò)cat/proc/pid/fd可以查看線程pid號(hào)打開(kāi)的線程;
2) 通過(guò)lsof命令, /usr/sbin/lsof-p 21404 命令結(jié)果如下:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vas 21404 root cwd DIR 8,3 4096 30195729 /home/users/root/vas
vas 21404 root rtd DIR 8,2 4096 2 /
vas 21404 root txt REG 8,3 112201650 30195914 /home/users/root/vas
vas 21404 root mem REG 0,0 0 [heap] (stat: No such file or directory)
vas 21404 root mem REG 8,2 105080 339377 /lib64/ld-2.3.4.so
vas 21404 root mem REG 8,2 1493186 339367 /lib64/tls/libc-2.3.4.so
vas 21404 root mem REG 8,2 17943 339392 /lib64/libdl-2.3.4.so
vas 21404 root mem REG 8,2 613297 339369 /lib64/tls/libm-2.3.4.so
vas 21404 root mem REG 8,2 79336 490463 /usr/lib64/libz.so.1.2.1.2
COMMAND:進(jìn)程的名稱
PID:進(jìn)程標(biāo)識(shí)符
USER:進(jìn)程所有者
FD:文件描述符,應(yīng)用程序通過(guò)文件描述符識(shí)別該文件。如 cwd、txt等
TYPE:文件類(lèi)型,如 DIR、REG、IPV4、FIEO等
DEVICE:指定磁盤(pán)的名稱
SIZE:文件的大小
NODE:索引節(jié)點(diǎn)(文件在磁盤(pán)上的標(biāo)識(shí))
NAME:打開(kāi)文件的確切名稱
另外通lsof命令也可以查看占用端口的進(jìn)程:
/usr/sbin/lsof-i :9001
原文鏈接:http://blog.csdn.net/daofengliu/article/details/38171953