Linux服务器性能检测-CPU负载篇

查看系统负载

查看系统负载的工具: uptime、w 等。系统平均负载时处于运行不可打扰状态的进程的平均数

* 可运行: 运行态,占用CPU,或就绪态,等待CPU调度           
* 不可打扰: 阻塞,正在等待I/O          

例1. 使用uptime查看系统负载

# uptime                
19:26:17 up 49 days,  7:34,  1 user,  load average: 0.67, 0.51, 0.41            

这里我们关注的是最后三列,即系统1分钟、5分钟、15分钟内的平均负载,判断一个系统负载是否偏高需要计算单核CPU的平均负载,等于这里uptime命令显示的系统平均负载 / CPU核数,一般以0.7为比较合适的值。偏高说明有比较多的进程在等待使用CPU资源。

例2. 使用w查看系统负载

# w                 
  19:29:47 up 49 days,  7:38,  1 user,  load average: 0.42, 0.46, 0.41             
  USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT           
  openstac pts/1    10.14.16.25      19:21    1.00s  0.19s  0.03s sshd: openstack [priv]     

使用 w 命令也可以查看类似的信息,w 命令还提供了当前登录用户,以及正在执行的操作等信息。
系统负载可以是CPU密集型的,也可以是RAM密集型和I/O密集型的,CPU密集型的系统比I/O密集型的系统响应度更好,因为I/O密集型的系统的磁盘I/O可能完全饱和,导致登录就很费事。

top 命令

top命令不仅可以查看当前系统的平均负载,还可以查看不同进程对于CPU、内存等资源的使用情况,在内存排障部分我们也将介绍top命令。
例3.使用top命令查看CPU使用率

top

默认情况下,top命令是以CPU使用率由高到低排序显示进程信息的,在 top 信息界面按 K 键,并输入想要终止的PID,就可以直接杀死指定进程。

top的 -b 选项开启批处理模式,将每次刷新全部打印到stdout
top的 -n 选项指定退出top命令前刷新多少次信息。
top命令的输出:
第1行:与uptime相同;
第3行:当前的CPU运行情况:
us:非nice用户进程占用CPU的比率
sy:内核、内核进程占用CPU的比率;
ni:如果一些用户进程修改过优先级,这里显示这些进程占用CPU时间的比率;
id:CPU空闲比率,如果系统缓慢而这个值很高,说明系统慢的原因不是CPU负载高;
wa:CPU等待执行I/O操作的时间比率,该指标可以用来排查磁盘I/O的问题,通常结合wa和id判断
hi:CPU处理硬件终端所占时间的比率;
si:CPU处理软件终端所占时间的比率;
st:流逝的时间,虚拟机中的其他任务所占CPU时间的比率;
  用户进程占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;
  wa低,id高,可以排除CPU资源瓶颈的可能。   
  wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的I/O资源。

iostat 命令

iostat 命令可以查看系统分区的IO使用情况
例4.iostat命令查看IO占用

1 wgfxcu@Ubos:~$ iostat
2 Linux 3.13.0-24-generic (Ubos)     2016年12月30日     _x86_64_    (1 CPU)           
3
4 avg-cpu:  %user   %nice %system %iowait  %steal   %idle             
5       0.22    0.01    0.55    0.04    0.00   99.17             

6 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn          
7 scd0              0.00         0.00         0.00         48          0          
8 sda               0.32         2.67         4.12     765668    1182218          
9 dm-0              0.54         2.66         4.12     762573    1182212      
10 dm-1              0.00         0.00         0.00        896          0      

在第2行系统发行版本下面的第4、5行,可以看到与top命令中CPU使用情况类似的信息,
第7行,可以看到一些IO指标:

tps: 每秒I/O传输请求量;                
kB_read/s:每秒读取多少KB;             
kB_wrtn/s:每秒写多少KB;          
kB_read:一共读了多少KB;       
kB_wrtn:一共写了多少KB。           

iostat命令属于sysstat工具包,由于我们的机器只挂载了一块硬盘,因此不能体现不同设备的I/O区别。

iotop 命令

iotop命令类似于top命令,但是现实的是各个进程的I/O情况,对于定位I/O操作较重的进程有比较大的作用。
例5. iotop命令与进程的IO状况

iotop

sysstat工具与负载历史回放

很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来自sysstat工具包,可以记录系统的CPU负载、I/O状况和内存使用记录,便于历史数据的回放。
Ubuntu系统上,sysstat的配置文件在/etc/default/sysstat,sysstat默认关闭,通过将该文件中的ENABLED改为”true”启用;历史日志的存放位置为/var/log/sysstat
Red Hat系统上,sysstat的配置文件在/etc/sysconfig/sysstat文件,历史日志的存放位置为/var/log/sa
两种系统上,统计信息都是每10分钟记录一次,每天的23:59会分割统计文件,这些操作的频率都在/etc/cron.d/sysstat文件配置。

