[TOC]
综合状态
top 命令
显示进程详细信息
top [选项]
选项
-p <pid> 只查看指定进程号的信息
-u, -U <user> 只查看属于指定用户的进程信息
-d <sec> 设置自动刷新延迟时间, 默认是每3秒自动刷新
-b 批量操作模式, 常用于脚本. 一般与 -n 指定输出次数, -d 指定间隔时间
-n top 最大输出次数
运行界面可执行的命令
展示数据
1 详细展示每个逻辑cpu的使用情况.
c 展示详细的 Command 列
m 切换内存信息展示(在具体数值和百分比之间切换)
E 切换内存(Mem 和 Swap行)的单位
e 切换内存(VIRT, RES, SHR)的单位(byte, m, g, t, p)
排序
M CPU使用从大到小
P 内存使用从大到小
交互
s <刷新延迟> 自定义刷新延迟时间, 默认是每3秒自动刷新.
字段解释
第一行
top - 22:39:55 up 7:07, 2 users, load average: 1.39, 1.22, 1.16
距本次开机已运行时长 平均负载 1分钟 5分钟 15分钟
第二行(当前显示的进程数量及运行状态)
Tasks: 202 total, 3 running, 199 sleeping, 0 stopped, 0 zombie
当前共202个进程 有3个处于运行状态 199个处于休眠状态
第三行(cpu使用情况)
%CPU(s): 18.3 us, 29.0 sy, 0.0 ni, 52.1 id, 0.2 wa, 0.0 hi, 0.4 si, 0.0 st
cpu用于用户计算的比例 用于进程状态交互的比例 空闲比例 IO等待比例
第四行(内存状态)
KiB Mem: 1361956 total, 145060 free, 689800 used, 527096 buff/cache
总内存量 未被使用的内存 已使用的内存 用于读写缓存的内存
第五行(交换分区状态)
Kib Swap: 2097148 total, 2077948 free, 19200 used. 386368 avail Mem
交换分区大小 已使用的交换分区 可用内存数量.
第六行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
由内核控制(受NI影响) 进程优先级(NICE) 状态 进程实际运行时间
平均负载: 衡量系统的繁忙程度
理想状态:每个cpu上都有一个活跃进程,即平均负载数等于cpu数
过载经验值:平均负载高于cpu数量70%的时候
第六行的
RES: 常驻内存, 即虚拟内存实际映射到物理内存的大小.
SHR: 占用的内存中属于共享内存的大小. 比如一些外部动态库仅会在内存中加载一份, 多个进程在其虚拟内存空间中这部分地址实际就映射到同一块物理内存地址.
也就是要计算单独某个进程占用的内存大小, 应该用 RES - SHR
这部分可参考: https://www.orchome.com/298
若是将共享内存占用的内存大小平摊给依赖它的进程, 此时各个进程占用内存 PSS = RES + SHR/共享进程数量
可以安装 smem 以方便查看进程的 PSS 值.
S: 进程的状态, 其可能的取值如下
T stopped 状态
R running 状态
S sleeping 状态
ps 命令
ps(process status)
查看当前运行的进程的一个快照
ps [选项]
常用示例
ps -ef
ps -eLf 查看所有线程信息(会包括LWP和NLWP列)
列解释
UID 有效用户id
PID 进程号
PPID 父进程号
C
STIME
TTY 执行该进程的终端. pts 是虚拟终端, tty 是字符终端(init 3).
TIME 进程运行时间(该值不具有参考价值)
LWP 轻量级进程(线程)
NLWP
选项
基本参数
-A, -e 显示所有进程(默认只能查看到当前终端下的进程. 要理解, 进程是树形结构的.)
-a 显示归属在终端下的所有进程
-p <进程号> 只显示指定进程号的相关信息
-C <进程名>
过滤
-U <user> # 根据创建进程的用户来筛选
-u <user> # 根据进程所属用户来筛选(和 -U 是有区别的)
-C <command> # 根据进程执行的命令(不包含参数)来精确匹配
-L <pid> # 查看特定进程的所有线程
输出格式
-f # 详细输出
-F # 更详细输出
-o # 自定义字段, 可使用的字段如下
# pid,user,args, cmd, tty, comm, command, fname, ucmd, ucomm, lstart, bsdstart, start 等
u # 面向用户的字段, 包含 %CPU, %MEM 等信息
排序
--sort [-+]<item> # + 表示从小到大排序(默认)
# - 表示从大到小排序
# 以下可以混合使用, 比如 --sort -pcpu,+pmem
# pcpu 按 cpu 使用排序
# pmem 按内容使用率排序
常用
标准语法 - 查看所有进程信息
ps -e # 简略信息
ps -ef # 详细信息
ps -eF # 完整信息(包含内存占用等)
ps -e u # 面向用户的信息(包含内存占用, CPU使用等)
BSD语法 - 查看所有进程信息
ps ax # 简略信息
ps aux # 完整信息
显示进程的树形结构
ps -ejH
ps axjf
输出列字段
PID 进程ID
TTY 所在终端
TIME 命令所占用的 CPU 处理时间
CMD 进程所运行的命令
参考: https://blog.csdn.net/baidu_3...
sar 命令
查看系统综合状态
sar [选项] [<interval> <count>]
采样间隔 采样次数
示例
sar -u 1 10
sar -r 1 10
sar -b 1 10
sar -dp 1 10 # 查看所有块设备的读写情况, 每秒采样1次, 共采样10次.
选项
文件
-f <file> # 从指定文件(二进制格式)获取数据来源(若未指定采样间隔, 默认是当天的统计信息)
# -f /var/log/sysstat/sa02
# -f /var/log/sa/sa02 # Centos 6
-o <file> # 指定采样间隔后, 将采样数据写入指定文件(二进制格式)
时间过滤
-s <hh:mm:ss> # 指定天的开始时间(不包含, 因此默认需往前推10分钟)
-e <hh:mm:ss> # 指定天的结束时间
资源
-u # 报告CPU利用率情况, 可用 ALL 参数来输出更多字段
-q # 报告任务队列长度和平均负载(1,5,15)
-r # 输出内存和交换空间的统计信息
-b # 总体IO
-d # 通常配合 -p. 报告每一个块设备的活动状态.
显示格式
-p # 通常配合 -d. 打印出块设备名, 而非默认的 "device m-n" 格式.
系统默认保存最近28天的日志, 默认位置 /var/log/sa/
sa
二进制数据(使用sar -f
读取数据)sar
文本数据
sar -n DEV
输出结果说明
IFACE:LAN接口
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包
rxerr/s:每秒钟接收的坏数据包
txerr/s:每秒钟发送的坏数据包
coll/s:每秒冲突数
rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
txcarr/s:发送数据包时,每秒载波错误数
rxfram/s:每秒接收数据包的帧对齐错误数
rxfifo/s:接收的数据包每秒FIFO过速的错误数
txfifo/s:发送的数据包每秒FIFO过速的错误数
配置 /etc/sysconfig/sysstat
# 保存的历史文件(单位是天), 超过28天的则会分目录存放
HISTORY=28
详解
怀疑CPU存在瓶颈,可用 sar -u
和 sar -q
等来查看
怀疑内存存在瓶颈,可用 sar -B
、sar -r
和 sar -W
等来查看
怀疑I/O存在瓶颈,可用 sar -b
、sar -u
和 sar -d
等来查看
CPU 使用情况 -u
# sar -u
09:50:01 AM CPU %user %nice %system %iowait %steal %idle
10:00:01 AM all 1.56 0.00 0.75 0.04 0.00 97.65
10:10:01 AM all 10.66 0.00 5.20 0.09 0.00 84.05
10:20:01 AM all 55.09 0.00 25.19 0.07 0.00 19.65
10:30:01 AM all 49.52 0.00 22.84 0.09 0.00 27.55
10:40:01 AM all 43.41 0.00 20.48 0.11 0.00 36.00
10:50:01 AM all 39.49 0.00 19.01 0.12 0.00 41.38
Average: all 33.19 0.00 15.53 0.09 0.00 51.20
%user
: 用户空间的CPU使用%nice
: 改变过优先级的进程的CPU使用率%system
: 内核空间的CPU使用率%iowait
: CPU等待IO的百分比%steal
: 虚拟机的虚拟机CPU使用的CPU%idle
: 空闲的CPU
情景:
- 若
%iowait
太高, 则表示 I/O 存在瓶颈 - 若
%idle
太低, 则表示 CPU 使用率高
队列长度与平均负载 -q
# sar -q
09:50:01 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
10:00:01 AM 5 338 0.24 0.14 0.12 0
10:10:01 AM 11 416 3.90 1.54 0.71 0
10:20:01 AM 15 473 11.36 11.03 6.26 1
10:30:01 AM 7 474 8.14 9.77 8.00 0
10:40:01 AM 12 473 6.39 7.26 7.53 0
10:50:01 AM 15 453 4.53 5.88 6.94 0
Average: 11 438 5.76 5.94 4.93 0
输出内容详解:
runq-sz
:运行队列的长度(等待运行的进程数);plist-sz
:进程列表中进程(processes)和线程(threads)的数量;ldavg-1
:最后1分钟的系统平均负载;ldavg-5
:过去5分钟的系统平均负载;ldavg-15
:过去15分钟的系统平均负载;blocked
:当前阻塞的进程数量,在等待IO完成;
输出内存和交换空间 -r
# sar -r
09:50:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
10:00:01 AM 8902892 23876908 72.84 2080 12331564 7143804 21.79 7354428 7190496 224
10:10:01 AM 8496696 24283104 74.08 2080 12394360 7846800 23.94 7685000 7169248 1980
10:20:01 AM 7986260 24793540 75.64 2080 12430912 8486280 25.89 7984868 7146152 2120
10:30:01 AM 7804560 24975240 76.19 2080 12488140 8087856 24.67 7975640 7158088 1592
10:40:01 AM 7588988 25190812 76.85 2080 12588572 8190552 24.99 7976948 7214956 1388
10:50:01 AM 7534756 25245044 77.01 2080 12639652 7722896 23.56 7879740 7228132 1176
Average: 8052359 24727441 75.43 2080 12478867 7913031 24.14 7809437 7184512 1413
输出内容详解:
kbmemfree
:这个值和free
命令中的free
值基本一致,所以它不包括buffer
和cache
的空间;kbmemused
:这个值和free
命令中的used
值基本一致,所以它包括buffer
和cache
的空间;%memused
:这个值是kbmemused
和内存总量(不包括swap)的一个百分比;kbbuffers
:这两个值就是free
命令中的buffer
;kbcached
:这两个值就是free
命令中的cache
;kbcommit
:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM + swap);%commit
:这个值是kbcommit
与内存总量(包括swap)的一个百分比;kbactive
:活动内存量(以千字节计算)(最近使用的内存,通常不会被收回,除非绝对必要);kbinact
:不活动内存量(以千字节计算的内存(最近使用的内存),更有资格被用于其他目的);kbdirty
:以KB为单位的内存量等待写入磁盘;
pidstat 命令
磁盘 IO
建议排查顺序
查看设备总体利用率情况
iostat -xt 1
查看是哪个进程在占用磁盘 IO
iotop
iostat 命令
快速查看磁盘设备的当前使用繁忙程度
查看 CPU 及设备/分区的使用情况
iostat [ options ] [ <interval> [ <count> ] ]
iostat -xcdmt 1
选项
-x: 显示扩展状态(包含 -c, -d, -k)
-t: 显示每个报告产生时的时间
-m: 以兆字节每秒为单位,而不使用块每秒
-k: 以千字节每秒为单位,而不使用块每秒
-c: 显示CPU使用情况
-d: 显示设备利用率
重点关注如下指标:
标示 | 说明 |
---|---|
%iowait | CPU等待IO时间占用CPU总时间的百分比 |
Device | 监测设备名称 |
rMB/s | 每秒实际读取的大小,单位为KB |
wMB/s | 每秒实际写入的大小,单位为KB |
avgrq-sz | 需求的平均大小区段 |
avgqu-sz | IO请求的平均队列长度 |
await | IO请求平均响应时间(队列排队时间+IO处理时间),一般系统 I/O 响应时间应该低于 5ms,如果大于 10ms 就比较大了 |
svctm | IO处理时间,即寻道 + 旋转延迟时间; |
%util | 磁盘繁忙程度。 例如,如果统计间隔 1 秒,该设备有 0.8 秒在处理 I/O,而 0.2 秒闲置,那么该设备的 %util = 0.8/1 = 80%; |
iotop 命令
快速查看各个进程对于磁盘 IO 的读写情况
iotop
选项
-d SEC, --delay=SEC #设置显示的间隔秒数,支持非整数值
-p PID, --pid=PID #只显示指定PID的信息
-u USER, --user=USER #显示指定的用户的进程的信息
-o, --only #显示进程或者线程实际上正在做的I/O,而不是全部的,可以随时切换按o
-a, --accumulated #显示从iotop启动后每个线程完成了的IO总数
# 非交互模式
-b, --batch #运行在非交互式的模式
-t, --time # batch模式, 在每一行前添加一个当前的时间
-n NUM, --iter=NUM #在非交互式模式下,设置显示的次数,
# 比较少用的选项
--version #显示版本号
-h, --help #显示帮助信息
-P, --processes # 只显示进程(默认会展示所有的线程) (建议以默认的查看所有线程的方式, 否则会有遗漏)
-k, --kilobytes #以千字节显示(默认是按照 human 方式)
-q, --quiet #suppress some lines of header (implies --batch). This option can be specified up to three times to remove header lines.
-q column names are only printed on the first iteration,
-qq column names are never printed,
-qqq the I/O summary is never printed.
操作按键
a: 显示累积使用量 (--accumulated)
o: 只显示有io的进程/线程 (--only)
p: 进程/线程显示切换 PID/TID, 默认是 TID (--processes)
i:改变线程的优先级
r:反向排序
使用left和right改变排序
q:退出
网络
建议排查顺序
查看网络总体使用情况
nload -u h eth0
查看是哪个进程占用网络
nethogs
查看是哪个 ip:port 在占用网络
iftop -i eth0 -nNPB
需要根据端口号来判断.
nload 命令
查看总体带宽使用情况
nload [选项] [<device>]
说明
不指定 <device> 时会显示所有网络设备
选项
-t <interval> # 刷新间隔(毫秒), 默认是 500毫秒, 设置小于100毫秒时会不精确.
-u h|H|b|B|k|K|m|M|g|G # 每秒的流量单位, 默认是 k.
# h auto, human readable
# b Bit/s
# k kBit/s
# m MBit/s
# g GBit/s
# 大写的 bkmg 是用 Byte 为单位, 而非 Bit.
-U h|H|b|B|k|K|m|M|g|G # 累计流量单位, 默认是 M.
nethogs
按照进程统计流量
nethogs [选项] [device [device ...]]
运行时交互
m # 修改单位
r # 按流量排序
s # 按发送流量排序
q # 退出命令提示符
选项|参数
-v <mode> # 切换显示单位,默认是默认是KB/s(0表示 KB/s,1表示KB,2表示B,3表示MB)
-c # 检测次数(后面直接跟数字)
-a # 检测所有的设备
-d # 延迟更新刷新速率,以秒为单位。默认值为 1.
-t # 跟踪模式.
-b # bug 狩猎模式 — — 意味着跟踪模式.
-V # 显示版本信息,注意是大写字母V.
-p # 混合模式(不推荐).
device # 要监视的设备名称. 默认为 eth0
iftop 命令
按照 ip:port 统计流量
iftop [选项]
选项
网卡
-i <网卡> # 指定只解析网络接口
主机名
-n # ip不解析成域名
端口
-P # 显示通信双方的端口号
-N # 端口号不解析成服务名
-B # 使用 byte 而不是默认的 bit
输出结果解释
第三列
51Kb 40.0Kb 22.0Kb
本机 2s 10s 40s 的平均流量
epel 源提供.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。