Linux CPU负载性能监测

Linux CPU性能监测

  • 平均负载和 CPU 使用率
  • 压测命令 stress
    • 模拟负载场景
  • 监测工具
    • top
    • mpstat
    • pidstat
  • 补充:自愿上下文切换和非自愿上下文切换

平均负载和 CPU 使用率

平均负载是指单位时间内的活跃进程数,也就是处于可运行状态®和不可中断状态(D)的进程数。不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。可以参考这篇笔记。

CPU使用率是指单位时间内CPU繁忙情况的统计,与平均负载并不是一个东西。

CPU使用率为100%时,是指换算成单个CPU的情况下使用率是100%,如果是多核的话,这并不是总的CPU使用率,所以此时即使100%也问题不大。实际上对于一个8核CPU其使用率最高是800%。一个进程内有多个线程的话,它的CPU使用率是这些线程的使用率总和,因此CPU使用率可能会超过100%。

大量进程执行CPU密集型操作:平均负载会升高,CPU使用率也会升高。
大量进程执行IO密集型操作:等待的进程也会引起平均负载比较高,但CPU使用率却比较低。
大量进程拥塞等待调度:平均负载很升高,CPU使用率也会比较高。

压测命令 stress

stress - tool to impose load on and stress test systems
`stress’ imposes certain types of compute stress on your system

Linux 系统压力测试工具,可模拟平均负载升高的场景。

常用参数:

  • -c, --cpu N —— spawn N workers spinning on sqrt(),可用于模拟CPU密集型进程
  • -i, --io N —— spawn N workers spinning on sync(),可用于模拟I/O密集型进程
  • -m, --vm N —— spawn N workers spinning on malloc()/free(),模拟频繁的堆内存申请与释放
  • -t, --timeout N —— timeout after N seconds,运行时间(秒)

模拟负载场景

  • CPU密集型进程模拟

    stress --cpu 1 --timeout 600
    
  • IO密集型进出程模拟

    stress -i 1 --timeout 600
    
  • 大量进程同时运行模拟

    stress -c 4 -i 4 --timeout 600
    

例如: 执行stress -c 4 -i 4 --timeout 600后,在另一个终端执行uptime,过一会儿后可以看到平均负载明显上升,趋近于8,与8个进程同时运行一致:

$ uptime
 12:18:54 up 14:28,  1 user,  load average: 7.95, 5.10, 2.23

监测工具

主要包括topmpstatpidstat

top

top的使用方法非常简单,直接执行就可以看到CPU的使用率(%CPU)、平均负载(load average)、进程占用CPU和内存等资源的情况。

启动后按下大写的H可以查看各个进程中具体线程的情况。或者直接只查看指定进程中各线程的情况:

top -Hp  

mpstat

mpstat - Report processors related statistics.
Usage: mpstat [-P {cpu|ALL}] [internal [count]]
EXAMPLES:
   mpstat 2 5
          Display five reports of global statistics among all processors at two second intervals.

   mpstat -P ALL 2 5
          Display five reports of statistics for all processors at two second intervals.

mpstat对/proc/stat文件中存放的CPU统计信息进行监控,不但能查看所有CPU的平均使用信息,还能查看某个特定CPU的信息。

常用参数:

参数 含义
-P {cpu l ALL} 监控哪个CPU,在[0,cpu个数-1]中取值,ALL为所有CPU
internal 相邻的两次采样的间隔时间
count 输出采样的次数,count需要和internal一起使用
不带任何参数 输出为从系统启动以来的平均值

示例:

$ mpstat -P ALL 5 3  # 本机CPU2个核
Linux 5.4.0-89-generic (100ask) 	11/02/2021 	_x86_64_	(2 CPU)

12:38:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
12:38:41 PM  all   51.40    0.00   48.60    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:41 PM    0   76.00    0.00   24.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:41 PM    1   26.80    0.00   73.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00

12:38:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
12:38:46 PM  all   50.85    0.00   49.15    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:46 PM    0   74.85    0.00   25.15    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:46 PM    1   26.95    0.00   73.05    0.00    0.00    0.00    0.00    0.00    0.00    0.00

12:38:46 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
12:38:51 PM  all   51.45    0.00   48.55    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:51 PM    0   75.75    0.00   24.25    0.00    0.00    0.00    0.00    0.00    0.00    0.00
12:38:51 PM    1   27.20    0.00   72.80    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   51.23    0.00   48.77    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       0   75.53    0.00   24.47    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       1   26.98    0.00   73.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00

输出参数含义:

输出参数 含义
%usr 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负的进程
%nice 在internal时间段里,nice值为的负进程的CPU时间(%)
%sys 在internal时间段里,内核态运行时间(%)
%iowait 在internal时间段里,硬盘I/O等待时间(%)
%irq 在internal时间段里,硬中断时间(%)
%soft 在internal时间段里,软中断时间(%)
%idle 在internal时间段里,CPU除去等待I/O操作外的闲置时间(%)

pidstat

pidstat - Report statistics for Linux tasks.
Usage: pidstat [option] interval [count]
EXAMPLES
   pidstat 2 5
          Display five reports of CPU statistics for every active  task  in
          the system at two second intervals.

   pidstat -r -p 1643 2 5
          Display five reports of page faults and memory statistics for PID
          1643 at two second intervals.

   pidstat -C "fox|bird" -r -p ALL
          Display global page faults and memory statistics for all the pro‐
          cesses whose command name includes the string "fox" or "bird".

   pidstat -T CHILD -r 2 5
          Display  five  reports  of  page  faults statistics at two second
          intervals for the child processes of all  tasks  in  the  system.
          Only  child  processes  with  non-zero statistics values are dis‐
          played.

常用参数:

参数 含义
-u 显示CPU相关的性能指标
-w 显示上下文切换详细情况
-t 查看线程信息,默认是进程的
-d 显示磁盘 I/O 统计数据
-r 显示内存使用情况及缺页错误信息
-p 指定要查看的进程号
-C 用于筛选出命令行包含关键字的进程

示例:

先在一个终端启用stress,然后另一个终端执行pidstat -C "stress" -urdw 5 2

$ pidstat -C "stress" -urdw 5 2
Linux 5.4.0-89-generic (100ask) 	11/02/2021 	_x86_64_	(2 CPU)
=========↓CPU参数↓
01:11:01 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
01:11:06 PM  1001     10439   99.80    0.00    0.00    0.40   99.80     1  stress
01:11:06 PM  1001     10440    2.00   97.01    0.00    1.20   99.00     0  stress
=========↓内存使用情况及缺页错误信息↓
01:11:01 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
=========↓磁盘IO情况↓
01:11:01 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
=========↓上下文切换参数↓
01:11:01 PM   UID       PID   cswch/s nvcswch/s  Command
01:11:06 PM  1001     10439      0.00     17.37  stress
01:11:06 PM  1001     10440      1.60     63.27  stress

01:11:06 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
01:11:11 PM  1001     10439   99.00    0.00    0.00    0.80   99.00     1  stress
01:11:11 PM  1001     10440    2.20   96.20    0.00    1.20   98.40     0  stress

01:11:06 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command

01:11:06 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command

01:11:06 PM   UID       PID   cswch/s nvcswch/s  Command
01:11:11 PM  1001     10439      0.00     17.60  stress
01:11:11 PM  1001     10440      1.00     66.80  stress

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:     1001     10439   99.40    0.00    0.00    0.60   99.40     -  stress
Average:     1001     10440    2.10   96.60    0.00    1.20   98.70     -  stress

Average:      UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command

Average:      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command

Average:      UID       PID   cswch/s nvcswch/s  Command
Average:     1001     10439      0.00     17.48  stress
Average:     1001     10440      1.30     65.03  stress

常用输出参数释义:

  • %wait 进程等待CPU的时间
  • minflt/s 每秒产生的次缺页错误次数(minor page faults)。所谓次缺页错误次数就是指虚拟内存地址映射成物理内存地址产生的page fault次数
  • majflt/s 每秒产生的主缺页错误次数(minor page faults)。所谓主缺页错误次数就是虚拟内存地址映射成物理内存地址时,相应的page在swap区
  • VSZ 进程使用的虚拟内存(单位kB)
  • RSS 进程使用的物理内存(单位kB)
  • %MEM 使用的有效内存比例。有效内存的英文品一下:The tasks's currently used share of available physical memory.
  • kB_rd/s每秒从磁盘读出多少KB
  • kB_wr/s 每秒写入多少KB到磁盘,包括已经写入和将要写入
  • cswch/s 每秒自愿上下文切换
  • nvcswch/s 每秒非自愿上下文切换

补充:自愿上下文切换和非自愿上下文切换

  • 自愿上下文切换就是指进程由于暂时无法获得资源而选择让出执行时间,从而引起上下文切换,如等待IO、内存的等资源时;
  • 非自愿上下文切换就是指进程的时间片用尽后被系统强制调度,从而引起上下文切换。

你可能感兴趣的:(Linux系统,linux,测试工具,压力测试)