最近在一个较大规模的项目里,需要引入nginx作为反向代理层。为了防止可用文件描述符成为瓶颈,需要先对系统整体情况做一个把握。由于linux将普通文件、socket、pipe等都看作文件,故这里的限制是对系统内的各种类型文件的限制。

操作系统对fd的限制

单进程限制

通过ulimit -n 能看到当前用户每个进程允许打开的文件描述符个数。

通过ulimit -n [limitnum] 可以改变可用描述符个数。如果操作失败,则可能是因为系统配置文件里,对资源做了限制,在/etc/security/limits.conf查看有没有针对指定用户或所有用户的设置。修改或添加,并重新登录系统即可生效。

系统整体限制

cat /proc/sys/fs/file-max 可以看到这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)的文件个数,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

cat /proc/sys/fs/file-nr 可以看到文件描述符现状,3列数字分别是: the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles。

这里可以看到,系统进程间也是有描述符竞争关系的。

 

另外,由于操作系统有fd取值范围,若没有可用值了,也会导致tcp连接失败。

通过sysctl -a | grep net.ipv4.ip_local_port_range可以看到fd取值范围。修改/etc/sysctl.conf并执行sysctl -p,可修改该范围:

加入:net.ipv4.ip_local_port_range = 1024 65000。

 

另外,iptable的ip_conntrack_max也可以会有影响,修改方法类似ip_local_port_range。

硬件对fd的限制

todo

nginx对fd的限制

nginx core_module有worker_rlimit_nofile,也是对单进程可用描述符的限制,不可以超过系统ulimit -n的值。

—————————————————————————————-

/etc/security/limits.conf 限制

如果你碰到类似的错误提示
ulimit: max user processes: cannot modify limit: 不允许的操作
ulimit: open files: cannot modify limit: 不允许的操作

为啥root用户是可以的?普通用户又会遇到这样的问题?
看一下/etc/security/limits.conf大概就会明白。
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。

在limits.conf加上
*        soft    noproc  10240
*        hard    noproc  10240
*        soft    nofile  10240
*        hard    nofile  10240
就是限制了任意用户的最大线程数和文件数为10240。退出后重新登录就可以了。

—————————————————————————————-

Leave a Reply