一、前言
“子曰:“温故而知新,可以为师矣。”
-----《论语》
二、top
执行命令:
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
参数说明:
- d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用 s 交互命令来改变之。
- p:通过指定监控进程 ID 来仅仅监控某个进程的状态。
- q:该选项将使 top 没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- S:指定累计模式。
- s:使 top 命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
- i:使 top 不显示任何闲置或者僵死进程。
- c:显示整个命令行而不只是显示命令名。
命令说明:
- 系统运行时间和平均负载:
top - 20:20:16 up 16:18, 4 users, load average: 0.00, 0.01, 0.04
top 命令的顶部显示与 uptime 命令相似的输出
这些字段显示:
- 当前时间
- 系统已运行的时间
- 当前登录用户的数量
- 相应最近 1、5 和 15 分钟内的平均负载。
可以使用 'l' 命令切换 uptime 的显示
- 任务
Tasks: 112 total, 1 running, 104 sleeping, 7 stopped, 0 zombie
Tasks — 任务(进程),系统现在共有 122 个进程,其中处于运行中的有 1 个,103 个在休眠(sleep),stoped 状态的有7个,zombie 状态(僵尸)的有 0 个,这些进程概括信息可以用 't' 切换显示。
- 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 的百分比
- 内存使用
接下来两行显示内存使用率,有点像 'free' 命令。KiB Mem : 995896 total, 432992 free, 168912 used, 393992 buff/cache KiB Swap: 2097148 total, 2084084 free, 13064 used. 621592 avail Mem
- 第一行是物理内存使用
- 物理内存显示如下:全部可用内存、已使用内存、空闲内存、缓冲内存。
- 第二行是虚拟内存使用(交换空间)
- 交换部分显示的是:全部、已使用、空闲和缓冲交换空间。
内存显示可以用'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 的数据交换,这是真正的内存不够用了。
- 各进程(任务)的状态监控
参数说明:
- 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:运行进程所使用的命令。进程名称(命令名/命令行)
- 交互命令 - ‘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 退出监控。