QPS优化记录
公司接到了一个项目、要求项目 QPS 在 2500 以上,给了 14 台服务器部署,还派了一个验收员来检测系统是否达标,这个项目是用 nginx,weblogic,oricle,压测是使用的 loadranner,oricle 使用的是 rac 集群,由于大家不太熟悉,所以请了一位 DBA 外援
项目部署好后,进行压测,QPS 400 都没有,报了大量的网络错误
有两种错误:Connection timed out;Read timed out
当去查看后端服务和日志时,好像也没什么请求进来
总结之前的经验,我是这样来排错的:
1.频繁 GC 导致 JVM 进程暂停,暂停期间请求失败了,修改 JVM 参数 -xmx,-xms,但是提高了最大/小堆内存后 QPS 还是和之前一样,排查 JVM 配置问题
2.weblogic 线程池配置数量不够,导致请求无法处理,提高线程池最大线程数
3.nginx 配置修改(运维老大觉得是 nginx 的问题,重新编译了 nginx,但是 QPS 还是没有什么提升)
4.后来翻阅很多资料,用 netstat 统计 tcp 连接状态,发现很多 syn 半连接,在 /etc/sysctl.conf 中查看 tcp 半连接和全连接配置数发现都比较少,然后修改为合适量,改完后发现 QPS 上去了
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c | awk '{print $2, $1}' netstat -an | awk '/tcp/ {status[$6]++} END {for (s in status) print s, status[s]}'
vim /etc/sysctl.conf net.ipv4.tcp_max_syn_backlog = 8192 # 半连接优化 net.core.somaxconn = 8192 # 全连接优化
总结:linux 在处理 tcp 连接时,在接受到 syn 时,会将连接放入半连接队列中,再接收到 ack 时,会将连接放入全连接队列中,当半连接队列满时,会丢弃新收到的 syn,从而导致 Connection timed out 错误,当全连接队列满时,会丢弃 ack,从而出现 Read timed out 错误,这也是为什么服务端没接受到多少请求,因为连接都建立失败了吗,在修改完内核参数更新配置后 QPS 就上去了