前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >100个 Linux 命令(8)-统计和查看系统状态

100个 Linux 命令(8)-统计和查看系统状态

原创
作者头像
懒人的小脑
修改2019-01-17 08:42:28
2.3K0
修改2019-01-17 08:42:28
举报

命令篇

68.pstree

pstree
pstree

pstree命令以树的形式显示进程信息,默认树的分支是收拢的,也不显示pid,要显示这些信息需要指定对应的选项。

一般用法:pstree -a -h -p

选项

说明

-a

显示进程的命令行

-c

展开分支

-h

高亮当前正在运行的进程及其父进程

-p

显示进程 pid,此选项也将展开分支

-l

允许显示长格式进程。默认在结果中超过132个字符时将截断后面的字符

69.ps

查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,每秒刷新一次),使用top或htop命令。

ps 支持三种类型的选项:GNU、BSD、UNIX。不同类型的选项其展示的信息格式不一样。有些加了"-"的是SysV风格 的选项,不加"-"的是BSD选项,加不加"-"它们的意义是不一样的,例如ps aux 和ps -aux是不同的。

ps aux

对于 BSD 风格的选项只需知道 ps aux 就够了。“a”表示列出依赖于终端的所有进程,“x”表示列出不依赖于终端的进程,“u”表示展现的进程信息以用户为导向的。ps aux 不显示 ppid

ps aux
ps aux
  1. %CPU:表示 CPU 占用百分比,注意,CPU 的衡量方式时占用时间,所以百分比的计算方式时“进程占用 CPU 时间/CPU总时间”,而不是 CPU 工作强度的状态
  2. %MEM:表示各进程所占物理内存百分比
  3. VSZ:表示各进程占用的虚拟内存,也就是其在线性空间中实际占用的内存,单位 kb
  4. RSS:表示各进程占用的实际物理内存,单位 Kb
  5. TTY:属于哪个终端的进程
  6. STAT:进程所处的状态
    1. D:不可中断睡眠
    2. R:运行中或等待队列中的进程(running/runable)
    3. S:可中断睡眠
    4. T:进程处于 stopped 状态
    5. Z:僵尸进程
    6. <:高优先级进程(以下是 BSD 风格选项才出现的标识)
    7. N:低优先级进程
    8. L:该进程在内存中有被锁定的页
    9. s:表示该进程是 session leader,即进程组的首进程,例如管道左边的进程,shell 脚本中的 shell 进程
    10. l:该进程是一个线程
    11. +:前端进程。前端进程一般来说都是依赖于终端的
  7. START:进程是何时被创建的
  8. TIME:各进程占用的 CPU 时间
  9. COMMAND:进程的命令行。如果是内核线程,则使用方括号“[]”表示

ps -elf

"-e"表示输出全部进程信息,"-f"全格式输出,"-l"长格式输出

ps -lf
ps -lf
  1. F:程序的标志位。0表示该程序只有普通权限,4表示具有 root 超级管理员权限,1表示该进程被创建的时候只进行了 fork,没有进行 exec
  2. S:进程的状态位,注意 ps 选项加了“-”的是非 BSD 风格选项,不会有BSD的状态标识位
  3. C:CPU占用时间百分比
  4. PRI:进程的优先级,值越小,优先级越高,越早被调度类选中运行
  5. NI:进程的 NICE 值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+NI,所以 NI 为负数的时候越小将导致进程优先级越高。NICE 值只能影响非实时进程
  6. ADDR:进程在物理内存的哪个地方
  7. SZ:进程占用的实际物理内存
  8. WCHAN:若进程处于睡眠状态,将显示其对应内核线程的名称,若进程为 R 状态,则显示“-”