sar命令查看CPU、内存和磁盘记录

默认情况下,sar命令显示当天的统计信息,不带参数显示CPU统计信息,参数-r显示收集的内存记录,-b显示磁盘I/O
例6. 使用sar命令查看CPU使用

# sar
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle                 
12:05:01 AM     all      3.83      0.02      4.24      0.61      0.00     91.30             
12:15:01 AM     all      3.57      0.02      4.28      0.58      0.00     91.54             
12:25:01 AM     all      3.83      0.02      5.16      0.60      0.00     90.39             
12:35:01 AM     all      3.98      0.02      5.66      0.58      0.00     89.76                 
12:45:01 AM     all      3.86      0.02      5.26      0.59      0.00     90.28             
12:55:01 AM     all      3.77      0.02      5.19      0.60      0.00     90.42                          

例7. 使用sar命令查看当天内存使用

# sar -r
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12:05:01 AM   6420736   5839392     47.63    242640   1366912   6811944     55.56   4324000   1202152        24
12:15:01 AM   6423128   5837000     47.61    242640   1367348   6830944     55.72   4320608   1202400        48
12:25:01 AM   6430984   5829144     47.55    242640   1367548   6814980     55.59   4314376   1202468        48
12:35:01 AM   6422924   5837204     47.61    242640   1367848   6817224     55.60   4321604   1202576        48
12:45:01 AM   6427300   5832828     47.58    242640   1368056   6822240     55.65   4318412   1202572        28         

例8. 使用sar命令查看当天IO统计记录

# sar -b
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM       tps      rtps      wtps   bread/s   bwrtn/s
12:05:01 AM      7.44      0.00      7.44      0.00    279.22
12:15:01 AM      6.45      0.00      6.45      0.00    255.84
12:25:01 AM      6.59      0.00      6.59      0.00    260.20
12:35:01 AM      6.51      0.00      6.51      0.00    261.42
12:45:01 AM      6.42      0.00      6.42      0.00    255.79       

使用sar查看指定时间、制定日期的历史记录

例9. 使用参数-s和-e先定查看的时间

# sar -s 20:00:00
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

08:05:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:15:01 PM     all      3.98      0.02      6.07      0.58      0.00     89.34
08:25:01 PM     all      4.32      0.02      5.74      0.58      0.00     89.34
Average:        all      4.15      0.02      5.91      0.58      0.00     89.34

例10. 使用参数-f查看本月内之前某一天的历史统计信息

# sar -f /var/log/sysstat/sa08
Linux 3.13.0-55-generic (ISeR-Server1)     08/08/2015     _x86_64_    (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      3.65      0.02      2.79      0.60      0.00     92.94
12:15:01 AM     all      3.45      0.02      3.03      0.56      0.00     92.94
12:25:01 AM     all      3.43      0.02      3.25      0.56      0.00     92.74
12:35:01 AM     all      3.44      0.01      3.09      0.56      0.00     92.89
12:45:01 AM     all      3.25      0.02      1.35      0.55      0.00     94.83
12:55:01 AM     all      3.36      0.02      1.77      0.56      0.00     94.29

sysstat工具只存储1个月内的系统使用记录,每天的记录以saN为文件名保存在相应的日志目录中,这里我们查看本月8号的CPU使用记录。

CPU占高排查

使用top命令查看占比高的进程

top-h

用top -H -p pid命令查看进程内各个线程占用的CPU百分比

top-p

查看进程中各线程的函数调用栈

  1. 使用pstack pid 查看进程中各县城的函数调用栈

    pstack
  2. 使用gdb

    可以使用gcore命令转存进程映像及内存上下文:
    #gcore 14094
    该命令生成core文件core.14094
    然后使用gdb调试core文件,使用info threads 查看具体的所有线程,thread –切换到threadno的线程,使用bt命令可以查看当前线程的函数调用栈

    也可以使用gdb 然后attach pid ,然后再使用 thread apply all bt 查看所有线程的函数调用栈。

  3. 用strace命令查看系统调用和花费的时间

    #strace -T -r -c -p pid
    -c 参数显示统计信息,去掉此参数可以查看每隔系统调用花费的时间及返回值

总结

处理CPU占比高的流程: 进程ID->线程ID->线程函数调用栈->函数耗时和调用统计->源代码分析