本文的核心内容:系统性能排查需要关注的资源,以及我们在排查系统层面需要掌握的Linux命令。
对操作系统来说我们需要关注以下资源:当这些资源出现问题则会影响我们的应用,我们应该先从系统的层面去判断排查是否存在性能瓶颈。最后再落实到具体应用中,排查应用存在的瓶颈问题。
中央处理器CPU
- 通过top命令,观测CPU性能
- 通过负载,评估CPU任务执行的排队情况 (uptime)
- 通过vmstat,看CPU的繁忙程度 (上下文切换)
内存
- top命令
VIRT 这里是指虚拟内存,一般比较大,不用过多关注
RES 这里代表进程的实际占用内存
SHR 共享内存,比一些可以服用的一些so文件等
- free命令 总内存-使用内存-可用内存
磁盘
- df命令查看磁盘挂载以及容量
- du命令文件目录磁盘占用问题
I/O设备
- 通过iostat查看是否存在IO瓶颈
TOP命令
系统管理员可用运行top命令监视进程和Linux整体性能。
第一行:进程信息统计
Processes: 308 total, 2 running, 306 sleeping, 1187 threads
进程总数、正在运行的进程、睡眠的进程、线程总数。
第二行:任务队列信息,同uptime命令的执行结果一样
22:56 up 1:41, 3 users, load averages: 1.65 1.78 2.21
1:41, 3 users, [系统运行时间、用户数量]
22:55:14 Load Avg: 1.63, 1.89, 2.30 [当前时间。 系统负载即:任务队列的平均长度。]
第三行:CPU信息统计数据
CPU usage: 1.45% user, 1.57% sys, 96.96% idle
动态指标包含
Pid command %CPU time mem Ppid
PS命令 (查看系统进程)
PS,是Linux系统命令之一,是在Linux中是查看进程的命令。
ps查看正处于Running的进程,ps aux查看所有的进程,-ef 全格式全进程。
ps -ef|grep <进程名> 查看并筛选 跟进程名有关的进程,该进程名可以是进程的全部或者部分。
linux操作系统,进程有五种状态
- 运行状态(正在运行或在运行队列中等待[就绪队列])
- 中断状态(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断状态(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死状态(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止状态(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
uptime命令(系统负载情况)
[root@VM_0_5_centos ~]# uptime
21:45:27 up 55 days, 5:10, 1 user, load average: 0.16, 0.12, 0.08
#当前服务器时间: 21:45:27
#当前服务器运行时长 55 days, 5:10,
#当前用户数 1 user
#当前的负载均衡 load average: 0.16, 0.12, 0.08 分别取1min,5min,15min的均值
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用'wait')
- 没有被停止(例如:等待终止)
一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重.
free命令(系统内存情况)
free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。 【total - used - available】
[root@VM_0_5_centos ~]# free
total used free shared buff/cache available
Mem: 1882148 451480 89788 584 1340880 1242608
Swap: 0 0 0
如果加上 -h 选项,输出的结果会友好很多
[root@VM_0_5_centos ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 440M 99M 576K 1.3G 1.2G
Swap: 0B 0B 0B
有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:
[root@VM_0_5_centos ~]# free -h -s 3
total used free shared buff/cache available
Mem: 1.8G 463M 76M 576K 1.3G 1.2G
Swap: 0B 0B 0B
total used free shared buff/cache available
Mem: 1.8G 463M 76M 576K 1.3G 1.2G
Swap: 0B 0B 0B
total used free shared buff/cache available
Mem: 1.8G 466M 73M 576K 1.3G 1.2G
Swap: 0B 0B 0B
上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。
输出简介
Mem
行是物理内存使用情况 (实际内存)Swap
行是虚拟内存作用情况used
列为已分配内存 (used = total – free – buff/cache)free
列为未分配的内存 (free = total – used – buff/cache)total
列为物理内存总量shared
列为共享内存Buff/cach列
缓冲区和缓存总的使用内存量available
列可用于启动新应用的可用内存量
vmstat命令(虚拟内存统计)
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
[root@VM_0_5_centos ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 86372 20352 1300996 0 0 7 38 9 7 1 1 98 0
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap(交换分区):
so: 每秒写入交换区的内存大小
si: 每秒从交换区写到内存的大小
IO(现在的Linux版本块的大小为1024bytes):
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。【interrupt】
cs: 每秒上下文切换数。 【count/second】
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间
df命令(查看分区磁盘空间)
[root@VM_0_5_centos ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 930392 0 930392 0% /dev
tmpfs 941072 24 941048 1% /dev/shm
tmpfs 941072 548 940524 1% /run
tmpfs 941072 0 941072 0% /sys/fs/cgroup
/dev/vda1 51473888 10202572 38633568 21% /
tmpfs 188216 0 188216 0% /run/user/0
[root@VM_0_5_centos ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 24K 919M 1% /dev/shm
tmpfs 920M 548K 919M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/vda1 50G 9.8G 37G 21% /
tmpfs 184M 0 184M 0% /run/user/0
只要是含有tmpfs都是临时文件系统
查看以inode的数量显示
当我们的inode使用已经达到百分百时,即使我们的磁盘空间还是有剩余,我们也是写不了数据到磁盘的
什么是inode?(存储文件元信息的"索引节点")
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode包含文件的元信息,具体来说有以下内容:
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个inode
- 文件数据block的位置
我们可以通过stat命令查看文件的元信息。
[root@VM_0_5_centos ~]# stat record.txt
文件:"record.txt"
大小:1129 块:8 IO 块:4096 普通文件
设备:fd01h/64769d Inode:393382 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-07-15 19:32:38.386897140 +0800
最近更改:2020-07-15 19:32:38.386897140 +0800
最近改动:2020-07-15 19:32:38.390897141 +0800
创建时间:-
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
inode号码是什么?
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或 者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号 码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
inode的特殊作用?
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时 候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode则被回收。
du命令(查看文件/目录的所占磁盘空间大小)
[root@VM_0_5_centos ~]# du -h record.txt
4.0K record.txt
以易读方式显示文件夹内及子文件夹大小
[root@VM_0_5_centos ~]# du -h rar/
2.4M rar/
#以易读方式显示文件夹内所有文件大小
[root@VM_0_5_centos ~]# du -ah rar/
4.0K rar/makefile
16K rar/whatsnew.txt
8.0K rar/acknow.txt
8.0K rar/license.txt
272K rar/unrar
480K rar/rar
12K rar/technote.txt
164K rar/default.sfx
96K rar/rar.txt
4.0K rar/rarfiles.lst
1.3M rar/rar_static
4.0K rar/readme.txt
4.0K rar/order.htm
2.4M rar/
iostat命令(I/O性能评测)
# iostat属于sysstat软件包。可以直接安装。
yum install sysstat
[root@VM_0_5_centos ~]# iostat
Linux 3.10.0-1127.13.1.el7.x86_64 (VM_0_5_centos) 2020年11月23日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.72 0.00 0.68 0.10 0.00 98.49
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 5.28 6.58 38.48 31298669 183158188
scd0 0.00 0.00 0.00 316 0
单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值。重点关注iowait值,表示CPU用于等待io请求的完成时间。
- %user:CPU处在用户模式下的时间百分比。
- %nice:CPU处在带NICE值的用户模式下的时间百分比。
- %system:CPU处在系统模式下的时间百分比。
- %iowait:CPU等待输入输出完成时间的百分比。
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
- %idle:CPU空闲时间百分比。
Device: 各磁盘设备的IO统计信息。各列含义如下:
- Device: 以sdX形式显示的设备名称
- tps: 每秒进程下发的IO读、写请求数量
- KB_read/s: 每秒从驱动器读入的数据量,单位为K。
- KB_wrtn/s: 每秒从驱动器写入的数据量,单位为K。
- KB_read: 读入数据总量,单位为K。
- KB_wrtn: 写入数据总量,单位为K。
iostat -d -x -k 1 1
查看设备使用率(%util)、响应时间(await)
- rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
- wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
- r/s: 每秒完成的读 I/O 设备次数。即 rio/s
- w/s: 每秒完成的写 I/O 设备次数。即 wio/s
- rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
- wkB/s: 每秒写K字节数。是 wsect/s 的一半。
- avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
- avgqu-sz: 平均I/O队列长度。
- rsec/s: 每秒读扇区数。即 rsect/s
- wsec/s: 每秒写扇区数。即 wsect/s
- r_await:每个读操作平均所需的时间
- 不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。
- w_await:每个写操作平均所需的时间
- 不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。
- await: 平均每次设备I/O操作的等待时间 (毫秒)。
- svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
- %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
备注:如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。