1. 问题
终端在与服务器通信中,使用网络接口的返回状态(比如登陆上报或者紧急插播, 均为轮询消息)来提示终端是否连接上服务器;
当多终端同时连接服务器时,出现终端连接超时的情况,导致apk频繁显示未连接上服务器。ping 服务器正常。
服务器使用的Apache。系统设计的终端数在500以内。
2. 分析
a) 首先搭建压力测试环境, apachejmeter4.0, 模拟500个用户不停登陆。
b) 观察系统的 tcp连接状态。
#ss -lnt
注:上面看到的第二列Send-Q 表示第三列的listen端口上的全连接队列最大为128,第一列Recv-Q为全连接队列当前使用了多少
按照这个说法, 全连接队列过小, 需要放大。
#netstat -s | egrep "listen|LISTEN"
root@ubuntu:/# netstat -s | egrep "listen|LISTEN"
47500 times the listen queue of a socket overflowed
48122 SYNs to LISTEN sockets dropped
root@ubuntu:/# netstat -s | egrep "listen|LISTEN"
47555 times the listen queue of a socket overflowed
48177 SYNs to LISTEN sockets dropped
连续运行命令,数字一直增加,说明全连接队列持续满。
参考文章:https://102.alibaba.com/detail/?id=140
解决办法: 尝试修改tcp_max_syn_backlog(半连接)和somaxconn(全连接)
#echo '1024'>/proc/sys/net/ipv4/tcp_max_syn_backlog
#echo '1024'>/proc/sys/net/core/somaxconn
重启服务器,再次使用上面命令,发现全连接队列变成了511? 说明修改有效,但是并不是我们需要的值。
百度-> 全连接队列的大小取决于:min(backlog, somaxconn), backlog 由int listen(int sockfd, int backlog);传入
说明apache服务器有限制,需要修改apache服务器配置。
c) apache 服务器配置修改,(Apache优化:修改最大并发连接数)
<IfModule mpm_prefork_module>
ServerLimit 1024
ListenBacklog 1024
StartServers 20
MinSpareServers 20
MaxSpareServers 100
MaxRequestWorkers 1024
MaxConnectionsPerChild 10000
</IfModule>
首先找到 httpd.conf 关于mpm的选项
将“#Include conf/extra/httpd-mpm.conf”前面的 “#” 去掉,保存。
然后修改httpd-mpm.conf,找到当前系统使用的配置并修改,event/worker/
prefork/mpm_winnt/
mpm_netware之一。
prefork使用的配置,ListenBacklog 修改成1024, ServerLimit和MaxRequestWorkers 修改成1024。
需要注意的是ServerLimit和MaxRequestWorkers 修改得过大可能会导致apache 不启动或不稳定。
详情:http://httpd.apache.org/docs/current/mod/mpm_common.html
https://www.cnblogs.com/jukan/p/5830068.html
3. 总结
通过增大系统tcp连接队列和apache mem配置,服务器的响应明显得到改善。
经过一晚上时间测试,发现有时仍然会有少量连接超时的情况,下一步将继续优化php+mysql。