Linux操作系统中,有一些可用于监控和管理 Linux 系统性能的免费工具,显示系统当前运行状态,负载,I/O等信息,帮助管理员实时了解系统运行动态,以及排除故障。本文主要介绍Linux 常用系统性能查看分析工具。

1、查看进程信息

1)top命令

可以实时监控系统性能资源占用情况:

# top
top - 14:59:21 up 2 days, 19:39, 2 users, load average: 0.05, 0.04, 0.05
Tasks: 98 total, 1 running, 97 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882864 total, 209636 free, 921580 used, 751648 buff/cache
KiB Swap: 2097148 total, 2090228 free, 6920 used. 762056 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21974 root 20 0 161856 2232 1556 R 0.7 0.1 0:00.05 top
1279 mongod 20 0 1478804 514904 5232 S 0.3 27.3 26:48.47 mongod
1 root 20 0 125856 3460 1728 S 0.0 0.2 1:06.74 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:11.20 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh

进入交互模式后:

输入M,进程列表按内存使用大小降序排序;

输入P,进程列表按CPU使用大小降序排序;

top第三行显示当前系统的,其中有两个值很关键:

id:空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈;

wa:等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈;

2)ps命令

显示进程状态,快照方式显示,进程分为两类:一类是用户通过终端启动的进程,一类是与终端无关的进程,多为守护进程。

ps命令选项

与终端有关的进程

 与终端无关的进程

 显示是哪个用户启动的

-e 

 显示所有进程

-f 

完整格式列表显示信息

-F 

显示额外信息

-H 

显示进程层次结构

-o 

自定义显示信息

# ps aux | more -20
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 125856 3460 ? Ss 10月14 1:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 10月14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10月14 0:11 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10月14 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 10月14 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 10月14 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 10月14 0:46 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 10月14 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 10月14 0:02 [watchdog/0]
root 13 0.0 0.0 0 0 ? S 10月14 0:00 [kdevtmpfs]
root 14 0.0 0.0 0 0 ? S< 10月14 0:00 [netns]
root 15 0.0 0.0 0 0 ? S 10月14 0:00 [khungtaskd]
root 16 0.0 0.0 0 0 ? S< 10月14 0:00 [writeback]
root 17 0.0 0.0 0 0 ? S< 10月14 0:00 [kintegrityd]
root 18 0.0 0.0 0 0 ? S< 10月14 0:00 [bioset]
root 19 0.0 0.0 0 0 ? S< 10月14 0:00 [kblockd]
root 20 0.0 0.0 0 0 ? S< 10月14 0:00 [md]
root 21 0.0 0.0 0 0 ? S< 10月14 0:00 [edac-poller]
root 27 0.0 0.0 0 0 ? S 10月14 0:02 [kswapd0]
--More--

说明:

USER: 进程相关用户

PID: 进程号

%CPU: CPU占用百分比

%MEM: 内存占用百分比

VSZ: 占用虚拟内存大小

RSS: 常驻内存集,不可被交换的内存

TTY: 与哪个终端相关

STAT: 进程状态

R:运行状态

S:可中断睡眠

D:不可中断睡眠

T:停止的

Z:僵尸进程

s:会话首进程

+:前台进程

l: 多线程进程

N:低优先级进程

<: 高优先级进程

START:启动运行时间

TIME:运行时长

COMMAND:由哪个命令启动的此进程,如果COMMAND包含在方括号中,则表示是内核进程

