linux系统配置了limits.conf为何不生效?
最近在做一个物联网的项目,项目刚开始没什么问题,但设备越来越多,服务经常出现too many open files的错误提示。
本身就是个程序猿,对运维这块也不太熟悉。
按网上的文章打开/etc/security/limits.conf文件,添加以上两行:
* soft nofile 65535
* hard nofile 65535
也确认过以下文件是有配置 session required pam_limits.so
/etc/pam.d/login
/etc/pam.d/system-auth
/etc/pam.d/sshd
也确认过/etc/ssh/sshd_config文件配置UsePAM=yes
重启系统,运行命令ulimit -n显示出来的数量也对了,就以为生效了。
然而问题依旧!
原来查看进程的文件句柄限制是通过以下命令来查看:
cat /proc/<pid>/limits
实际进程还是按原来系统默认的1024个。
几经折腾,找到原来在系统后台服务是可以设置最大文件句柄数量的,比如nginx的:
打开/lib/systemd/system/nginx.service文件,添加:
LimitNOFILE=65535
systemctl daemon-reload
再重启一下服务,再通过cat /proc/<pid>/limits命令查看,已经生效。
另外临时修改进程的最大文件句柄数量可以用以下命令:
prlimit --pid ${pid} --nofile=65535:65535
另外影响最大打开文件句柄数量的还有/etc/sysctl.conf文件的配置:
fs.file-max = 102400 #内核可分配的最大文件数
fs.nr_open = 1048576 #单个进程可分配的最大文件数
fs.inotify.max_user_instances = 65535 #每个用户最大可创建inotify instances数量
fs.inotify.max_user_watches = 102400 #每个用户可同时添加的watch数量
运行sysctl -p或重启系统生效。