性能监控之 Linux 命令 top、vmstat、iostat、free、iftop 基础

举报
zuozewei 发表于 2021/08/30 12:19:37 2021/08/30
【摘要】 前言 top vmstat iostat free iftop 前言“子曰:“温故而知新,可以为师矣。”-----《论语》 top执行命令:top [-] [d] [p] [q] [c] [C] [S] [s] [n]参数说明:d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用 s 交互命令来改变之。p:通过指定监控进程 ID 来仅仅监控某个进程的状态。q:该选项将使 top 没...

前言

“子曰:“温故而知新,可以为师矣。”
-----《论语》

top

在这里插入图片描述
执行命令:

top [-] [d] [p] [q] [c] [C] [S] [s]  [n]

参数说明:

  • d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用 s 交互命令来改变之。
  • p:通过指定监控进程 ID 来仅仅监控某个进程的状态。
  • q:该选项将使 top 没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • S:指定累计模式。
  • s:使 top 命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • i:使 top 不显示任何闲置或者僵死进程。
  • c:显示整个命令行而不只是显示命令名。

命令说明:

  1. 系统运行时间和平均负载:
top - 20:20:16 up 16:18,  4 users,  load average: 0.00, 0.01, 0.04

top 命令的顶部显示与 uptime 命令相似的输出

这些字段显示:

  • 当前时间
  • 系统已运行的时间
  • 当前登录用户的数量
  • 相应最近 1、5 和 15 分钟内的平均负载。

可以使用 ‘l’ 命令切换 uptime 的显示

  1. 任务
Tasks: 112 total,   1 running, 104 sleeping,   7 stopped,   0 zombie

Tasks — 任务(进程),系统现在共有 122 个进程,其中处于运行中的有 1 个,103 个在休眠(sleep),stoped 状态的有7个,zombie 状态(僵尸)的有 0 个,这些进程概括信息可以用 ‘t’ 切换显示。

  1. CPU 状态
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

这里显示不同模式下所占 cpu 时间百分比,这些不同的 cpu 时间表示:

  • us, user:运行(未调整优先级的) 用户进程的CPU时间
  • sy,system: 运行内核进程的CPU时间
  • ni,niced:运行已调整优先级的用户进程的CPU时间
  • wa,IO wait: 用于等待IO完成的CPU时间
  • hi:处理硬件中断的 CPU 时间
  • si: 处理软件中断的 CPU 时间
  • st:这个虚拟机被 hypervisor 偷去的 CPU 时间(译注:如果当前处于一个 hypervisor 下的 vm,实际上hypervisor 也是要消耗一部分 CPU 处理时间的)。

可以使用 ‘t’ 命令切换显示。

  • 0.0% us — 用户空间占用 CPU 的百分比
  • 0.3% sy — 内核空间占用 CPU 的百分比
  • 0.0% ni — 改变过优先级的进程占用 CPU 的百分比
  • 99.7% id — 空闲 CPU 百分比
  • 0.0% wa — IO 等待占用 CPU 的百分比
  • 0.0% hi — 硬中断(Hardware IRQ)占用 CPU 的百分比
  • 0.0% si — 软中断(Software Interrupts)占用 CPU 的百分比
  1. 内存使用
KiB Mem :   995896 total,   432992 free,   168912 used,   393992 buff/cache
KiB Swap:  2097148 total,  2084084 free,    13064 used.   621592 avail Mem

接下来两行显示内存使用率,有点像 ‘free’ 命令。

  • 第一行是物理内存使用
    • 物理内存显示如下:全部可用内存、已使用内存、空闲内存、缓冲内存。
  • 第二行是虚拟内存使用(交换空间)
    • 交换部分显示的是:全部、已使用、空闲和缓冲交换空间。

内存显示可以用’m’命令切换。

  • 995896 total — 物理内存总量
  • 168912k used — 使用中的内存总量
  • 432992 k free — 空闲内存总量
  • 393992k buffers — 缓存的内存量

swap 交换分区:

  • 2097148k total — 交换区总量
  • 13064k used — 使用的交换区总量
  • 2084084k free — 空闲交换区总量
  • 621592k cached — 缓冲的交换区总量

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数
空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:

第四行的 f r e e + 第四行的 b u f f e r s + 第五行的 c a c h e d = 服务器的可用内存 第四行的free + 第四行的buffers + 第五行的cached=服务器的可用内存

