Ulimit的设置

前天,一台数据服务器突然间失去响应。好在数据有从库备份,游戏切维护模式20分钟,将数据库指向从库来提供服务,没有出现玩家反馈数据丢失的情况。出问题的机器联系机房手动重启了。

重启之后,再启动php-fpm的时候,发现报错:

[26-Nov-2011 01:19:24] WARNING: [pool www] child 16101 said into stderr: “[26-Nov-2011 01:19:24] ERROR: [pool www] setrlimit(RLIMIT_NOFILE, 65535) failed (1): Operation not permitted (1)”

这是因为在php-fpm的配置文件中有如下的设置:

rlimit_files=65535

而查看系统的ulimit设置,发现系统的文件句柄限制是1024:

$ ulimit -n
65535

设置ulimit的命令如下,但是直接在shell中执行时会报错:

$ ulimit -SHn 65535
-bash: ulimit: open files: cannot modify limit: Operation not permitted

搜索之后找到了答案:

shell里不能直接更改,是因为登录的时候pam已经从limits.conf中设置了上限,ulimit命令只能在低于上限的范围内发挥了。

解决方法是先修改 /etc/security/limits.conf,加入下面两行:

* soft nofile 65535
* hard nofile 65535

soft是指软限制,即达到这个数目之后会报warning,而hard则是指系统实际的限制。
退出shell之后重新登陆,再执行ulimit -SHn 65535就不会报错了。

via

Comments