Linux命令 [系统性能排查]

本文详细介绍了如何通过Linux命令如top、vmstat、free、df和iostat排查系统性能瓶颈,涉及CPU、内存、磁盘和I/O设备的监控。重点讲解了进程状态、负载均衡、内存使用、虚拟内存统计、磁盘空间管理和I/O性能分析。
摘要由CSDN通过智能技术生成

本文的核心内容:系统性能排查需要关注的资源,以及我们在排查系统层面需要掌握的Linux命令。


 

对操作系统来说我们需要关注以下资源:当这些资源出现问题则会影响我们的应用,我们应该先从系统的层面去判断排查是否存在性能瓶颈。最后再落实到具体应用中,排查应用存在的瓶颈问题。

中央处理器CPU

  • 通过top命令,观测CPU性能
  • 通过负载,评估CPU任务执行的排队情况 (uptime)
  • 通过vmstat,看CPU的繁忙程度 (上下文切换)

内存

  • top命令

VIRT 这里是指虚拟内存,一般比较大,不用过多关注

RES 这里代表进程的实际占用内存

SHR 共享内存,比一些可以服用的一些so文件等

  • free命令 总内存-使用内存-可用内存

磁盘

  • df命令查看磁盘挂载以及容量
  • du命令文件目录磁盘占用问题

I/O设备

  • 通过iostat查看是否存在IO瓶颈

 

 


TOP命令

系统管理员可用运行top命令监视进程和Linux整体性能。

imageimage.gif

第一行:进程信息统计

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的数量显示

image.png

当我们的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)

image.png

 

  • 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在等待。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值