高并发数性能测试 Linux设置问题 - ashorefish/-software-test GitHub Wiki
高并发数性能测试 Linux设置问题:
问题1:一个进程文件句柄数限制(服务端+客户端)
因为每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接返回给我们的错误是 too many open files或者Socket/File: Cannot open so many files。执行 ulimit -n 输出 1024 (默认soft,ulimit -Hn 可查hard),说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。软限制(soft limit)是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制(hard limit)是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制
临时修改:ulimit -n 1000000,只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。 编辑 /etc/security/limits.conf 文件,( 修改完重新登录就可以见到), 修改后内容为
- soft nofile 1000000
- hard nofile 1000000 soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错。soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值nofile - 打开文件的最大数目星号表示针对所有用户,若仅针对某个用户登录ID,替换星号。
问题2:端口数量受限(客户端)
一般来说,单独对外提供请求的服务不用考虑端口数量问题,监听某一个端口即可。但是请求的发起方/客户端需要突破6万可用端口的限制。操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。网络四元组/网络五元组四元组是指的是 {源IP地址,源端口,目的IP地址,目的端口} 系统用一个4四元组来唯一标识一个TCP连接.五元组指的是(多了协议) {源IP地址,目的IP地址,协议号,源端口,目的端口}实际上只有{源IP地址,源端口}确定对外TCP请求数量, 因为目的地址和端口已经确定。例如EMQ server 的IP+端口1883
查看cat /proc/sys/net/ipv4/ip_local_port_range 临时修改: echo "1024 65535"> /proc/sys/net/ipv4/ip_local_port_range 永久修改:/etc/sysctl.conf 增加 net.ipv4.ip_local_port_range= 1024 65535
并令其生效sysctl -p现在可以使用的端口达到64510个
问题3:系统全局可用句柄数目限制 (即包含所有用户打开文件数总和)
fs.file-max是系统全局的可用句柄数目. The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate。
客户端发出大量请求(大概为40万时)会出现 [warn] socket: Too many open files in system 查看:cat /proc/sys/fs/file-max 当前会话修改,可以这么做:echo 1048576 > /proc/sys/fs/file-max 但系统重启后消失。 永久修改,要添加到 /etc/sysctl.conf 文件中:fs.file-max = 1048576保存并使之生效:sysctl -p