服务器出问题了,我应该要怎么排查(cpu性能篇)?

这里直接举例,用一台单核2G内存的服务器,部署gitlab(官方推荐是要8核的,单核肯定炸),不多说,下面直接开始实验

在运行gitlab-ctl reconfigure 后,服务器变得异常卡顿,一段之间之后就hang在那里了

1.首先用top指令,查看服务器究竟是哪个地方出问题了

用top指令查看cpu指标,首先先来解释下下面这几个指标分别代表了什么

// 用户态 CPU 时间(不包括下面的 nice 时间,但包括了 guest 时间)
us
// 内核态 CPU 时间
sy
// 低优先级用户态 CPU 时间(进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低)
ni
// 空闲时间(不包括等待 I/O 的时间【iowait】)
id
// 等待 I/O 的 CPU 时间
wa
// 处理硬中断的 CPU 时间
hi
// 处理软中断的 CPU 时间
si
// 系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间
st
// 补充说明,其实cpu性能的常见输出参数还有以下两个
// 通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间
guest
// 以低优先级运行虚拟机的时间
gnice

详细的说明可以百度,这里的问题就是wa异常的高,也就是等待io的时间太高

其实用top命令,下面输出的内容就基本知道原因了(这里我就不截图了),因为接下来我介绍一个非常好用的工具,能帮你快速定位到服务器究竟是哪里出了问题

2.vmstat工具

 用vmstat查看指标后,发现cpu忙不过来,有一堆进程被阻塞了(b为29),而且内存也被占满了

这里直接贴出以前整理好的脑图,说明下vmstat的参数

有人可能说, 明知道cup是单核的配置,我怎么可能会让它跑那么多进程,但是这种情况我确实在生产环境(32核的cpu)遇到过,案例是这样的,有个定时计划任务,每分钟执行一次,随着数据库数据量越大,脚本处理数据的时间增强,到后期就超过了1分钟的执行时间,之后脚本慢慢的堆积起来直接把脚本服务器搞炸了,所以在执行计划任务的时候,一定要评估好,最好的方法就是每次执行先判断下该脚本在后台运行的线程数,小于一定的阈值后就不再执行,避免cpu处理不过来

3.实验结束,清理测试环境

执行gitlab-ctl stop(这里特别提醒一下,按照上文做完实验别立刻断开中断,不然再次连接的时候,大概率连不上),等了很久一段时间,这命令才终于执行成功

 但是ps -axu | grep -i gitlab后发现还有很多相关进程还没有被kill掉

 ps -aux | grep gitlab | awk '{print $2}' | args kill -9 执行后,发现那些进程又会重新启动,然后服务器有卡住了。。。

没办法就只能去google了,发现了条命令

systemctl stop gitlab-runsvdir

执行后,很多进程都停掉了,就剩下pgsql的和一个redis,-d启动的守护进程想kill也kill不掉,接下来就不再说明怎么处理了,可以留给看到这篇博客的小伙伴们去google解决方法

 

原文地址:https://www.cnblogs.com/zhp-king/p/14770665.html