问题背景

我们在进行压测的时候,经常会遇到,当你的服务器在大并发达到极限时,就会报出 “too many open files” 的错误。

问题解析

这是因为,在 Linux 系统中任何一个对象都是一个文件,都需要占用一个文件句柄,我们在压测的时候,一个连接就是用到一个文件句柄,对于绝大部分 Linux 操作系统, 默认情况下只有 1024 个句柄数! 因为操作系统包含最大打开文件数 (Max Open Files) 限制, 分为系统全局的, 和进程级的限制.

1、全局限制

在 Linux 下执行:
cat /proc/sys/fs/file-nr
会打印出类似下面的一行输出:

5100 0 101747
第三个数字 101747 就是当前系统的全局最大打开文件数 (Max Open Files), 可以看到, 只有 10 万, 所以, 在这台服务器上无法支持 C1000K. 很多系统的这个数值更小, 为了修改这个数值, 用 root 权限修改 /etc/sysctl.conf 文件:

fs.file-max = 1020000
net.ipv4.ip_conntrack_max = 1020000
net.ipv4.netfilter.ip_conntrack_max = 1020000

2、进程限制

执行:
ulimit -n
输出:
1024
说明当前 Linux 系统的每一个进程只能最多打开 1024 个文件. 为了支持 C1000K, 你同样需要修改这个限制.

3、临时修改

ulimit -n 1020000
不过, 如果你不是 root, 可能不能修改超过 1024, 会报错:

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

4、永久修改

编辑 /etc/security/limits.conf 文件, 加入如下行:

# /etc/security/limits.conf
work hard nofile 1020000
work soft nofile 1020000

更多内容可以学习《测试工程师 Python 工具开发实战》书籍


↙↙↙阅读原文可查看相关链接,并与作者交流