cpu | 内存 | IO使用问题排查命令详解

top命令整理

top命令查看进程的资源使用情况

参数 作用 案例
N 按照pid排序(PID一列从大到小)
P 按照cpu利用率排序(%CPU一列从大到小)
M 按照内存利用率排序(%MEM一列从大到小)
T 进程使用cpu时间总计排序(TIME+一列从大到小)
1 数字1可以看到有几个cpu,每个cpu的使用情况
c 切换显示命令名称和完整命令行
f 查看top输出字段的含义
m 切换显示内存信息
n 输入数字,可以查看指定数量的进程,可以与 P/M/T 等混合使用,查看某项资源前几的进程
s/d 改变两次刷新之间的延迟时间,默认为3秒,可以与 P/M/T 等混合使用,定时刷新查看进程情况
t 切换显示进程和cpu状态信息
u 输入用户名只显示该用户的进程
= 任何时刻按等于号,可以查看最新的top显示

如果是指定查看某个进程资源利用情况 top -p ${pid1},${pid2},${pid3} 这样的命令来查询

top命令查询结果说明

以下是top命令的输出结果案例:

top - 14:29:58 up 31 days, 17:49,  2 users,  load average: 0.04, 0.04, 0.05
Tasks: 149 total,   1 running, 148 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.2 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7966152 total,  3206444 free,   399576 used,  4360132 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  7202316 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                
29404 root      20   0    7080   6236    808 S   1.0  0.1 389:38.71 sap1002

首先是统计信息
第一行 top - 14:29:58 up 31 days, 17:49, 2 users, load average: 0.04, 0.04, 0.05 的说明如下:

  • 14:29:58 表示当前时间,"时:分:秒"
  • up 31 days, 17:49 表示系统运行时间,"31天17时49分"
  • 2 users 表示目前登录机器的用户数,"2个用户登录了机器"
  • load average: 0.04, 0.04, 0.05 表示1min、5min、15min到现在的系统平均负载

第二行 Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie 的说明如下:

  • 149 total 表示共有149个进程
  • 1 running 表示1个进程在运行
  • 148 sleeping 表示148个进程在睡眠状态
  • 0 stopped 表示停止的进程数为0
  • 0 zombie 表示僵死的进程数为0

第三行 %Cpu(s): 0.5 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 的说明如下:

  • 0.5 us 表示用户空间占用cpu百分比
  • 0.2 sy 表示内核空间占用cpu百分比
  • 0.0 ni 表示用户进程空间内带有优先级的进程占用cpu百分比
  • 99.3 id 表示空闲cpu百分比
  • 0.0 wa 表示等待输入输出cpu时间百分比
  • 0.0 hi 表示硬中断(Hardware IRQ)占用cpu的百分比
  • 0.0 si 表示软中断(Software Interrupts)占用cpu的百分比
  • 0.0 st 表示有虚拟cpu的情况,被虚拟机偷掉的cpu时间百分比

第四行 KiB Mem : 7966152 total, 3206444 free, 399576 used, 4360132 buff/cache 的说明如下:

  • 7966152 total 表示物理内存总量
  • 3206444 free 表示空闲内存总量
  • 399576 used 表示使用的物理内存总量
  • 4360132 buff/cache 表示内核缓存的内存量

第五行 KiB Swap: 0 total, 0 free, 0 used. 7202316 avail Mem 的说明如下:

  • 0 total 表示交换区总量
  • 0 free 表示空闲交换区总量
  • 0 used 表示使用的交换区总量
  • 7202316 avail Mem 表示可用于进程下一次分配的物理内存数量

计算可用内存可以用公式: Mem_free + Mem_buff/cache


然后是各个进程的使用情况

字段名 字段含义 案例
PID 进程ID 29404
USER 进程所有者 root
PR 进程的优先级别,越小越优先被执行 20
NI nice值:
负值表示高优先级;
正值表示低优先级
0
VIRT 进程占用的虚拟内存(kb) 7080
RES 进程占用的物理内存(kb) 6236
SHR 进程占用的共享内存(kb) 808
S 进程的状态:
S表示休眠;
R表示正在运行;
Z表示僵死;
N表示该进程优先值为负
S
%CPU 进程占用CPU的比例 1.0
%MEM 进程占用物理内存的比例 0.1
TIME+ 进程启动后,占用CPU的累加时间,与进程启动时间不同 389:38.71表示389分38.71秒
COMMAND 进程启动命令名称 sap1002