# ps -ef | more -15
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10月14 ? 00:01:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 10月14 ? 00:00:00 [kthreadd]
root 3 2 0 10月14 ? 00:00:11 [ksoftirqd/0]
root 5 2 0 10月14 ? 00:00:00 [kworker/0:0H]
root 7 2 0 10月14 ? 00:00:00 [migration/0]
root 8 2 0 10月14 ? 00:00:00 [rcu_bh]
root 9 2 0 10月14 ? 00:00:46 [rcu_sched]
root 10 2 0 10月14 ? 00:00:00 [lru-add-drain]
root 11 2 0 10月14 ? 00:00:02 [watchdog/0]
root 13 2 0 10月14 ? 00:00:00 [kdevtmpfs]
root 14 2 0 10月14 ? 00:00:00 [netns]
root 15 2 0 10月14 ? 00:00:00 [khungtaskd]
root 16 2 0 10月14 ? 00:00:00 [writeback]
root 17 2 0 10月14 ? 00:00:00 [kintegrityd]
--More--

说明:

PPID:父进程

STIME:启动时间

TIME: 执行累计时间

# ps axo pid,command | more -15
PID COMMAND
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
2 [kthreadd]
3 [ksoftirqd/0]
5 [kworker/0:0H]
7 [migration/0]
8 [rcu_bh]
9 [rcu_sched]
10 [lru-add-drain]
11 [watchdog/0]
13 [kdevtmpfs]
14 [netns]
15 [khungtaskd]
16 [writeback]
17 [kintegrityd]
--More--
# ps -ef | grep nginx
root 23146 814 0 15:20 ? 00:00:00 nginx: master process /bin/nginx -g daemon off;
www 23148 23146 0 15:20 ? 00:00:00 nginx: worker process
root 23180 21928 0 15:20 pts/0 00:00:00 grep --color=auto nginx

3)pgrep命令

pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。

选项

描述

-o

仅显示找到的最小(起始)进程号;

-n

仅显示找到的最大(结束)进程号;

-l

显示进程名称;

-P

指定父进程号;

-g

指定进程组;

-t

指定开启进程的终端;

-u

指定进程的有效用户ID。

例如,

显示最小进程号的一个nginx进程:

# pgrep -lo nginx
23362 nginx

显示最大进程号的一个nginx进程:

# pgrep -ln nginx
23364 nginx

列出所有nginx进程:

# pgrep -l nginx
23362 nginx
23364 nginx

列出所有nginx进程,不显示进程名:

# pgrep nginx
23362
23364

2、查看内存信息

1)free命令

# free -h
total used free shared buff/cache available
Mem: 1.8G 959M 109M 32M 769M 683M
Swap: 2.0G 6.8M 2.0G

说明:

Mem

行(第二行)是内存的使用情况。

Swap

行(第三行)是交换空间的使用情况。

total

列显示系统总的可用物理内存和交换空间大小。

used

列显示已经被使用的物理内存和交换空间。

free

列显示还有多少物理内存和交换空间可用使用。

shared

列显示被共享使用的物理内存大小。

buff/cache

列显示被 buffer 和 cache 使用的物理内存大小。

available

列显示还可以被应用程序使用的物理内存大小。

2)vmstat命令

虚拟内存状态信息:

选项

含义

-fs

-f:显示从启动到目前为止,系统复制(fork)的程序数,

此信息是从 /proc/stat 中的 processes 字段中取得的。

-s:将从启动到目前为止,

由一些事件导致的内存变化情况列表说明。

-S 单位

令输出的数据显示单位,

例如用 K/M 取代 bytes 的容量。

-d

列出硬盘有关读写总量的统计表。

-p 分区设备文件名

查看硬盘分区的读写情况。

例如,

使用vmstat命令,每隔3秒刷新一次,共刷新5次:

# vmstat 3 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 6920 111488 0 788316 0 0 58 35 128 144 2 1 97 0 0
0 0 6920 111488 0 788316 0 0 0 0 529 771 0 1 99 0 0
0 0 6920 111488 0 788316 0 0 0 0 532 773 1 1 99 0 0
0 0 6920 111488 0 788316 0 0 0 0 525 767 1 0 99 0 0
0 0 6920 111488 0 788316 0 0 0 14 537 765 1 1 98 0 0

说明:

字段

含义

procs

进程信息字段:

-r:等待运行的进程数,数量越大,系统越繁忙。

