“Too many open files” – 合理配置Linux同时可打开文件句柄数限制及lsof命令使用
今天一上班就看到一来自性能测试组的一个系统错误报告,Linux系统下的应用在压力下会出现”Too many open files”的错误并导致服务停止。其中这是老问题,就是需要合理配置Linux同时可打开文件句柄数限制。当然,如果应用程序有bug,滥用资源是另一个问题了。
Linux把大部分资源都会虚拟成文件,象打开网络连接也都会占用文件句柄,Linux的默认限制一般是1024,这个限制对一般个人使用是没有问题的,但对一个特殊应用或都在大并发访问下是不够的。
可以通过ulimit -n来配置文件句柄数限制值,比如配置为8192,命令为
ulimit -n 8192
但这种配置方法在系统重启动后会恢复为默认值,如果希望是永久改变,可以按下面步骤完成。
1. 以 root 用户身份登录。如果不具有 root 用户访问权,则继续前需要获得此访问权。
2. 切换至 /etc 目录。
3. 使用 vi 编辑器来编辑 /etc 目录中的 initscript 文件。如果此文件不存在,请输入 vi initscript 来创建该文件。
要点: 如果决定增加文件句柄数,则机器上一定不能存在空的 initscript 文件,否则,下次将不能引导机器。
4. 在第一行中输入 ulimit -n 4096(此处的关键是数目要远大于 1024,1024 是大多数 Linux 机器上的缺省值)。
警告:不要将此值设置得太大,因为它可能严重影响系统范围内的性能。
5. 在第二行中输入 eval exec “$4″。
6. 确保完成了步骤 4 和 5 后,保存并关闭该文件。
要点: 请确保正确遵循了这些步骤,因为如果未正确执行这些步骤,则将导致不能引导机器。
7. (可选)通过修改 etc/security 目录中的 limits.conf 文件来限制用户或组。缺省情况下,SuSE Linux Enterprise Server(SLES) 和 Red Hat Enterprise Linux都具有此文件。如果由于某种原因而缺少此文件,则可能需要考虑在步骤 4 中使用一个更保守的数值,例如 2048。需要执行此操作,以便大多数用户对每个进程所允许打开的文件数都有合理的较低限制。如果在步骤 4 中使用了一个相对较低的数值,则执行此操作不是特别重要。但是,如果在步骤 4 中选择了设置一个较大的数值,则不执行此操作就可能严重影响机器的性能。
以下显示了一个样本 limits.conf 文件的情况,它会限制所有用户,然后又对其他内容设置不同限制。此样本假定您在上面的步骤 4 中使用了数值 8192。
* soft nofile 1024
* hard nofile 2048
root soft nofile 4096
root hard nofile 8192
user1 soft nofile 2048
user1 hard nofile 2048
注意,以上示例中的 * 用于首先设置所有用户的限制。这些限制低于后面的限制。root 用户将打开更高数目的可允许描述符,而 user1 的限制将介于这两者之间。进行修改前,请务必阅读并理解 limits.conf 文件中所包含的文档。
(以上步骤引自IBM帮助文档)
如果想查看文件句柄的具体使用情况,可以使用lsof命令,给几个例子:
1. 查看某进程(pid)在使用的文件
lsof -p pid
2. 查找谁在使用某个文件
lsof /var/run/sendmail.pid
3. 查找监听端口25的进程
lsof -i :25
呵呵,功能还是很强大的。
相关文章:

老兄请教你个问题,麻烦看到后回复,我这里有个服务器,其中运行的站每天大概有15W的IP,100M带宽跑几乎满,nginx的日志一直出现,too many open files,导致页面访问出现500。
环境是ubuntu10.04+nginx+mysql+php+memcached
其中我做了如下工作:
修改了/etc/security/limits.conf
增加
* soft noproc 1024000
* hard noproc 1024000
* soft nofile 1024000
* hard nofile 1024000
另外也在/etc/profile文件中增加了ulimit -n 1024000
也运行了ulimit -n 1024000命令
可是依旧出现too many open files错误
把1024000的数值调低老兄有没什么高招,求教,再次感谢了