Too many open files 問題解決

在Linux下,我們使用ulimit -n命令可以看到單個(gè)進(jìn)程能夠打開的最大文件句柄數(shù)量(socket連接也算在里面)。系統(tǒng)默認(rèn)值1024。對(duì)于一般的應(yīng)用來說(象Apache、系統(tǒng)進(jìn)程)1024完全足夠使用。但是如何象squid、mysql、java等單進(jìn)程處理大量請(qǐng)求的應(yīng)用來說就有點(diǎn)捉襟見肘了如果單個(gè)進(jìn)程打開的文件句柄數(shù)量超過了系統(tǒng)定義的值,就會(huì)提到“too many files open”的錯(cuò)誤提示。

知識(shí)學(xué)習(xí)

查看系統(tǒng)默認(rèn)的最大文件句柄梳理

查看Linux系統(tǒng)默認(rèn)的最大文件句柄數(shù),系統(tǒng)默認(rèn)是1024。

# ulimit -n
1024

查看Linux系統(tǒng)默認(rèn)的最大文件句柄數(shù)詳細(xì)說明

# ulimit -a
core file size          (blocks, -c) 0  
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 30  
file size               (blocks, -f) unlimited  
pending signals                 (-i) 30605  
max locked memory       (kbytes, -l) 40000  
max memory size         (kbytes, -m) unlimited  
open files                      (-n) 1024
    
pipe size            (512 bytes, -p) 8  
POSIX message queues     (bytes, -q) 819200  
real-time priority              (-r) 65  
stack size              (kbytes, -s) 8192  
cpu time               (seconds, -t) unlimited  
max user processes              (-u) 30605  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited 

查看某個(gè)應(yīng)用的進(jìn)程PID

# ps aux| grep mysql 
mysql     5474  0.0  0.6 8704208 396136 ?      Sl    7?26 156:54 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock
root      8199  0.0  0.0  14096   968 pts/3    S+   14:24   0:00 grep --color=auto mysql

查看某個(gè)進(jìn)程打開的文件句柄數(shù)量

# lsof -n | grep 5474 -c
6480

其他命令

#進(jìn)程句柄
ll /proc/pid/fd
#統(tǒng)計(jì)進(jìn)程句柄數(shù)
ll /proc/pid/fd|wc -l
----查看當(dāng)前進(jìn)程打開了多少句柄數(shù)

# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

131 24204 

57 24244  

57 24231   ........

其中第一列是打開的句柄數(shù),第二列是進(jìn)程ID。

可以根據(jù)ID號(hào)來查看進(jìn)程名。

# ps aef|grep 24204

nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

查看系統(tǒng)所有進(jìn)程以及各進(jìn)程打開的文件句柄數(shù)量

root@ubuntu:~# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
 100015 24446
  73220 10515
  30618 27008
  30618 26943
  28130 27187
  22176 19084
  15565 26891
  13685 4083
   9360 24143
   9000 19529
   7440 16600
   6480 5474
   6250 18940
   4158 13083
   3869 14017
   1798 18817
    252 14497
    189 31639
    108 29620
     92 625
     86 10695
     86 10685
     86 10678
      3 92
      3 91
      3 10
      1 PID
root@ubuntu:~# 

第一列是打開的句柄數(shù),第二列是進(jìn)程號(hào)
如果想分頁(yè)展示的話可以使用lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more命令

查看單個(gè)進(jìn)程的詳細(xì)信息

# ps -aef|grep 24446
root      8302  8165  0 14:31 pts/3    00:00:00 grep --color=auto 24446
root     24446     1  0 10?23 ?       02:04:39 java -Xms128M -Xmx2G -Djava.ext.dirs=/iflytek/skynet/lib:/iflytek/skynet/plugin/engine/lib: -Dfile.encoding=UTF-8 -Dcluster_group_name=skynet -Duser.timezone=GMT+0800 -Dzookeeper_servers=10.1.186.101:2181 -Dzookeeper_sessionTimeout=20000 -Dzookeeper_connectionTimeout=5000 -DSKYNET_HOME=/iflytek/skynet -DVERSION=1.3.1-SNAPSHOT -Djava.library.path=.:../lib/sigar -jar /iflytek/skynet/plugin/xmanager/lib/skynet-xmanager-1.3.1-SNAPSHOT.jar --address= --port=

解決方案

環(huán)境變量

編輯/etc/profile文件,在文件尾部添加

# vim /etc/profile

ulimit -c unlimited  
ulimit -u 10000  
ulimit -n 102400  
ulimit -m unlimited  
ulimit -s unlimited  
ulimit -v unlimited
ulimit -t unlimited

ulimit -c unlimited 將設(shè)定core文件的最大值,單位為區(qū)塊,大小不限制
ulimit -u 10000 將某linux用戶的最大進(jìn)程數(shù)設(shè)為10000個(gè)
ulimit -n 102400 將每個(gè)進(jìn)程可以打開的文件數(shù)目加大到102400
ulimit -m unlimited 最大內(nèi)存大小不限制
ulimit -s unlimited 堆棧大小不限制
ulimit -v unlimited 虛擬內(nèi)存不限制
ulimit -t unlimited CPU 時(shí)間不限制

系統(tǒng)配置

編輯/etc/security/limits.conf文件,在文件尾部添加

# vim /etc/security/limits.conf

*        soft    noproc  10240
*        hard    noproc  10240
*        soft    nofile  10240
*        hard    nofile  10240
root     soft    noproc  10240
root     hard    noproc  10240
root     soft    nofile  10240
root     hard    nofile  10240

對(duì)于ubuntu操作系統(tǒng),必須設(shè)置最后四行,否則不生效
修改完了,要退出終端,重新打開xshell重新登錄

系統(tǒng)最大文件句柄數(shù)

編輯/etc/sysctl.conf文件,在文件尾部添加

fs.file-max=655350

運(yùn)行命令/sbin/sysctl -p 使配置生效

fs.file-max=655350 #限制整個(gè)系統(tǒng)最大文件句柄數(shù)
修改完了,要退出終端,重新打開xshell重新登錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容