对于内存监控,在 top 里我们要时刻监控第五行 swap 交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和 swap 的数据交换,这是真正的内存不够用了。

  1. 各进程(任务)的状态监控

在这里插入图片描述
参数说明:

  • PID:进程ID,进程的唯一标识符说明.
  • USER:进程所有者的实际用户名。
  • PR:进程的调度优先级。这个字段的一些值是 ‘rt’。这意味这这些进程运行在实时态。
  • NI:进程的 nice 值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
  • VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  • SHR:SHR 是进程使用的共享内存。共享内存大小,单位 kb
  • S:这个是进程的状态。它有以下不同的值:
    • D - 不可中断的睡眠态。
    • R – 运行态
    • S – 睡眠态
    • T – 被跟踪或已停止
    • Z – 僵尸态
  • %CPU:自从上一次更新时到现在任务所使用的 CPU 时间百分比。
  • %MEM:进程使用的可用物理内存百分比。
  • TIME+:任务启动后到现在所使用的全部 CPU 时间,精确到百分之一秒。
  • COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
  1. 交互命令 - ‘h’帮助命令

在这里插入图片描述

在 top 基本视图中,按键盘数字“1”,可监控每个逻辑 CPU 的状况:(本虚拟机就是一个 cpu)
在这里插入图片描述

监控 Java 线程数:

ps -eLf | grep java | wc -l

监控网络客户连接数:

netstat -n | grep tcp | grep 侦听端口 | wc -l

vmstat

在这里插入图片描述

在这里插入图片描述

  • 2 表示每个两秒采集一次服务器状态
  • 1表示只采集一次。

结构说明:

  • r :表示运行队列(就是说多少个进程真的分配到 CPU),我测试的服务器目前 CPU 比较空闲,没什么程序在跑,当这个值超过了 CPU 数目,就会出现 CPU 瓶颈了。这个也和 top 的负载有关系,一般负载超过了 3 就比较高,超过了 5 就高,超过了 10 就不正常了,服务器的状态很危险。top 的负载类似每秒的运行队列。如果运行队列过大,表示你的 CPU 很繁忙,一般会造成 CPU 使用率很高。
  • b:表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
  • swap:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
  • free:空闲的物理内存的大小,我的机器内存总共 8G,剩余 3415M。
  • buff:Linux/Unix 系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
  • cache:cache 直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
  • si:每秒从磁盘读入虚拟内存的大小,如果这个值大于 0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
  • so:每秒虚拟内存写入磁盘的大小,如果这个值大于 0,同上。
  • bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是 1024 byte,我本机上没什么 IO 操作,所以一直是 0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
  • bo:块设备每秒发送的块数量,例如我们读取文件,bo 就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
  • in:每秒 CPU 的中断次数,包括时间中断
  • cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在 apache 和 nginx 这种 web 服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择 web 服务器的进程可以由进程或者线程的峰值一直下调,压测,直到 cs 到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的 CPU 大部分浪费在上下文切换,导致 CPU 干正经事的时间少了,CPU没有充分利用,是不可取的。
  • us:用户 CPU 时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
  • sy:系统 CPU 时间,如果太高,表示系统调用时间长,例如是 IO 操作频繁。
  • id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为 id 是空闲 CPU 使用率,us 是用户 CPU 使用率,sy是系统 CPU 使用率。
  • wt:等待 IO CPU 时间。注意:wa 的值高时,说明 IO等 待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

iostat

在这里插入图片描述
安装方法:

yum install sysstat
iostat [参数] [时间] [次数]

参数说明:

  • -c:显示 CPU 使用情况
  • -d:显示磁盘使用情况
  • -k:以 K 为单位显示
  • -m:以 M 为单位显示
  • -N:显示磁盘阵列(LVM) 信息
  • -n:显示 NFS 使用情况
  • -p:可以报告出每块磁盘的每个分区的使用情况
  • -t:显示终端和 CPU 的信息
  • -x:显示详细信息

