专栏首页7DGroup性能工具之linux监控之top、vmstat、iostat复习

性能工具之linux监控之top、vmstat、iostat复习

前言:

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

1、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的显示。

2) 任务

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

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

3) 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的百分比

4) 内存使用:

KiB Mem : 995896 total, 432992 free, 168912 used, 393992 buff/cacheKiB 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内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:

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

5) 各进程(任务)的状态监控:

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:运行进程所使用的命令。进程名称(命令名/命令行)

6) 交互命令

‘h’帮助命令

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

监控java线程数:

ps -eLf | grep java | wc -l

监控网络客户连接数:netstat -n | grep tcp | grep 侦听端口 | wc -l

2、vmstat

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

说明:

Ø r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

Ø b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

Ø swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

Ø free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

Ø buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

Ø cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

Ø si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

Ø so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

Ø bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么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等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

3、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响应时间应该低于5ms,如果大于10ms就比较大了。

这个时间包括了队列时间和服务时间,也就是说,一般情况下,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状态

注意点:

Ø 网卡的大吞吐量可能导致更多的cup

Ø 大量的cup 开销又会增加更多内存使用请求

Ø 大量内存与磁盘的请求可能导致更多的cpu以及IO问题

4、free

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

4、iftop

1、iftop界面相关说明

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

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

TX:发送流量 RX:接收流量 TOTAL:总流量 Cumm:运行iftop到目前时间的总流量 peak:流量峰值 rates:分别表示过去 2s 10s 40s 的平均流量

2、iftop相关参数

常用的参数

-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退出监控。

本文分享自微信公众号 - 7DGroup(Zee_7DGroup),作者:李文

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「性能测试实战30讲」之问题问答整理五

    第一个问题:如何理解“服务端的并发能力”这一描述? 首先我们从数据视角来理解,可以把服务端程序用一个模型来看待,即由「网络 API 请求」所驱动的。 服务端的...

    高楼Zee
  • 性能分析之大屏可视化平台瓶颈分析

    大屏展示的可视化平台以交互性图像显示技术为核心,结合各业务流程、指标体系的信息化建设成果,实现了对生产与经营信息全方位集中监控和多角度的全景式信息展示,为创建高...

    高楼Zee
  • 走进Java接口测试之测试框架TestNG

    TestNG 是一个受 JUnit 和 NUnit 启发的测试框架测试框架,旨在简化广泛的测试需求,从单元测试到接口测试。 但引入了一些新功能,使其更强大,更易...

    高楼Zee
  • Docker 基础技术之 Linux cgroups 详解

    CloudDeveloper
  • Lucene 全文检索

    全文检索就是先分词创建索引,再执行搜索的过程。分词就是将一段文字分成一个个单词。全文检索就将一段文字分成一个个单词去查询数据

    Carlos Ouyang
  • [深度学习工具]·极简安装Dlib人脸识别库

    Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备...

    小宋是呢
  • 一步一步学lucene——(第二步:示例篇)

    在上面的篇幅中我们已经了解到了lucene,及lucene到底是做什么的,什么情况下才能够使用lucene,下面我们就结合一个例子来详细说明一下lucene的A...

    cloudskyme
  • 浏览器的内存泄漏场景、监控以及分析

    虽然前端有垃圾回收机制,但当某块无用的内存,却无法被垃圾回收机制认为是垃圾时,也就发生内存泄漏了

    请叫我大苏
  • 操作系统之内存管理内存管理3.1 内存管理的概念3.2 内存覆盖与内存交换3.3 内存连续分配管理方式3.4 内存非连续分配管理方式

    JavaEdge
  • [编程经验]Python中的Lambda,Map, Reduce小结

    今天要和大家分享的是Python匿名函数(anonymous functions),也叫lambda函数。匿名函数的意思就是说这个函数没有显式的函数名,因为一般...

    用户1622570

扫码关注云+社区

领取腾讯云代金券