线上环境服务器突然变慢,如何排查原因?
今日份鸡汤:远离那些抹灭你自信让你变自卑的人;多去接触那些阳光爱笑充满正能量的人;时间久了,你会觉得你的生活变得明朗了~
要说这种场景,生产环境还真没排查过,遇到过的程序响应慢的也都是网络原因,或者依赖服务升级导致的。测试环境遇到的场景倒是有依赖服务磁盘满了的情况。前段时间学习的时候,整理了一下。
整体排查过程就是通过linux命令来排查定位:
-整机:查看整机cpu、mem使用情况,主要通过系统负载来判断当前系统是不是负载过重。
-cpu:查看cpu的整体使用情况。
-内存:应用程序可用内存数。
-硬盘:硬盘的剩余空间。
-磁盘IO:磁盘IO性能评估。
-网络IO:是否异常。
具体步骤如下:
1、整机:top

使用top命令,查看cpu、mem使用情况,查看top命令后右上角的load average: 0.16, 0.32, 0.24(系统负载均衡)这三个值分别代表系统一分钟、五分钟、十五分钟的平均负载值,如果这三个值相加除以3乘以100%后值高于60%,系统负载压力重。
2、CPU:vmstat

(1)查看cpu(包含但不限于):vmstat vmstat -n 2 3 每两秒采样一次,共计采样三次
第一个参数是采样的时间间隔,单位是秒
第二个参数是采样的次数
-
procs
r: 运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大
b: 等待资源的进程数,比如正在等待磁盘I/O、网络I/O等。 -
cpu
us: 用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,则需要优化程序
sy: 内核进程消耗的CPU时间百分比
us + sy 参考值为80%,如果超过了,说明可能存在CPU不足
id: 处于空闲的CPU百分比
wa: 系统等待IO的CPU时间百分比
(2)查看所有cpu核信息:mpstat -P ALL 2

(3)每个进程使用cpu的用量分解:pidstat -u 1 -p pid
找到进程pid:ps -ef | grep java
pidstat -u 1 -p pid

3、内存:free
(1)应用程序可用内存数:

free:按照字节数查询
free -g:按照GB查询,会吞掉一部分内存。
free -m:按照MB查询,比较准确。
经验值:
应用程序可用内存/系统物理内存 > 70% 内存充足
应用程序可用内存/系统物理内存 < 20% 内存不足,需要增加内存
20%<应用程序可用内存/系统物理内存<70% 内存基本够用
(2)查看额外:pidstat -p 进程号 -r采样间隔秒数

4、硬盘:df
查看磁盘剩余空间数:df -h

5、磁盘io:iostat
(1)磁盘io性能评估:iostat -xdk 2 3

rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的。
(2)查看额外:pidstat -d 采样间隔秒数 -p 进程号

6、网络io:ifstat
(1)默认本地没有,需要下载ifstat

(2)ifstat
