找到占用CPU最高的线程
- 通常的做法是:
➊ 在命令行输入top,然后shift+p查看占用CPU最高的进程,记下进程号
➋ 在命令行输入top -Hp 进程号,查看占用CPU最高的线程
➌ 使用printf 0x%x 线程号,得到其16进制线程号
➍ 使用jstack 进程号得到java执行栈,然后grep16进制找到相应的信息
- 这一行Shell的意思是,找到使用CPU最高的进程之使用CPU最高的线程的16进制号。
1 | ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 | awk '{print $2}' |xargs top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xargs printf 0x%x |
先记住这些判断准则,我们在示例中再聊:
➊ 如果load超过了cpu核数,则负载过高
➋ 如果wa过高,可初步判断I/O有问题
➌ sy,si,hi,st,任何一个超过5%,都有问题
➍ 进程状态长时处于D、Z、T状态,提高注意度
➎ cpu不均衡,判断亲和性和优先级问题
CPU过高是表象。除了系统确实负载已经到了极限,其他的,都是由其他原因引起的,比如I/O;比如设备。这些我们放在其他章节进行讨论。
GC引起的CPU过高
接着我们最开始的例子来。通过查看jstack找到相应的16进制进程,结果发现是GC线程。
“VM Thread” prio=10 tid=0x00007f06d8089000 nid=0x58c7 runnable
“GC task thread#0 (ParallelGC)” prio=10 tid=0x00007f06d801b800 nid=0x58d7 runnable
这种情况,一般都是JVM内存不够用了,疯狂GC,可能是socket/线程忘了关闭了,也可能是大对象没有回收。这种情况只能通过重启来解决了,记得重启之前,使用jmap dump一下堆栈哦。当然,你可能会得到jdk版本的问题。
st%占比过高
st过高一般是物理CPU资源不足所致,也就是只发生在虚拟机上。
如果你买的虚拟机st一直很高,那你的服务提供商可能在超卖,挤占你的资源。不信双11的时候看下你的虚拟机?
网卡导致单cpu过高
业务方几台kafka,cpu使用处于正常水平,才10%左右,但有一核cpu,负载特别的高,si奇高。
mpstat -I SUM -P ALL 查看cpu使用情况,cpu0的中断确实比较多。
20:15:18 CPU intr/s
20:15:23 all 34234.20
20:15:23 0 9566.20
20:15:23 1 0.00
网卡需要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要停止目前的工作来处理这个中断。其实,默认所有的中断处理都集中在cpu0 上,导致服务器负载过高。cpu0 成了瓶颈,而其他cpu却还闲着。
➊ 解决方式1:使用CPU亲和性功能,kafka略过网卡所使用的CPU
➋ 解决方式2: 更换网卡
➌ 通常修改的方式还是有些复杂了,比如,修改
/proc/irq/{seq}/smp_affinity
我们可以直接安装irqbalance,然后执行就可以了。
yum install irqbalance -y
service irqbalance start
cpu使用率低,但负载高
cpu id%高,也就是空闲,比如90%。但 load average非常高,比如4核达到10。
分析:load average高,说明其任务已经排队,许多任务正在等待。出现此种情况,可能存在大量不可中断的进程。
使用top或者ps可以看到进程相应的状态。
https://mp.weixin.qq.com/s/WTva_bvkIn7uTCxv0m2RiA
which woman love man
排查内存的一些命令
内存分两部分,物理内存和swap。物理内存问题主要是内存泄漏,而swap的问题主要是用了swap~,我们先上一点命令。
物理内存
- 根据使用量排序查看RES
top -> shift + m - 查看进程使用的物理内存
ps -p 75 -o rss,vsz - 显示内存的使用情况
free -h - 使用sar查看内存信息
sar -r - 显示内存每个区的详情
cat /proc/meminfo - 查看slab区使用情况
slabtop
通常,通过查看物理内存的占用,你发现不了多少问题,顶多发现那个进程占用内存高(比如vim等旁路应用)。meminfo和slabtop对系统的全局判断帮助很大,但掌握这两点坡度陡峭。
swap
- 查看si,so是否异常
vmstat 1 - 使用sar查看swap
sar -W - 禁用swap
swapoff - 查询swap优先级
sysctl -q vm.swappiness - 设置swap优先级
sysctl vm.swappiness=10
建议关注非0 swap的所有问题,即使你用了ssd。swap用的多,通常伴随着I/O升高,服务卡顿。swap一点都不好玩,不信搜一下《swap罪与罚》这篇文章看下,千万不要更晕哦。