情况1:CPU高、Load高
- 通过top命令查找占用CPU最高的进程PID;
- 通过top -Hp PID查找占用CPU最高的线程TID;
- 对于java程序,使用jstack打印线程堆栈信息;
- 通过printf %x tid打印出最消耗CPU线程的十六进制;
- 在堆栈信息中查看该线程的堆栈信息;
情况2:CPU低、Load高
- 通过top命令查看CPU等待IO时间,即%wa;
- 通过iostat -d -x -m 1 10查看磁盘IO情况;(安装命令 yum install -y sysstat)
- 通过sar -n DEV 1 10查看网络IO情况;
- 通过如下命令查找占用IO的程序;
ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
sar 5 6 //每隔5s 输出6次后退出
-
16时13分01秒 CPU %user %nice %system %iowait %steal %idle
-
16时13分06秒 all 9.15 0.00 48.19 0.05 0.00 42.61
-
16时13分11秒 all 2.13 0.00 8.76 0.08 0.00 89.03
-
16时13分16秒 all 2.13 0.00 11.41 0.03 0.00 86.44
-
16时13分21秒 all 2.20 0.00 10.61 0.05 0.00 87.14
-
16时13分26秒 all 2.48 0.00 10.44 0.08 0.00 87.00
-
16时13分31秒 all 2.40 0.00 10.51 0.05 0.00 87.00
注:
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
排查实例
一、vmstat选项
-a 显示活跃内存(active)和非活跃内存(inact)
-f 显示从系统启动至今的fork数量
-m 显示slabinfo
-s 静态显示内存相关信息
首先运行一个默认命令, 根据输出结果,解释下各个字段的含义,有助于下面的分析。
-
[root@master ~]# vmstat
-
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
-
r b swpd free buff cache si so bi bo in cs us sy id wa st
-
1 0 0 431340 44840 211744 0 0 5 2 149 9 2 4 95 0 0
-
-
[root@minion ~]# vmstat -a
-
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
-
r b swpd free inact active si so bi bo in cs us sy id wa st
-
1 0 0 757496 64916 83772 0 0 85 7 56 42 1 3 96 0 0
各个字段对应的项含义如下
procs
- r 正在等待运行的进程数
- b 在uninterruptible 睡眠中的进程数
memory
- swpd 以使用的swap空间
- free 剩余的物理内存
- buff buffer
- cache cache
- inact 非活动的内数量(-a选项)
- active 活动的内存的数量(-a选项)
swap
- si 从磁盘交换的内存大小
- so 交换到磁盘的内存大小
io
- bi 从块设备接收的块(block/s)
- bo 发送给块设备的块(block/s).如果这个值长期不为0,说明内存可能有问题,因为没有使用到缓存(当然,不排除直接I/O的情况,但是一般很少有直接I/O的)
system
- in 每秒的中断次数,包括时钟中断
- cs 进程上下文切换次数
cpu
- us 用户进程占用CPU时间比例
- sy 系统占用CPU时间比例
- id CPU空闲时间比
- wa IO等待时间比(IO等待高时,可能是磁盘性能有问题了)
- st steal time
二、CPU篇
2.1 监控指标
CPU利用率。根据经验来看,用户空间进程占用CPU比例在 65-70%之间,内核(系统)CPU比例在30%-35%之间,空闲比例在0%-5%之间。一般不能超过这个比例,超过这个比例,系统性能就会降低,平均负载升高,这点将会在下面的测试中看到。
进程上下文切换。上下文切换和CPU利用率应该联系起来,如果CPU利用率低,那么上下文切换稍高点也能接受。上下文切换也是需要消耗CPU资源的,频繁的切换必将使得CPU利用率升高。
运行队列中等待运行的进程数。每个CPU核心中等待处理的进程数不应该超过3个线程/进程。如4核心的机器,那么队列的最大值应该不超过12个。
平均负载。平均负载值是平均每核心CPU的负载应该控制在0.7。最好不要超过1.
一般,我是使用top命令和vmstat命令一起看,top命令可以看到整体情况,也可以看到每个任务消耗资源的情况。使用vmstat命令查看队列中的任务书、进程上下文切换。
下面是一个CPU密集型程序,采用多线程(20个线程)去循环将一个全局变量+1.
这个程序如下
-
#!/usr/bin/python
-
-
import threading
-
-
count = 0
-
-
class Test(threading.Thread):
-
def __init__(self):
-
threading.Thread.__init__(self)
-
-
def run(self):
-
global count
-
for i in xrange(1,100000000): #100000000
-
count += 1
-
print count
-
if __name__ == ‘__main__’:
-
threads = []
-
for i in range(10):
-
thread = Test()
-
threads.append(thread)
-
thread.start()
-
for thread in threads:
-
thread.join()
-
print count
2.2 程序运行前
我在程序运行前使用top命令和vmstat命令查看相关报告
vmstat报告
-
[root@master ~]# vmstat 2 10
-
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
-
r b swpd free buff cache si so bi bo in cs us sy id wa st
-
0 0 0 432696 43672 211724 0 0 6 2 148 715 2 4 94 0 0
-
0 0 0 432688 43672 211724 0 0 0 0 20 17 0 0 100 0 0
-
0 0 0 432688 43672 211724 0 0 0 0 16 17 0 0 100 0 0
-
0 0 0 432432 43672 211724 0 0 0 0 54 43 0 1 99 0 0
-
0 0 0 432400 43672 211724 0 0 0 0 38 37 0 0 100 0 0
-
0 0 0 432376 43672 211724 0 0 0 0 88 65 0 1 99 0 0
-
0 0 0 432120 43672 211724 0 0 0 0 49 35 0 1 99 0 0
-
0 0 0 432152 43672 211724 0 0 0 0 31 28 0 0 99 0 0
-
0 0 0 432152 43672 211724 0 0 0 0 29 26 0 0 100 0 0
-
0 0 0 432152 43672 211724 0 0 0 0 15 16 0 0 100 0 0
top报告
-
[root@master ~]# top
-
top – 12:11:37 up 7:07, 3 users, load average: 0.00, 0.00, 0.02
-
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
-
Cpu0 : 1.8%us, 3.3%sy, 0.0%ni, 94.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
-
Cpu1 : 1.3%us, 3.8%sy, 0.0%ni, 94.8%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
-
Mem: 1004412k total, 573856k used, 430556k free, 45160k buffers
-
Swap: 2047992k total, 0k used, 2047992k free, 211748k cached
根据top报告和vmstat报告,我们完全可以得出结论——系统性能良好。因为各个指标的值都不高
2.3 程序运行时
vmstat报告
-
[root@master ~]# vmstat 2 10
-
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
-
r b swpd free buff cache si so bi bo in cs us sy id wa st
-
21 0 0 423072 43640 211724 0 0 6 2 142 506 2 4 95 0 0
-
20 0 0 423064 43640 211724 0 0 0 0 2085 78125 26 73 1 0 0
-
20 0 0 423064 43640 211724 0 0 0 0 2038 79752 24 74 1 0 0
-
20 0 0 423064 43640 211724 0 0 0 0 2057 78022 25 74 1 0 0
-
20 0 0 423064 43640 211724 0 0 0 0 2045 85145 25 73 2 0 0
-
20 0 0 423032 43640 211724 0 0 0 12 2002 68602 25 73 2 0 0
-
20 0 0 422908 43640 211724 0 0 0 0 2065 79101 25 73 1 0 0
-
20 0 0 422908 43640 211724 0 0 0 0 2048 78424 26 73 1 0 0
-
10 0 0 422940 43640 211724 0 0 0 0 2039 69779 22 76 2 0 0
-
21 0 0 422940 43640 211724 0 0 0 0 2050 81712 26 73 2 0 0
top报告
-
[root@master ~]# top
-
top – 10:55:10 up 5:51, 3 users, load average: 15.01, 11.58, 6.21
-
Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie
-
Cpu0 : 27.8%us, 72.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
-
Cpu1 : 22.2%us, 77.8%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
-
Mem: 1004412k total, 581836k used, 422576k free, 43656k buffers
-
Swap: 2047992k total, 0k used, 2047992k free, 211724k cached
运行时的情况看起来就十分不好了。我重点关注了这几个值:
top报告分析
- load average: 15.01, 11.58, 6.21
- %sys: 都已经达到了70%以上
- id% 都是 0
vmstat报告分析
- r 运行队列中等待的线程/进程基本上都是20左右
- cs 上下文切换每秒80000次左右
从上述分析中可以看出,系统系能已经很差了。这里我尝试做一个分析,为什么系统占用CPU的利用率这么高?我认为是程序运行时的进程上下文频繁切换所导致的,这是因为进程/线程的调度室通过内核子系统进程调度程序来调度的,频繁的切换说明进程调度程序也是十分频繁的的占用CPU,因此导致系统占用CPU的时间很高;此外,系统调用也是耗费了一部分时间的。因此系统占用CPU的比例很高,而用户空间进程占有CPU的比例相对就低了很多。系统就是给用户提供服务的,如果大部分资源都被系统给占用,那这个用户还能做什么工作呢?
补充top 字段含义:
%hi , IRQ。如果这个值不均衡,则说明没有设置中断均衡。设置方法可参考我之前的文章多队列网卡中断均衡
- %si soft IRQ,即软中断
- PR 优先级
- NI nice值
- VIRT virtual image(kb)
- RES Resident size。已使用的非swap物理内存
- SHR 共享内存大小(kb)
- %CPU 占总CPU时间的百分比。这个值是和上次更新至现在的CPU使用率。如top命令3秒更新一次数据,那这个值就是这个3秒内的CPU使用率
- %MEM 任务当
相关工具使用介绍:
sar用法详解 :Linux的sar命令详解
iostat用法详解:Linux IO实时监控iostat命令详解
vmstat用法详解:Linux vmstat命令实战详解
转载请注明:SuperIT » Linux排查Load过高问题