微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

Linux排查Load过高问题

高并发 aide_941 7℃

情况1:CPU高、Load高

  1. 通过top命令查找占用CPU最高的进程PID;
  2. 通过top -Hp PID查找占用CPU最高的线程TID;
  3. 对于java程序,使用jstack打印线程堆栈信息;
  4. 通过printf %x tid打印出最消耗CPU线程的十六进制;
  5. 在堆栈信息中查看该线程的堆栈信息;

情况2:CPU低、Load高

  1. 通过top命令查看CPU等待IO时间,即%wa;
  2. 通过iostat -d -x -m 1 10查看磁盘IO情况;(安装命令 yum install -y sysstat)
  3. 通过sar -n DEV 1 10查看网络IO情况;
  4. 通过如下命令查找占用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次后退出

 

  1. 161301秒 CPU %user %nice %system %iowait %steal %idle
  2. 161306all 9.15 0.00 48.19 0.05 0.00 42.61
  3. 161311all 2.13 0.00 8.76 0.08 0.00 89.03
  4. 161316all 2.13 0.00 11.41 0.03 0.00 86.44
  5. 161321all 2.20 0.00 10.61 0.05 0.00 87.14
  6. 161326all 2.48 0.00 10.44 0.08 0.00 87.00
  7. 161331all 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    静态显示内存相关信息

首先运行一个默认命令, 根据输出结果,解释下各个字段的含义,有助于下面的分析。

  1. [root@master ~]# vmstat 
  2. procs ———–memory———- —swap– —–io—- –system– —–cpu—–
  3.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  4.  1  0      0 431340  44840 211744    0    0     5     2  149    9  2  4 95  0  0
  5. [root@minion ~]# vmstat -a
  6. procs ———–memory———- —swap– —–io—- –system– —–cpu—–
  7.  r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
  8.  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.
这个程序如下

  1. #!/usr/bin/python
  2. import threading
  3. count = 0
  4. class Test(threading.Thread):
  5.     def __init__(self):
  6.         threading.Thread.__init__(self)
  7.     def run(self):
  8.         global count
  9.         for i in xrange(1,100000000):    #100000000
  10.             count += 1
  11.         print count
  12. if __name__ == ‘__main__’:
  13.     threads = []
  14.     for i in range(10):
  15.         thread = Test()
  16.         threads.append(thread)
  17.         thread.start()
  18.     for thread in threads:
  19.         thread.join()
  20.     print count

2.2 程序运行前
我在程序运行前使用top命令和vmstat命令查看相关报告

vmstat报告

  1. [root@master ~]# vmstat 2 10
  2. procs ———–memory———- —swap– —–io—- –system– —–cpu—–
  3.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  4.  0  0      0 432696  43672 211724    0    0     6     2  148  715  2  4 94  0  0
  5.  0  0      0 432688  43672 211724    0    0     0     0   20   17  0  0 100  0  0
  6.  0  0      0 432688  43672 211724    0    0     0     0   16   17  0  0 100  0  0
  7.  0  0      0 432432  43672 211724    0    0     0     0   54   43  0  1 99  0  0
  8.  0  0      0 432400  43672 211724    0    0     0     0   38   37  0  0 100  0  0
  9.  0  0      0 432376  43672 211724    0    0     0     0   88   65  0  1 99  0  0
  10.  0  0      0 432120  43672 211724    0    0     0     0   49   35  0  1 99  0  0
  11.  0  0      0 432152  43672 211724    0    0     0     0   31   28  0  0 99  0  0
  12.  0  0      0 432152  43672 211724    0    0     0     0   29   26  0  0 100  0  0
  13.  0  0      0 432152  43672 211724    0    0     0     0   15   16  0  0 100  0  0

top报告

  1. [root@master ~]# top
  2. top 12:11:37 up  7:07,  3 users,  load average: 0.00, 0.00, 0.02
  3. Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
  4. 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
  5. 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
  6. Mem:   1004412k total,   573856k used,   430556k free,    45160k buffers
  7. Swap:  2047992k total,        0k used,  2047992k free,   211748k cached

根据top报告和vmstat报告,我们完全可以得出结论——系统性能良好。因为各个指标的值都不高

2.3 程序运行时
vmstat报告

  1. [root@master ~]# vmstat 2 10
  2. procs ———–memory———- —swap– —–io—- –system– —–cpu—–
  3.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  4. 21  0      0 423072  43640 211724    0    0     6     2  142  506  2  4 95  0  0
  5. 20  0      0 423064  43640 211724    0    0     0     0 2085 78125 26 73  1  0  0
  6. 20  0      0 423064  43640 211724    0    0     0     0 2038 79752 24 74  1  0  0
  7. 20  0      0 423064  43640 211724    0    0     0     0 2057 78022 25 74  1  0  0
  8. 20  0      0 423064  43640 211724    0    0     0     0 2045 85145 25 73  2  0  0
  9. 20  0      0 423032  43640 211724    0    0     0    12 2002 68602 25 73  2  0  0
  10. 20  0      0 422908  43640 211724    0    0     0     0 2065 79101 25 73  1  0  0
  11. 20  0      0 422908  43640 211724    0    0     0     0 2048 78424 26 73  1  0  0
  12. 10  0      0 422940  43640 211724    0    0     0     0 2039 69779 22 76  2  0  0
  13. 21  0      0 422940  43640 211724    0    0     0     0 2050 81712 26 73  2  0  0

top报告

  1. [root@master ~]# top
  2. top 10:55:10 up  5:51,  3 users,  load average: 15.01, 11.58, 6.21
  3. Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
  4. 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
  5. 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
  6. Mem:   1004412k total,   581836k used,   422576k free,    43656k buffers
  7. 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过高问题

喜欢 (0)or分享 (0)