查看进程打开的文件句柄个数(yum install -y lsof)
lsof -p pid |wc -l
查看进程打开的socket句柄个数
lsof -p 25973 | grep TCP|wc -l
ulimit -a 用来显示当前的各种用户进程限制,注意是当前用户,而且要root
ulimit -n 无法设置超过操作系统支持的最大文件句柄个数(查看系统支持的最大文件句柄个数: cat /proc/sys/fs/file-max )
/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 echo "vm.max_map_count=262144" >> /etc/sysctl.conf
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
sudo echo "
* soft nproc 4096
* hard nproc 4096
" >> /etc/security/limits.conf
echo "updated /etc/security/limits.conf"
echo "end"
echo "re-login to make it effective"
运行:
./set.sh 16000000 (参数是你要设置的最大nr_open)