前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右。
因为最近接入了新的业务,业务方给出的数据是日常QPS可以达到2000,大促峰值QPS可能会达到1万。
所以,为了评估水位,我们进行了一次压测。压测过程中发现,当单机QPS达到200左右时,接口的rt没有明显变化,但是CPU利用率急剧升高,直到被打满。
压测停止后,CPU利用率立刻降了下来。
于是开始排查是什么导致了CPU的飙高。
问题排查与解决
在压测期间,登录到机器,开始排查问题。
本案例的排查过程使用的阿里开源的Arthas工具进行的,不使用Arthas,使用JDK自带的命令也是可以。
在开始排查之前,可以先看一下CPU的使用情况,最简单的就是使用top命令直接查看:
top-10:32:38up11days,17:56,0users,loadaverage:0.84,0.33,0.18 Tasks:23total,1running,21sleeping,0stopped,1zombie %Cpu(s):95.5us,2.2sy,0.0ni,76.3id,0.0wa,0.0hi,0.0si,6.1st KiBMem:8388608total,4378768free,3605932used,403908buff/cache KiBSwap:0total,0free,0used.4378768availMem PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND 3480admin20075656242.9g8976S241.235.8649:07.23java 1502root200401768402289084S1.00.539:21.65ilogtail 181964root20037564081043928464S0.71.20:39.38java 496root2002344224141084396S0.30.252:22.25staragentd 1400admin20021769522291565940S0.32.731:13.13java 235514root39192204632157046844S0.30.255:34.43argusagent 236226root2005583693046888S0.30.112:01.91systemd-journ
可以看到,进程ID为3480的Java进程占用的CPU比较高,基本可以断定是应用代码执行过程中消耗了大量CPU,接下来开始排查具体是哪个线程,哪段代码比较耗CPU。
首先,下载Arthas命令:
curl-Lhttp://start.alibaba-inc.com/install.sh|sh
启动
./as.sh
使用Arthas命令"thread -n 3 -i 1000"查看当前"最忙"(耗CPU)的三个线程:
转载请注明:IT运维空间 » 运维技术 » 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!
发表评论