在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来。通过管道将ps结果传递给grep时,管道协调了ps和grep两进程间通信,但管道的本质是进程间数据传递。管道左边的输出数据放入内存,由管道右边的进程读取。假如划分的内存不足以完全存放输出数据,则管道左边的进程将一直等待,直到管道右边取出内存中一部分的数据以让管道左边的进程继续输出,而管道右边的进程在管道左边的进程启动后也立刻启动了,但是它一直处于等待状态,等待接收管道传递来的数据(就像是平时执行命令时不给输入文件将会一直等待输入一样)。也就是说,管道左右两端的进程是同时被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收,所以可能会造成交叉的情况,左边还没执行完,就捕获到了右边的进程信息。在此处体现在ps还没有统计完进程信息时,grep进程就已经被ps抓到了。

要将grep自身进程排除在结果之外,方法有二:

代码语言:txt
复制
[root@docker ~]# ps aux | grep "crond" | grep -v "grep"   # 使用-v将grep自己筛选掉
root       1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond   

[root@docker ~]# ps aux | grep "cron[d]"
root       1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond

第二种方法能成功是因为grep进程被ps捕获时的结果是"grep crond",而使用crond匹配时,它将只能匹配crond,所以"grep crond"被筛选掉了。其实加上其他字符将更容易理解。

代码语言:txt
复制
[root@docker ~]# ps aux | grep "cron[dabc]"
root       1425  0.0  0.1 117332  1276 ?        Ss   Jun10   0:00 crond

70.uptime

uptime
uptime

显示当前时间,已开机运行多少时间,当前有多少个用户已登录系统,以及3个平均负载值

负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,大于5时负载已经非常高。在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load就加1,进程每退出运行队列,Load就减1。如果是多核cpu,则还要除以核数。

详细信息见man uptime和https://en.wikipedia.org/wiki/Load_(computing)(https://en.wikipedia.org/wiki/Load_(computing%29)

例如,单核cpu上的负载值为"1.73 0.60 7.98"时,表示:

最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu。

最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间。

最近15分钟:7.98表示平均可运行的进程数,这15分钟要一直不断地执行这7.98个进程。

结合前5分钟的结果,说明前15-前10分钟时间间隔内,该核cpu的负载非常高。

如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间。

所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,即系统资源不足。

71.top/htop/iftop

top命令查看动态进程状态,默认每5秒刷新一次

选项

说明

-d

指定 top 刷新的时间间隔,默认是5秒

-b

批处理模式,每次刷新分批显示

-n

指定 top 刷新几次就退出,可以配合-b使用

-p

指定监控的 pid,指定方式为-pN1 -pN2或-pN1,N2

-u

指定要监控的用户的进程,可以是 UID 也可以是user name

在top动态模式下,按下各种键可以进行不同操作。使用"h"或"?"可以查看相关键的说明。

  • 1:表示是否要在top的头部显示出多个cpu信息
  • H:表示是否要显示线程,默认不显示
  • c,S:c表示是否要展开进程的命令行,S表示显示的cpu时间是否是累积模式,cpu累积模式下已死去的子进程cpu时间会累积到父进程中
  • x,y:x高亮排序的列,y表示高亮running进程
  • u:仅显示指定用户的进程
  • n or #:设置要显示最大的进程数量
  • k:杀进程
  • q:退出 top
  • P:以 CPU 的使用资源排序显示
  • M:以 memory 的使用资源排序显示
  • N:以 PID 来排序
top
top
  1. 第一行信息:和 w 命令的第一行一样,也和 uptime 命令的结果一样。此行各列分别表示“当前时间”、“已开机时长”、“当前在线用户”、“前1,5,15分钟的评价负载率”
  2. 第二行信息:分别表示总进程数、running状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数
  3. 第3-6行:每颗 cpu 的状况
    1. us:user mode
    2. sy:system mode
    3. ni:low priority user mode (nice)用户空间中低优先级进程的 cpu 占用百分比
    4. id:idle task
    5. wa:IO wating
    6. hi:servicing IRQs 不可中断睡眠,hard interruptible
    7. si:servicing soft IRQs 可中断睡眠,soft interruptible
    8. st:steal(time given to other DomU instances)被偷走的时间,一般被虚拟化软件偷走
  4. VIRT:虚拟内存总量
  5. RES:实际内存总量
  6. SHR:共享内存量
  7. TIME:进程占用的 CPU 时间(若开启了时间累积模式,则此处显示的是积累时间)