在这里插入图片描述

  • rrqm/s:每秒这个设备相关的读取请求有多少被 Merge了(当系统调用需要读取数据的时候,VFS 将请求发到各个 FS,如果 FS 发现不同的读取请求读取的是相同 Block 的数据,FS会将这个请求合并Merge)
  • wrqm/s:每秒这个设备相关的写入请求有多少被 Merge 了
  • rsec/s:每秒读取的扇区数
  • wsec/:每秒写入的扇区数
  • rKB/s:The number of read requests that were issued to the device per second
  • wKB/s:The number of write requests that were issued to the device per second
  • avgrq-sz 平均请求扇区的大小
  • avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
  • await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为 IO 的响应时间,一般地系统 IO 响应时间应该低于 5 ms,如果大于 10 ms 就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await 大于 svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
  • svctm:表示平均每次设备 I/O 操作的服务时间(以毫秒为单位)。如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢。
  • %util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔 1 秒,该设备有 0.8 秒在处理IO,而 0.2 秒闲置,那么该设备的 %util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
  • 一般地,如果该参数是 100% 表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

常见用法:

iostat -d -k 1 10    #查看 TPS 和吞吐量信息(磁盘读写速度单位为 KB)
iostat -d -m 2       #查看 TPS 和吞吐量信息(磁盘读写速度单位为 MB)
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await) 
iostat -c 1 10       #查看 cpu 状态
iostat -c 1 10       #查看 cpu 状态

注意点:

  • 网卡的大吞吐量可能导致更多的 cup
  • 大量的 cup 开销又会增加更多内存使用请求
  • 大量内存与磁盘的请求可能导致更多的 cpu 以及 IO 问题

free

在这里插入图片描述

  • Mem:行(第二行)是内存的使用情况
  • Swap:行(第三行)是交换空间的使用情况。
  • total:列显示系统总的可用物理内存和交换空间大小。
  • used:列显示已经被使用的物理内存和交换空间。
  • free:列显示还有多少物理内存和交换空间可用使用。
  • shared:列显示被共享使用的物理内存大小。
  • buff/cache:列显示被 buffer 和 cache 使用的物理内存大小。
  • available:列显示还可以被应用程序使用的物理内存大小。

iftop

在这里插入图片描述
界面相关说明:

  • 界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。

  • 中间的 <= => 这两个左右箭头,表示的是流量的方向。

  • TX:发送流量

  • RX:接收流量

  • TOTAL:总流量

  • Cumm:运行 iftop 到目前时间的总流量

  • peak:流量峰值

  • rates:分别表示过去 2s 10s 40s 的平均流量

常用的参数:

  • -i 设定监测的网卡,如:# iftop -i eth1

  • -B 以bytes为单位显示流量(默认是bits),如:# iftop -B

  • -n 使host信息默认直接都显示IP,如:# iftop -n

  • -N 使端口信息默认直接都显示端口号,如: # iftop -N

  • -F 显示特定网段的进出流量,如# iftop -F 100.100.30.25 或# iftop -F 100.100.30.25 /255.255.255.0

  • -h(display this message),帮助,显示参数信息

  • -p 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;

  • -b 使流量图形条默认就显示;

  • -f 这个暂时还不太会用,过滤计算包用的;

  • -P 使 host 信息及端口信息默认就都显示;

  • -m 设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
    iftop(注意大小写)

常用操作:

  • 按 h 切换是否显示帮助;

  • 按 n 切换显示本机的 IP 或主机名;

  • 按 s 切换是否显示本机的 host 信息;

  • 按 d 切换是否显示远端目标主机的 host 信息;

  • 按 t 切换显示格式为 2 行/ 1 行/只显示发送流量/只显示接收流量;

  • 按 N 切换显示端口号或端口服务名称;

  • 按 S 切换是否显示本机的端口信息;

  • 按 D 切换是否显示远端目标主机的端口信息;

  • 按 p 切换是否显示端口信息;

  • 按 P 切换暂停/继续显示;

  • 按 b 切换是否显示平均流量图形条;

  • 按 B 切换计算 2 秒或 10 秒或 40 秒内的平均流量;

  • 按 T 切换是否显示每个连接的总流量;

  • 按 l 打开屏幕过滤功能,输入要过滤的字符,比如 ip,按回车后,屏幕就只显示这个 IP 相关的流量信息;

  • 按 L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;

  • 按 j 或按 k 可以向上或向下滚动屏幕显示的连接记录;

  • 按 1 或 2 或 3 可以根据右侧显示的三列流量数据进行排序;

  • 按 < 根据左边的本机名或IP排序;

  • 按 > 根据远端目标主机的主机名或IP排序;

  • 按 o 切换是否固定只显示当前的连接;

  • 按 f 可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!

  • 按 ! 可以使用 shell 命令,这个没用过 !没搞明白啥命令在这好用呢!

  • 按 q 退出监控。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。