查看進程打開的文件句柄個數(yum install -y lsof)
lsof -p pid |wc -l
查看進程打開的socket句柄個數
lsof -p 25973 | grep TCP|wc -l
ulimit -a 用來顯示當前的各種用戶進程限制,注意是當前用戶,而且要root
ulimit -n 無法設置超過操作系統支持的最大文件句柄個數
/proc/sys/fs/nr_open 默認1048576 ulimit -n 設置不能超過nr_open這個值, 可以修改 echo 6553560 > /proc/sys/fs/nr_open 臨時修改,logout之後就不生效了
永久修改進程打開文件最大值限制:
echo fs.nr_open = 16000000 >> /etc/sysctl.conf
sysctl -p #不需要重啓就可以生效,注意我沒有修改fs.file-max,如果要修改的話,網上說: soft limit < hard limit < nr_open < file-max(可以非常大,和內存大小相關)
修改/etc/security/limits.conf可以對所有用戶永久生效,修改後不需要重啓,logout再重新登錄就生效了(重啓當然也生效)
只有root用戶纔有權限修改/etc/security/limits.conf,對於非root用戶, /etc/security/limits.conf會限制ulimit -n,但是限制不了root用戶,對於非root用戶,ulimit -n設置一次之後,只能越設置越小,root用戶則無限制
(在 init.d 中啓用的進程,或者daemons運行的進程並不生效),需要修改 /etc/systemd/system.conf(主要用於systemd service的資源限制)以後必須使用daemon-reexec
root soft nofile 1048576 #有些ubantu系統設置了*還要設置下root,否則root 不生效,centos7.5沒有這個問題
root hard nofile 1048576 #硬件的限制,默認最大值好像是4096,如果沒有調大這個值,soft nofile沒辦法加大
* soft nofile 1048570 #* 表示所有用戶 不能超過系統的nr_open大小(如果不修改nr_open,默認是1048576,你哪怕設置1048577,logout後無法再進系統)
* hard nofile 1048570 #有些帖子說這個值一旦設置了就不能改了,至少我在虛擬機上是可以反覆修改的
#!/bin/bash
if [ $# != 1 ];then
echo "Error:need 1 arg num"
echo "\"sudo ./fd_limit 4096\""
exit 1
fi
fd_limit=1024
if [ $1 -gt 0 ] 2>/dev/null;then
fd_limit=$1
else
echo "Error:invalid arg type"
echo "\"sudo ./fd_limit 4096\""
exit 1
fi
if [[ $EUID -ne 0 ]]; then
echo "Error:This script must be run as root!" 1>&2
echo "\"sudo ./fd_limit 4096\""
exit 1
fi
echo "set fd limit to ${fd_limit}"
nr_open=$(cat /proc/sys/fs/nr_open)
if [ ${nr_open} -gt 0 ] 2>/dev/null;then
nr_open=$nr_open
else
echo "/proc/sys/fs/nr_open is not number"
exit 1
fi
if [ ${fd_limit} -gt ${nr_open} ];then
echo "limit > nr_open, update"
echo "updating /etc/sysctl.conf"
sudo sh -c "echo fs.nr_open = ${fd_limit} >> /etc/sysctl.conf"
echo "updated /etc/sysctl.conf"
echo "reading values"
sudo sysctl -p
echo "read values end"
else
echo "limit <= nr_open, skip"
fi
echo "updating /etc/security/limits.conf"
sudo echo "
* hard nofile ${fd_limit}
* soft nofile ${fd_limit}
root hard nofile ${fd_limit}
root soft nofile ${fd_limit}
" >> /etc/security/limits.conf
echo "updated /etc/security/limits.conf"
echo "end"
echo "re-login to make it effective"