htop 是 top 的升级款,htop可以使用鼠标完成点击选中。其他使用方法和top类似,使用h查看各按键意义即可。

htop
htop

iftop用于动态显示网络接口的数据流量。用法也很简单,按下h键即可获取帮助。

iftop
iftop

72.vmstat

vmstat的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。

一般用法:

代码语言:txt
复制
vmstat [-d] [delay [ count]]
vmstat [-f]

选项:

选项

说明

-f

统计自开机起 fork 的次数,包括 fork、clone、vfork 的次数,但不包括 exec 次数

-d

显示磁盘统计信息

delay

刷新时间间隔,若不指定,则只统计一次信息就退出 vmstat

count

总共要统计的次数

例:只统计一次信息

vmstat 只统计一次信息
vmstat 只统计一次信息
  1. procs
    1. r:等待队列中的进程数
    2. b:不可中断睡眠的进程数
  2. memory
    1. swpd:虚拟内存使用总量
    2. free:空间内存量
    3. buff:buffer 占用的内存量(buffer 用于缓冲)
    4. cache:cache 占用的内存量(cache 用于缓存)
  3. Swap
    1. si:从磁盘加载到 swap 分区的数据流量,单位 kb/s
    2. so:从 swap 分区写入到磁盘的数据流量,单位 kb/s
  4. IO
    1. bi:从块设备接受到数据的速率,单位 blocks/s
    2. bo:发送数据到块设备的速率,单位 blocks/s
  5. System
    1. in:每秒中断数,包括时钟中断数量
    2. cs:每秒上下文切换次数
  6. CPU
    1. us:Time spent running non-kernel code. (user time, including nice time)
    2. sy:Time spent running kernel code. (system time)
    3. id:Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
    4. wa:Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
    5. st:Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

73.iostat

iostat主要统计磁盘或分区的整体使用情况。也可以输出cpu信息,甚至是NFS网络文件系统的信息。同vmstat/sar一样,第一次统计的都是自系统开机起的平均统计信息。

一般用法:iostat -c -n -h [ -p device ] [ interval count ]

选项

说明

-c

统计 cpu 信息

-d

统计磁盘信息

-n

统计 NFS 文件系统信息

-h

使 nfs 统计信息更加人类可读化

-k

指定以 kb/s 为单位显示

-m

指定以 mb/s 为单位显示

-p

指定要统计的设备名称

-y

指定不显示第一次统计信息,即不显示自开机起统计信息

interval

刷新时间间隔

count

总统计次数

例如:

iostat
iostat
  1. tps:每秒transfer速率(transfers per second),一次对物理设备的IO请求为一个transfer,但多个逻辑请求可能只组成一个transfer
  2. Blk_read/s:每秒读取的block数量
  3. Blk_wrtn/s:每秒写入的block总数
  4. Blk_read:读取的总block数量
  5. Blk_wrtn:写入的总block数量

74.sar

sar是一个非常强大的性能分析工具,它可以获取系统的cpu/等待队列/磁盘IO/内存/网络等性能指标。

代码语言:javascript
复制
sar [options] [-o filename] [delay [count] ]

选项

说明

-A

显示系统所有资源运行状况

-b

显示磁盘 IO 和 transfer 速率信息,和 iostat 的信息一样,是总体 IO 统计信息

-d

显示磁盘在刷新时间间隔内的活跃情况,可以指定一个或多个设备, 和-b 不同的是,它显示的单设备的 IO、transfer 信息 建议配合-p使用显示友好的设备名,否则默认显示带主次设备号的设备名

-P

显示指定的某颗或几颗 cpu 的使用情况。 -P 0,1,2,3或ALL。

-u

显示每颗cpu整体平均使用情况。

-r

显示内存在刷新时间间隔内的使用情况

-n

