笔者有个HTTP数据接收的项目上线,接收了大量的客户端HTTP请求,部署在三台LINUX 服务器上。
linux服务器64G内存,操作系统为CENT OS7.6
WEB容器采用TOMCAT9.0,服务端程序使用JAVA 开发,JDK版本为1.8,负责接收客户端持续不断的JSON请求,服务端将JSON解析为JAVA对象,并对每个对象的属性作合法性验证(比如,某个属性必须是16位的数字和字母且允许|间隔等待)以及相关性验证(比如 某个值必须等于A+B+C)。
上线几日来,每天接收80万的基本流水以及800万条的扩展流水。
上线首日,客户端(发送HTTP请求)报告有大量的连接超时(每次请求达到几十秒才能完成,正常时至多几十毫秒一次请求即可得到服务器200的响应)。
登录到服务端服务器排查:
在控制台命令行输入 top -c 命令,目的是显示进程运行信息列表,在屏幕显示中找到CPU占比最高的进程。
比如,最耗CPU的进程是PID为10165的进程,将ID记录下来。
在控制台命令行输入top -Hp 10165 ,显示一个进程的线程运行信息列表。
进程10165内,最耗CPU的线程PID为10604。
在控制台输入 printf “%x” 10604 将线程ID转换为16进制 ,比如 296c。
在控制台输入 jstack 10165|grep 296c -A 30 用于显示该线程的代码堆栈:
[root@localhost qf]# jstack 10165|grep 296c-A 30
"http-nio-9088-exec-43