Linux高并发socket最大连接数限制


发布于 2015-12-20 / 66 阅读 / 0 评论 /
系统为每个TCP连接都要创建一个socket句柄,而每个socket句柄也是一个文件句柄。

可用于socket连接的文件数大概是文件句柄数减10,也就是TCP最大并发连接数。

1.文件句柄限制

文件句柄有系统级别和用户级别限制。

1.1.系统级别文件句柄限制

表示系统最多允许同时打开文件数,即包含所有用户打开文件数总和。

通过“cat /proc/sys/fs/file-max”命令查看。默认值为内存大小(KB)的10%,计算方法“grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}' ”。

设置方式分为临时性和永久性设置

临时性设置:例如通过命令“echo 1000000 > /proc/sys/fs/file-max”进行设置。

永久性设置:永久有效,在/etc/sysctl.conf中设置。例如“fs.file-max = 1000000”。

1.2.用户级别文件句柄限制

表示系统对用户单一进程同时可打开文件数量有限制。

用户级别连接数限制又分为软限制和硬限制:

软限制:指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数。通过“ulimit -n”命令查看。

硬限制:根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。通过“ulimit -Hn”命令查看。超过硬限制则会告警。

设置方式有临时性设置和永久性设置。

临时性有三种方法:

通过“ulimit -Sn”设置软限制,例如“ulimit -Sn 160000”。软限制必须小于硬限制。

通过“ulimit -Hn”命令设置硬限制,例如“ulimit -Hn 160000”。

同时设置软限制和硬限制,例如“ulimit -n 180000”。

永久性设置需要在root权限下,配置/etc/security/limits.conf文件。例如下图:

如上图所示。配置文件有四列:

(1)第一列:表示用户和组(@开头)。

(2)第二列:表示软限制还是硬限制。

(3)第三列:表示限制的资源类型。core是内核文件,nofile是文件描述符,noproc是进程…

(4)第四列:表示限制的值。

限制资源使用的配置文件是 /etc/security/limits.conf,和/etc/security/limits.d/目录,/etc/security/limits.d/里面配置会覆盖/etc/security/limits.conf的配置。

设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后将无法正常登录。

2.文件描述符相关操作

查看当前系统打开的文件描述符数量——通过命令“cat /proc/sys/fs/file-nr”查看。

结果如下图所示:

共有三个数字。

(1)第一个数表示当前系统分配后已使用的文件描述符数

(2)第二个数表示分配后未使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用)

(3)第三个数等于最大值file-max。

查看某个进程打开的文件描述符数量——通过命令“lsof -p $PID | wc -l”查看。

查看哪些进程占用文件描述符比较多——通过命令“lsof -n |awk '{print $10}'|sort |uniq -c |sort -nr”查看。