显示网络运行状态。 后可接DEV/NFS/NFSD/ALL等多种参数 DEV:显示网络接口信息 NFS和 NFSD:NFS 客户端和服务端的流量信息 ALL:显示所有信息

-q

显示等待队列大小。

-o filename

将结果存入文件

delay

状态刷新时间间隔

count

总共刷新几次

统计 CPU 使用情况

统计 cpu
统计 cpu

我们真正需要关注的是最后的average部分的idle值,idle越小,说明cpu处于空闲时间越少,该颗或整体cpu使用率就越高。

或者直接对整体进行统计。如下:

统计内存使用情况

其中kbdirty表示内存中脏页的大小,即内存中还有多少应该刷新到磁盘的数据。

统计网络流量

统计网络流量
统计网络流量
  • rxpck/s:每秒收到的包数量
  • txpck/s:每秒发送的包数量
  • rxkB/s:每秒收到的数据,单位为kb
  • txkB/s:每秒发送的数据,单位为kb
  • rxcmp/s:每秒收到的压缩后的包数量
  • txcmp/s:每秒发送的压缩后的包数量
  • rxmcst/s:每秒收到的多播包数量

或者通过查看/proc/net/dev 文件

/proc/net/dev
/proc/net/dev

关注列:receive和transmit分别表示收包和发包,关注每个网卡的bytes即可获得网卡的情况。写一个脚本计算每秒的差值即为网络流量。

查看队列情况

查看队列情况
查看队列情况
  • runq-sz:等待队列的长度,不包括正在运行的进程
  • plist-sz:任务列表中的进程数量,即总任务数
  • ldavg-N:过去1分钟、5分钟、15分钟内系统的平均哎
  • blocked:当前因为IO等待被阻塞的任务数量

统计磁盘 IO 情况

统计磁盘 IO 情况
统计磁盘 IO 情况
  • tps:transfer per second,每秒的transfer速率,一次物理IO请求算一次transfer,但多次逻辑IO请求可能组合起来才算一次transfer。
  • rd_sec/s:每秒读取的扇区数,扇区大小为512字节。
  • wr_sec/s:每秒写入的扇区数。
  • avgrq-sz:请求写入设备的平均大小,单位为扇区。(The average size (in sectors) of the requests that were issued to the device)
  • avgqu-sz:请求写入设备的平均队列长度。(The average queue length of the requests that were issued to the device.)
  • await:写入设备的IO请求的平均(消耗)时间,单位微秒(The average time for I/O requests issued to the device to be served.)
  • svctm:不可信的列,该列未来将被移除,所以不用管
  • %util:最重要的一列,显示的是设备的带宽情况。该列若接近100%,说明磁盘速率饱和了。

75.free

free用于查看内存使用情况。CentOS 6和CentOS 7上显示格式不太一样。

选项

说明

-h

人类可读方式显示单位

-m

以 MB 显示单位

-w

将 buffers 和 cache 分开单独显示。Centos 7 only

-s

动态查看内存信息时的刷新时间间隔

-c

一共要刷新多少次退出 free

代码语言:javascript
复制
free -hm
              total        used        free      shared  buff/cache   available
Mem:           991M        100M        154M        6.7M        735M        677M
Swap:          819M          8K        819M

Mem和Swap分别表示物理内存和交换分区的使用情况。

  • total:总内存空间
  • used:已使用的内存空间。该值是total-free-buffers-cache的结果
  • free:未使用的内存空间
  • shared:/tmpfs总用的内存空间。对内核版本有要求,若版本不够,则显示为0。
  • buff/cache:buffers和cache的总占用空间
  • available:可用的内存空间。即程序启动时,将认为可用空间有这么多。可用的内存空间为free+buffers+cache。

所以available才是真正需要关注的可使用内存空间量。

使用-w可以将buffers/cache分开显示

代码语言:javascript
复制
free -w -m
              total        used        free      shared     buffers       cache   available
Mem:            991         100         154           6           0         735         678
Swap:           819           0         819

动态统计内存信息,例如每秒统计一次,统计2次