-b:不可被唤醒的进程数量,数量越大,系统越繁忙。

memory

内存信息字段:

-swpd:虚拟内存的使用情况,单位为 KB。

-free:空闲的内存容量,单位为 KB。

-buff:缓冲的内存容量,单位为 KB。

-cache:缓存的内存容量,单位为 KB。

swap

交换分区信息字段:

-si:从磁盘中交换到内存中数据的数量,单位为 KB。

-so:从内存中交换到磁盘中数据的数量,单位为 KB。

这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。

io

磁盘读/写信息字段:

-bi:从块设备中读入的数据的总量,单位是块。

-bo:写到块设备的数据的总量,单位是块。

这两个数越大,代表系统的 I/O 越繁忙。

system

系统信息字段:

-in:每秒被中断的进程次数。

-cs:每秒进行的事件切换次数。

这两个数越大,代表系统与接口设备的通信越繁忙。

cpu

CPU信息字段:

-us:非内核进程消耗 CPU 运算时间的百分比。

-sy:内核进程消耗 CPU 运算时间的百分比。

-id:空闲 CPU 的百分比。

-wa:等待 I/O 所消耗的 CPU 百分比。

-st:被虚拟机所盗用的 CPU 百分比。

3、查看硬盘IO信息

使用iostat命令可以查看硬盘相关信息:

安装:

yum -y install sysstat

选项:

-C

显示CPU使用情况

-d

显示磁盘使用情况

-k

以KB为单位显示

-m

以M为单位显示

-N

显示磁盘阵列(LVM)信息

-n

显示NFS

-p[磁盘]

显示磁盘和分区的情况

-t

显示终端和CPU的信息

-x

显示详细信息

-V

显示版本信息

例如,

# iostat
Linux 3.10.0-862.el7.x86_64 (kvm1.cjavapy.com) 2021年10月17日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.61 0.00 0.93 0.03 0.01 97.42
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.81 58.51 35.62 14298971 8706042
dm-0 0.82 58.38 35.57 14269347 8693791
dm-1 0.01 0.01 0.04 2228 10112

cpu属性值说明:

%user:CPU处在用户模式下的时间百分比。

%nice:CPU处在带NICE值的用户模式下的时间百分比。

%system:CPU处在系统模式下的时间百分比。

%iowait:CPU等待输入输出完成时间的百分比。

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

%idle:CPU空闲时间百分比。

disk属性值说明

rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s

wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s

r/s: 每秒完成的读 I/O 设备次数。即 rio/s

w/s: 每秒完成的写 I/O 设备次数。即 wio/s

rsec/s: 每秒读扇区数。即 rsect/s

wsec/s: 每秒写扇区数。即 wsect/s

rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。

wkB/s: 每秒写K字节数。是 wsect/s 的一半。

avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。

avgqu-sz: 平均I/O队列长度。

await: 平均每次设备I/O操作的等待时间 (毫秒)。

svctm: 平均每次设备I/O操作的服务时间 (毫秒)。

%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

4、iftop和dstat命令

iftop是流量监控工具,dstat是全能型监控工具。

1)iftop命令

安装

yum -y install iftop

命令选项

-i

指定要监控的网卡设备名

-B

以bytes为单位显示流量

-n

不显示主机名而是显示IP地址

-N

说是默认显示端口,我也始终没看明白怎么用(don'tconvert port numbers to services)

-F

指定显示某网段的流量

2)dstat

安装

yum -y install dstat

命令选项

-c

显示cpu统计数据

-d

 显示磁盘数据

-g

 显示page的统计数据

-i

 显示中断的数据

-m

显示内存

-s

 交换内存

-p

 显示进程队列

--ipc

显示进程间消息队列,信号量和共享内存的使用情况

-DDISK

只显示指定disk的统计数据

-y

 系统状态数据

-n

 显示网络接口

-Neth0

仅显示指定网络接口的使用情况

-f

以完整格式显示所有信息

推荐文档