1. uptime
1
2
[pengzhangjie]$ uptime
20:11:28 up 148 days, 8:09, 1 user, load average: 0.08, 0.08, 0.03
这个命令显示了要运行的任务(进程)数,通过它能够快速了解系统的平均负载。在Linux上,这些数值既包括正在或准备运行在CPU上的进程,也包括阻塞在uninterruptible I/O(通常是磁盘I/O)上的进程。它展示了资源负载(或需求)的大致情况。
最右的三个数值分别是1分钟、5分钟、15分钟系统负载的平均值。
2. dmesg | tail
1
2
3
[pengzhangjie@centos217 ~]$ dmesg | tail
UDP: bad checksum. From 60.191.23.60:8312 to 183.36.122.217:1080 ulen 109
……
这个命令显示了最新的10个系统信息,如果有的话。注意会导致性能问题的错误信息。上面的例子里就包括对过多占用内存的进程错误(oom),还有丢弃TCP请求的公告。
3. free -m
1
2
3
4
5
6
[pengzhangjie]$ free -m
total used free shared buffers cached
Mem: 48135 14972 33162 0 461 5622
-/+ buffers/cache: 8889 39246
Swap: 7629 0 7629
右边的两列显示: buffers:用于块设备I/O的缓冲区缓存 cached:用于文件系统的页缓存 它们的值接近于0时,往往导致较高的磁盘I/O(可以通过iostat确认)。
比起第一行,-/+ buffers/cache提供的内存使用量会更加准确些。Linux会把暂时用不上的内存用作缓存,一旦应用需要的时候立刻重新分配给它。所以部分被用作缓存的内存其实也算是空闲内存,第二行以此修订了实际的内存使用量。为了解释这一点, 有人专门建了个网站: linuxatemyram。
4. vmstat 1
1
2
3
4
5
[pengzhangjie]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 38261304 471000 5813820 0 0 0 2 0 0 1 0 99 0 0
0 0 0 38224276 471000 5813824 0 0 0 4 9365 14501 9 2 89 0 0
vmstat,是“virtual memory stat”的简称,几十年前就已经包括在BSD套件之中。它会逐行输出服务器关键数据的统计结果。(1表示每秒采样一次)。
检查下面各列:
procs 进程信息字段
r:等待CPU的进程数。该指标能更好地判定CPU是否饱和,因为它不包括I/O。简单地说,r值高于CPU数时就意味着饱和。数量越大,系统越繁忙
b: 等待IO的进程数量,数量越大,系统越繁忙
memory 内存信息字段(单位为 KB)
swpd:虚拟内存的使用情况
free:空闲的内存千字节数。如果你数不清有多少位,就说明系统内存是充足的。使用free -m,能够更清楚地说明空闲内存的状态。
swap 交换分区信息字段
si,so:Swap-ins和Swap-outs,每秒从磁盘读入/写入磁盘的大小。如果它们不为零,意味着内存已经不足,开始动用交换空间了需要经常在磁盘和内存之间进行交换,系统性能越差。
io 磁盘读/写信息字段
bi bo:块设备每秒接收/发送的块数量。两个数越大,代表系统的 I/O 越繁忙。
system 系统信息字段
in:每秒被中断的进程次数 cs:每秒进行的事件切换次数 这两个数越大,代表系统与接口设备的通信越繁忙
cup CPU信息字段(单位:百分比)
us,sy,id,wa,st:它们是所有CPU的使用百分比。它们分别表示user time,system time(处于内核态的时间),idle(空闲),wait(等待) I/O和steal time(偷取时间,与虚拟机相关)。
通过相加us和sy的百分比,你可以确定CPU是否处于忙碌状态。一个持续不变的wait I/O意味着瓶颈在硬盘上,这种情况往往伴随着CPU的空闲,因为任务都卡在磁盘I/O上了。你可以把wait I/O当作CPU空闲的另一种形式,它额外给出了CPU空闲的线索。
5. mpstat -P ALL 1
1
2
3
4
5
6
7
8
[pengzhangjie@centos ~]$ mpstat -P ALL 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 _x86_64_ (16 CPU)
08:19:56 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
08:19:57 PM all 0.44 0.00 0.13 0.00 0.00 0.00 0.00 0.00 99.44
08:19:57 PM 0 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 97.00
08:19:57 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
08:19:57 PM 2 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99
mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。这个命令显示每个CPU的时间使用百分比,可以用它来检查CPU是否存在负载不均衡。单个过于忙碌的CPU可能意味着整个应用只有单个线程在工作。
6. pidstat 1
1
2
3
4
5
6
7
[pengzhangjie]$ pidstat 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 _x86_64_ (16 CPU)
08:21:13 PM PID %usr %system %guest %CPU CPU Command
08:21:14 PM 14721 0.98 0.00 0.00 0.98 0 fts_task_redis_
08:21:14 PM 17931 0.98 0.00 0.00 0.98 1 python
08:21:14 PM 19907 0.98 0.00 0.00 0.98 10 yyms_agent_d
pidstat看上去就像top,不过top的输出会覆盖掉之前的输出,而pidstat的输出则添加在之前的输出的后面。这有利于观察数据随时间的变动情况,也便于把你看到的内容复制粘贴到调查报告中。
7. iostat -xz 1
1
2
3
4
5
6
7
8
9
[pengzhangjie]$ iostat -xz 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 _x86_64_ (16 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.20 0.01 0.00 99.46
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 6.49 0.03 3.57 0.90 80.49 22.60 0.00 0.54 0.39 0.14
sdb 0.00 0.00 0.00 0.07 0.00 0.55 8.24 0.00 0.73 0.73 0.00
iostat参数 -x 显示详细信息
-z 只显示在采样周期内有活动的磁盘
这个命令可以弄清块设备(磁盘)的状况,包括工作负载和处理性能。注意以下各项:
r/s,w/s,rkB/s,wkB/s:分别表示每秒设备读次数,写次数,读的KB数,写的KB数。它们描述了磁盘的工作负载。也许性能问题就是由过高的负载所造成的。
await:I/O平均时间(毫秒)。它是应用中I/O处理所实际消耗的时间,因为其中既包括排队用时也包括处理用时。如果它比预期的大,就意味着设备饱和了,或者设备出了问题。
svctm:平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio).
avgqu-sz:分配给设备的平均请求数。大于1表示设备已经饱和了。(不过有些设备可以并行处理请求,比如由多个磁盘组成的虚拟设备)
%util:设备使用率,一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比。接近100%通常意味着饱和。
cup使用率与负载区别?
如果某个存储设备是由多个物理磁盘组成的逻辑磁盘设备,100%的使用率可能只是意味着I/O占用
请牢记于心,disk I/O性能低不一定是个问题。应用的I/O往往是异步的(比如预读(read-ahead)和写缓冲(buffering for writes)),所以不一定会被阻塞并遭受延迟。
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 idle小于70% IO压力就较大了,一般读取速度有较多的wait。 同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。
另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的I/O量。
形象的比喻:
r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例
设备IO操作:总IO(io)/s = r/s(读) +w/s(写)
平均等待时间=单个I/O服务器时间*(1+2+…+请求总数-1)/请求总数
每秒发出的I/0请求很多,但是平均队列就4,表示这些请求比较均匀,大部分处理还是比较及时。
sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。
8. sar -n DEV 1
1
2
3
4
5
6
7
8
9
10
[pengzhangjie]$ sar -n DEV 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 _x86_64_ (16 CPU)
08:25:37 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
08:25:38 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:25:38 PM eth0 2107.07 1957.58 347.10 1035.85 0.00 0.00 0.00
08:25:38 PM eth1 4.04 1.01 0.27 0.10 0.00 0.00 0.00
08:25:38 PM eth2 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:25:38 PM eth3 0.00 0.00 0.00 0.00 0.00 0.00 0.00
这个命令可以用于检查网络流量的工作负载:rxkB/s 和 txkB/s,以及它是否达到限额了。上面的例子中,eth0接收的流量达到 2Mbytes/s。
9. sar -n TCP,ETCP 1
1
2
3
4
5
6
7
8
9
[pengzhangjie]$ sar -n TCP,ETCP 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 _x86_64_ (16 CPU)
02:49:37 PM active/s passive/s iseg/s oseg/s
02:49:38 PM 2.00 1.00 6753.00 8823.00
02:49:37 PM atmptf/s estres/s retrans/s isegerr/s orsts/s
02:49:38 PM 0.00 0.00 1.00 0.00 1.00
这个命令显示一些关键TCP指标的汇总。其中包括:
active/s:本地每秒创建的TCP连接数(比如connect()创建的)
passive/s:远程每秒创建的TCP连接数(比如accept()创建的)
iseg/s:接收的段(传输层以段为传输单位),单位是:段/s
oseg/s:发送的段
atmptf/s:每秒尝试连接但失败的连接数
estres/s:每秒从ESTABLISHED/CLOSE-WAIT状态转移到到CLOSED状态的TCP连接數目
retrans/s:每秒TCP重传次数
isegerr/s:每秒收到的error的segments數量(比如checksum错误)
orsts/s:每秒送出的的包含RST flag的segments數量
retrans 重传是网络或系统问题的一个信号;它可能是不可靠的网络(比如公网)所造成的,也有可能是服务器已经过载并开始丢包。
10. top
1
2
3
4
5
6
7
8
9
10
11
[pengzhangjie]$ top
top - 20:11:53 up 148 days, 8:10, 2 user, load average: 0.06, 0.08, 0.03
Tasks: 316 total, 1 running, 315 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.9%us, 0.3%sy, 0.0%ni, 98.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 49290640k total, 11046268k used, 38244372k free, 471000k buffers
Swap: 7813116k total, 0k used, 7813116k free, 5813764k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23715 rabbitmq 20 0 9715m 259m 4212 S 113.4 0.5 29651:55 beam.smp
45098 root 20 0 4259m 3.1g 1244 S 3.9 6.6 32:10.98 fts_shared_redi
23936 root 20 0 1915m 44m 4272 S 2.0 0.1 639:18.96 yyac_worker_ant
统计信息区:
前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
20:11:53 — 当前系统时间
up 148 days, 8:10 — 系统已经运行了148天8小时10分钟(在这期间系统没有重启过的吆!)
2 users — 当前有2个用户登录系统
load average: 0.06, 0.08, 0.03 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有316个进程,其中处于运行中的有1个,315个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行,cpu状态信息,具体属性说明如下:
0.9%us — 用户空间占用CPU的百分比。
0.3%sy — 内核空间占用CPU的百分比。
0.0%ni — 改变过优先级的进程占用CPU的百分比
98.8% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比
第四行 内存状态,具体信息如下:
49290640k total — 物理内存总量(49GB)
11046268k used — 使用中的内存总量(11GB)
38244372k free — 空闲内存总量(38GB)
471000k buffers — 缓存的内存量 (471M)
第五行,swap交换分区信息,具体信息说明如下:
7813116k total — 交换区总量(7.8GB)
0k used — 使用的交换区总量(0K)
7813116k free — 空闲交换区总量(7.8GB)
5813764k cached — 缓冲的交换区总量(5.8GB)
备注:
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行,空行。
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
其他使用技巧:
多U多核CPU监控,在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况
高亮显示当前运行进程,敲击键盘“b”(打开/关闭加亮效果)
进程字段排序 默认进入top时,各进程是按照CPU的占用量来排序的,敲击键盘“x”(打开/关闭排序列的加亮效果)
通过”shift + >”或”shift + <”可以向右或左改变排序列
top交互命令
在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。
h 显示帮助画面,给出一些简短的命令总结说明
k 终止一个进程。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s
f或者F 从当前显示中添加或者删除项目
o或者O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
W 将当前设置写入~/.toprc文件中
常用参数
- 显示 完整命令 top -c
- 以批处理模式显示程序信息 top -b
- 以累积模式显示程序信息 top -S
- 设置信息更新次数 top -n 2
- 设置信息更新时间 top -d 3
- 显示指定的进程信息 top -p 574
例:指定显示进程 9836,每隔 5 秒的进程的资源的占用情况
1
# top –d 5 –p 9836 -c