iostat

查看磁盘io使用情况,可以使用命令 iostat -x 1 表示每隔1秒查询机器的io利用率情况

iostat查看结果

使用 iostat -x 查看详情的结果如下

Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm)  05/22/2020      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.59    0.00    0.32    0.05    0.00   99.04

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     2.82    0.01    1.97     0.11    46.25    46.90     0.01    3.01    6.16    3.00   0.82   0.16
vdb               0.00     0.91    0.00    0.62     0.01     8.64    27.90     0.00    3.86    0.82    3.87   1.74   0.11
scd0              0.00     0.00    0.00    0.00     0.02     0.00    64.16     0.00    0.30    0.30    0.00   0.26   0.00

关于cpu的使用说明如下

  • %user 表示用户空间占用cpu百分比
  • %nice 表示用户进程空间内带有优先级的进程占用cpu百分比
  • %system 表示内核空间占用cpu百分比
  • %iowait 表示等待输入输出cpu时间百分比
  • %steal 表示有虚拟cpu的情况,被虚拟机偷掉的cpu时间百分比
  • %idle 表示空闲cpu百分比

关于设备利用率的使用说明如下

  • rrqm/s 表示每秒合并到设备的读取请求数
  • wrqm/s 表示每秒合并到设备的写入请求数
  • r/s 表示每秒向磁盘发起的读操作数
  • w/s 表示每秒向磁盘发起的写操作数
  • rkB/s 表示每秒从磁盘读取数据大小,单位 KB/s
  • wkB/s 表示每秒向磁盘写入数据大小,单位 KB/s
  • avgrq-sz 表示平均每次设备io操作的数据量大小
  • avgqu-sz 表示平均io队列长度
  • await 表示平均每次设备io操作的等待时间(毫秒),一般的,系统io响应时间低于5ms,如果大于10ms就比较大了
  • r_await 表示每个读操作平均所需要的时间(毫秒),不仅包括硬盘设备读操作时间,还包括在kernel队列中等待时间
  • w_await 表示每个写操作平均所需要的时间(毫秒),不仅包括硬盘设备写操作时间,还包括在kernel队列中等待时间
  • svctm 表示平均每次设备io操作的服务时间(毫秒),数据不可信!
  • %util 表示一秒钟有多少时间用于io操作,即被io消耗的cpu百分比,一般的如果该参数是100%表示设备已经接近满负荷运行

另外我们也可以直接使用 iostat 命令查看,输出结果案例如下:

Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm)  05/22/2020      _x86_64_        (4 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.59    0.00    0.32    0.05    0.00   99.04

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               1.98         0.11        46.25     313948  127061392
vdb               0.62         0.01         8.65      29153   23756052
scd0              0.00         0.02         0.00      42058          0

关于设备利用率的使用说明如下

  • Device 表示磁盘名称
  • tps 表示每秒IO数(即IOPS,磁盘每秒读写次数之和)
  • kB_read/s 表示每秒从磁盘读取数据大小,单位 KB/s
  • kB_wrtn/s 表示每秒向磁盘写入数据大小,单位 KB/s
  • kB_read 表示从磁盘读取的数据总量,单位 KB
  • kB_wrtn 表示向磁盘写入的数据总量,单位 KB

iotop

iotop命令查看io利用最高的进程,使用 iotop -oP 命令,-o 表示只显示有io消耗的进程,-P 表示只显示进程,iostat默认是显示所有线程。查看到如下的案例结果:

Total DISK READ :     135.42 K/s | Total DISK WRITE :      73.87 K/s
5.582 KDISK READ:     135.42 K/s | Actual DISK WRITE:       0.00 B/s
  PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN  IO>    COMMAND                                                      
 9016 be/4 test1     67.71 K/s   16.41 K/s  0.00 %  0.31 % nginx: worker process
 9018 be/4 test1     67.71 K/s   18.47 K/s  0.00 %  0.10 % nginx: worker process
 9015 be/4 test1      0.00 B/s   12.31 K/s  0.00 %  0.00 % nginx: worker process
 9019 be/4 test1      0.00 B/s    4.10 K/s  0.00 %  0.00 % nginx: worker process
 9017 be/4 test1      0.00 B/s    2.05 K/s  0.00 %  0.00 % nginx: worker process

如果是想要显示累计的io消耗可以使用命令 iotop -oPa


pidstat

pidstat用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等,使用 pidstat -d 1 命令,每隔一秒进行查看统计信息,例如如下的案例结果:

Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm)  05/23/2020      _x86_64_        (4 CPU)

