Rootop 服务器运维与web架构

nginx压力测试碰到的问题

服务器端的问题:
1、/var/log/messages中报错:

Mar 15 15:46:13 localhost kernel: TCP: request_sock_TCP: Possible SYN flooding on port 80. Dropping request.  Check SNMP counters.

这是内核检测到可能受到syn攻击,丢弃了接下来的请求。
通过net.ipv4.tcp_syncookies = 0可以关闭内核检测syn洪水攻击。

把/etc/sysctl.conf内核参数优化成如下:

net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_syn_backlog = 20000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

上面参数可以从:https://www.rootop.org/pages/2529.html 找到解释

客户端的问题:
1、apache自带的ab压力测试工具并发高了会提示:socket: Too many open files (24)
这是本地系统文件最大打开数的问题,压力测试工具会模拟大量客户端发起请求,只要发起请求就得创建socket连接-socket句柄等于文件句柄,本地会打开一个端口与服务器连接。
通过修改/etc/security/limits.conf中软、硬限制加大最大打开数。但是会受到系统资源限制。

# 内核限制级别文件句柄,这个值查资料说是由系统根据硬件配置自动计算出来限制整个系统。
# 不过也可以由 sysctl.conf 中 fs.file-max = 2000000改变

[root@localhost ~]# cat /proc/sys/fs/file-max
1609786

# 单个进程限制级别文件句柄 默认1024*1024

[root@localhost ~]# cat /proc/sys/fs/nr_open
1048576

# 如果用ulimit或者 /etc/security/limits.conf 设置最大打开数,不能超过 nr_open 值,否则会报错。
[code type="shell"]
[root@localhost ~]# ulimit -n 1048577 
-bash: ulimit: open files: cannot modify limit: Operation not permitted

如果通过 limits.conf 修改超过nr_open,重启后就会无法登陆系统。

# 如果想增大ulimit -n,则需要先修改nr_open最大值。

[root@localhost ~]# vi /etc/sysctl.conf 
fs.nr_open = 2000000
[root@localhost ~]# sysctl -p

[root@localhost ~]# cat /proc/sys/fs/nr_open 
2000000
[root@localhost ~]# ulimit -n 2000000
[root@localhost ~]#  # 没有报错

上面2个配置参数同样对服务端有效。
2、apache自带的ab工具测试并发高了会提示:apr_socket_recv: Connection reset by peer (104)
此原因就是服务器端内核认为是受到了syn洪水攻击而发送了RST重置标识位。(具体去看TCP/IP协议)

3、fork failed.: Resource temporarily unavailable
此错误为用户运行的进程数量达到系统限制

通过ulimit可以查看当前用户可以运行多少个进程(max user processes字段)
[root@localhost html]# ulimit -u
7244

临时加大:
[root@localhost html]# ulimit -u 20000

永久配置:

[root@localhost ~]# cat /etc/security/limits.conf
* soft nofile 2000000
* hard nofile 2000000
* soft nproc 20000
* hard nproc 20000

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4284.html

作者:Venus

服务器运维与性能优化

评论已关闭。