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'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342