09:54:17 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:54:17 AM     0         1    0.00    0.01    0.00    0.01     1  systemd

pidstat -r -p 29461 2 1输出内存字段信息的时候,内容如下:

Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm)  05/23/2020      _x86_64_        (4 CPU)

10:13:03 AM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:13:05 AM 30000     29461      0.00      0.00   45848   1820   0.02  nginx

针对上面输出的字段解释:

  • minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
  • majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生

pidstat [option] [${采样周期}] [${采样次数}] 表示按照一定的采样周期执行一定的采样次数的该命令,例如 pidstat 2 5 表示每2秒执行一次该命令,一共执行5次。

常用的参数如下:

  • -u 表示输出cpu使用情况,与直接使用pidstat结果一样
  • -r 表示输出内存使用情况
  • -d 表示输出io使用情况
  • -p 表示指定特定的进程pid的使用情况
  • -h 表示将输出结果在一行中展示,例如如果想要将 -u -r -d 都输出的情况,并且放在一行中显示便于导出数据
  • -t 表示列出线程的统计信息

例如pidstat -r -p 29461 1表示每隔一秒输出进程pid为29461的内存使用情况


ps

ps命令用于查看进程的瞬间资源使用情况,运行时间,使用cpu的时间等等信息都可以查看到,常用的命令如下

ps -eo pid,tty,user,comm,lstart,etime | grep redis 通过 -o 来输出指定的字段信息,-e表示输出所有的进程,其中一些输出字段的说明如下:

  • pid 表示进程PID
  • tty 表示终端号
  • user 表示创建进程的用户名
  • comm 表示进程命令
  • lstart 表示进程启动的时间点
  • etime 表示进程运行时间,格式为 dd-hh:mm:ss

ps -aux 用BSD的格式来显示进程,显示的项目有

  • USER 表示创建进程的用户名
  • %CPU 表示进程占用cpu的百分比
  • %MEM 表示进程占用内存的百分比
  • VSZ 表示进程使用虚拟内存(单位为KB)
  • RSZ 表示进程使用物理内存(单位为KB)
  • STAT 表示进程的状态
  • START 表示进程的启动时间点
  • TIME 表示进程占用cpu的时间

ps -ef 用于标准的格式输出,显示的项目有

  • UID 表示创建进程的用户名
  • PID 表示进程PID
  • PPID 表示该进程的父进程的PID
  • C 表示cpu使用利用率,是 %CPU 的整数部分
  • STIME 表示进程启动的时间点
  • TTY 表示终端号
  • TIME 表示进程占用cpu的时间
  • CMD 表示进程命令

重要说明:

psvmstat获取到的cpu利用率都是不准的,所以如果想要查看进程占用cpu的使用情况,还是得使用top命令。
ps看到的cpu利用率是自进程运行以来累计的cpu占用率。
ps|vmstat|top这三者查看到的cpu利用率的大致关系如下:vmstat的100%-idle == ps的cpu占用率/cpu核心数 == top的cpu占用率/cpu核心数/物理cpu数目
但是要想确认cpu的具体使用情况,还是得看top。另外内存的使用ps和top的查看结果是一致的

cpu核数计算

cpu总核数 = 物理cpu数目 * 每颗物理cpu的核数
总逻辑cpu数 = 物理cpu数 * 每颗物理cpu的核数 * 超线程数

如何查看物理cpu数目

cat /proc/cpuinfo | grep 'physical id' | sort | uniq

如何查看每颗物理cpu的核数

cat /proc/cpuinfo | grep 'cpu cores' | sort | uniq

如何查看总逻辑cpu数

cat /proc/cpuinfo | grep 'processor'

如何查看cpu型号

cat /proc/cpuinfo | grep 'name'

如何查看每个逻辑cpu的所在物理cpu的id和核id

cat /proc/cpuinfo | egrep 'physical id|core id'

你可能感兴趣的:(cpu | 内存 | IO使用问题排查命令详解)