京东质量社区 排查扫码接口在压测过程中,sys_cpu 使用率过高的问题

亚瑟王 for 京东 · 2017年03月06日 · 最后由 在路上 回复于 2017年04月17日 · 2764 次阅读

项目背景

公司为缩减服务器成本,需要对 WMS 系统服务器 CPU 核数进行缩容,需要在新的服务器上对核心接口及主要业务流程进行压测,评测新服务器上的应用是否满足预期性能指标

测试场景

4 级、5 级扫码接口混合场景

测试环境

应用 配置 数量
MCS(单实例,与 WMS 其它应用混合部署) 16C/64G/SAS Raid10 1
Mysql 16C/128G/SSD Raid5 1
压力机 16C/64G/SAS Raid10 1

网络环境:公司内网

问题描述

Jmeter 压测时,应用负载波动很大,持续几十秒钟之后,使用 user 使率下降到个位数,sys 使用率突然上升到 90% 以上

问题排查

  1. 查看应用日志并没有报错异常
  2. 查看 Mysql 资源使用率 (一直不高)
  3. 降低并发数,问题仍然存在,只不过 user 使用率下降周期变长,sys 使用率仍然飙到 90%
  4. Dump 应用线程,发现大量线程都在 Waiting 状态
  5. 增加 Tomcat 连接池到 1000,问题仍然存在
  6. strace 查看应用进程发现有 Connection time out 的错误
  7. 通过步骤 6 的线索,查看应用端口连接状态,发现有 2w 多的 timeout 状态的连接。
看到这就知道问题所在了,如果客户端的并发量持续很高,会出现大量处于 timewait 状态的连接,会使服务器因端口资源不足而拒绝为一部分客户端请求。修改内核参数之后问题解决,修改内容如下:

sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.ip_local_port_range="2048 65000"

共收到 4 条回复 时间 点赞

不错,这个调优化工作很赞,可以当案例了。Tks

sysctl -w net.ipv4.tcp_tw_reuse=1(这块是什么意思啊?
sysctl -w net.ipv4.tcp_tw_recycle=1(快速回收 TIME_WAIT,root 权限)
sysctl -w net.ipv4.ip_local_port_range="2048 65000"(临时端口范围)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册