代码语言:javascript
复制
free -w -m -s 1 -c 2
              total        used        free      shared     buffers       cache   available
Mem:            991         100         154           6           0         735         678
Swap:           819           0         819

              total        used        free      shared     buffers       cache   available
Mem:            991         100         154           6           0         735         678
Swap:           819           0         819

以下是CentOS 6上的free结果。

代码语言:javascript
复制
[root@docker ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           980        415        565          0         53        239
-/+ buffers/cache:        121        859
Swap:         1999          0       1999

在此结果中,"-/+ buffers/cache"的free列才是真正可用的内存空间了,即CentOS 7上的available列。

一般来说,内存可用量的范围低于20%应该要引起注意了。

分析系统负载

分析系统负载示例
分析系统负载示例

上图中,系统负载非常之高,最近一分钟的负载量高达383.19,这表示这一分钟有383.19个进程正在运行或等待调度,如果是单核CPU,表示这一分钟要毫不停留地执行这么多进程,如果是8核CPU,表示这一分钟内平均每核心CPU要执行大概50个进程。

从load average上看,确实是非常繁忙的场景。但是看CPU的idle值为98.8,说明CPU非常闲。为什么系统负载如此高,CPU却如此闲?

前面解释system load average的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠(如IO等待)的进程任务都会计算到负载中。现在负载高、CPU空闲,说明当前正在执行的任务基本不消耗CPU资源,大量的负载进程都在IO等待中

可以从ps的进程状态中获取哪些进程是正在运行或运行队列中的(状态为R),哪些进程是在不可中断睡眠中的(状态为D)。

代码语言:txt
复制
[root@docker]# ps -eTo stat,pid,ppid,comm --no-header |grep -E "^(D|R)"
R+    11864   9624 ps

原理篇

/proc 的意义及说明

在Linux中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在linux上出现了伪文件系统/proc,它是内核中各属性或状态向外提供访问和修改的接口。

在/proc下,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即使对root也一样,但/proc/sys除外,为何如此稍后解释。

/proc 伪文件系统
/proc 伪文件系统

其中数字命名的目录对应的是各进程的pid号,其内的文件记录的都是该进程当前的数据信息,且都是只读的,例如记录命令信息的cmdline文件,进程使用哪颗cpu信息cpuset,进程占用内存的信息mem文件,进程IO信息io文件等其他各种信息文件。

查看CPU的信息:/proc/cpuinfo

查看内存的信息:/proc/meminfo | free -hm | htop

查看硬盘容量:df -h

进程的详细信息
进程的详细信息

非数字命名的目录各有用途,例如bus表示总线信息,driver表示驱动信息,fs表示文件系统特殊信息,net表示网络信息,tty表示跟物理终端有关的信息,最特殊的两个是/proc/self和/proc/sys。

/proc/self

它表示的是当前正在访问/proc目录的进程,因为/proc目录是内核数据向外记录的接口,所以当前访问/proc目录的进程表示的就是当前cpu正在执行的进程。如果执行cat /proc/self/cmdline,会发现其结果总是该命令本身,因为cat是手动敲入的命令,它是重要性进程,cpu会立即执行该命令。

/proc/sys

该目录是为管理员提供用来修改内核运行参数的,所以该目录中的文件对root都是可写的,例如管理数据包转发功能的/proc/sys/net/ipv4/ip_forward文件。使用sysctl命令修改内核运行参数,其本质也是修改/proc/sys目录中的文件。

参考链接:http://www.cnblogs.com/f-ck-need-u/p/7059074.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 命令篇
    • 68.pstree
      • 69.ps
        • 70.uptime
          • 71.top/htop/iftop
            • 72.vmstat
              • 73.iostat
                • 74.sar
                  • 统计 CPU 使用情况
                  • 统计内存使用情况
                  • 统计网络流量
                  • 查看队列情况
                  • 统计磁盘 IO 情况
                • 75.free
                  • 分析系统负载
                  • 原理篇
                    • /proc 的意义及说明
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档