在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重新登錄