Linux系统中常常使用的性能检测与优化命令
- top指令
- uptime指令
- free指令
- iostat指令
- mpstat指令
- sar指令
- vmstat指令
- time指令
- tload指令
- lsof指令
- fuser指令
- cpuspeed指令
在使用Linux服务器的过程中,有16个命令可以帮助你全面了解你的服务器的运行状况。你需要很熟练地掌握这些命令。
01 – iostat
iostat命令显示的是显示CPU使用情况,也可以看到每个磁盘的IO情况。
显示CPU和外设的IO状态,使用参数 -t 选项显示报告产生的时间:
iostat -t 2 #每隔2秒统计一次
[root@beanpc /]# iostat -t 2
Linux 2.6.32-279.el6.x86_64 (beanpc) 12/27/2015 _x86_64_ (2 CPU)
12/27/2015 06:18:36 AM
avg-cpu: %user %nice %system %iowait %steal %idle
3.17 0.20 6.07 7.22 0.00 83.34
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 27.32 1376.33 1573.22 45404546 51900134
scd0 0.13 22.78 0.00 751464 0
dm-0 206.92 1318.30 1486.20 43490298 49029080
12/27/2015 06:18:38 AM
avg-cpu: %user %nice %system %iowait %steal %idle
0.26 0.00 2.37 0.00 0.00 97.36
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 1.99 0.00 31.84 0 64
scd0 0.00 0.00 0.00 0 0
dm-0 4.98 0.00 31.84 0 64
12/27/2015 06:18:40 AM
avg-cpu: %user %nice %system %iowait %steal %idle
0.53 0.00 2.37 0.00 0.00 97.10
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
^C
[root@beanpc /]#
02 – meminfo/free
meminfo提供了很详细的内存使用状况。可以直接用cat命令查看:
cat /proc/meminfo
[root@beanpc /]# cat /proc/meminfo
MemTotal: 1020536 kB
MemFree: 120796 kB
Buffers: 7232 kB
Cached: 387580 kB
SwapCached: 26260 kB
Active: 384760 kB
Inactive: 357764 kB
Active(anon): 299040 kB
Inactive(anon): 249012 kB
Active(file): 85720 kB
Inactive(file): 108752 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 1048568 kB
SwapFree: 641096 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 331204 kB
Mapped: 231596 kB
Shmem: 200340 kB
Slab: 82916 kB
SReclaimable: 19172 kB
SUnreclaim: 63744 kB
KernelStack: 2920 kB
PageTables: 47332 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1558836 kB
Committed_AS: 1707048 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7700 kB
VmallocChunk: 34359714144 kB
HardwareCorrupted: 0 kB
AnonHugePages: 196608 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8128 kB
DirectMap2M: 1040384 kB
[root@beanpc /]#
03 - free
free指令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
-b 以字节为单位显示内存使用情况
-K 以千字节为单位显示内存使用情况,默认选项
-m 以兆字节为单位显示内存使用情况
-t 显示汇总结果
-o 不显示buffer adjusted行
-s <间隔秒数> 以指定间隔的秒数,显示内存使用情况
经验技巧:
- 可以忽略free指令的输出信息中的share部分的内容,因为这部分信息已经废弃
- 当不使用-o选项时,free指令的输出信息会输出一行buffer信息,它显示buffer内存,并把buffer内存加入到free内存中
- free指令输出的内存使用情况来自文件/proc/meminfo,此文件中记录了内存更为详细的使用情况。
free -m # 以兆字节为单位显示内存使用情况
[root@beanpc /]# free -m
total used free shared buffers cached
Mem: 996 886 109 0 7 379
-/+ buffers/cache: 499 497
Swap: 1023 397 626
[root@beanpc /]#
以上输出中,
- Mem:表示物理内存使用情况
- total: 表示物理内存总数
- used:表示已经分配出去的内存总数(包含分配buffers部分和cached部分)
- free:表示未分配的物理内存数目
- buffers:表示已分配但是还未使用的buffers内存(此部分内存包含在used内)
- cached:表示已经分配但是还未使用的cached内存,此部分内存包含在used内
- -/+ buffers/cache行的含义:used表示已经分配的并且已经被使用的buffers内存和cached内存;free表示未分配的物理内存数目与已分配的但是还未使用的buffers内存和cached内存的和
- Swap行:该行的内容表示交换空间的使用情况,一般不会混淆。
04 – mpstat
mpstat用在多处理器的服务器上,用来显示每一个CPU的状态。
另外,mpstat也会显示所有处理器的平均状况。
你可以设置显示每个服务器的CPU统计信息,或者每个处理的CPU统计信息。
mpstat -P ALL
[root@beanpc /]# mpstat -P ALL
Linux 2.6.32-279.el6.x86_64 (beanpc) 12/27/2015 _x86_64_ (2 CPU)
06:44:22 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
06:44:22 AM all 3.08 0.19 4.74 6.94 0.53 0.67 0.00 0.00 83.85
06:44:22 AM 0 3.65 0.23 5.23 8.94 0.57 0.54 0.00 0.00 80.84
06:44:22 AM 1 2.50 0.15 4.25 4.96 0.49 0.81 0.00 0.00 86.84
[root@beanpc /]#
mpstat -P 0
[root@beanpc /]# mpstat -P 0
Linux 2.6.32-279.el6.x86_64 (beanpc) 12/27/2015 _x86_64_ (2 CPU)
06:45:16 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
06:45:16 AM 0 3.65 0.23 5.23 8.92 0.57 0.54 0.00 0.00 80.86
[root@beanpc /]#
其中各个域的含义简述如下:
- CPU:处理器编号,如果为all,则此行表示的是所有处理器的统计平均值
- %usr:用户态的CPU利用率
- %nice:具有调度优先级的用户态CPU利用率
- %sys:内核态CPU利用率(此值不包括响应硬件中断和软件中断的时间)
- %iowait:处理IO请求导致CPU处于IDLE状态的时间百分比
- %irq:CPU响应硬件中断的时间比率
- %soft:CPU响应软件中断的时间比率
- %steal:当虚拟机监控器在服务于其他虚拟处理器时,虚拟CPU的被动等待时间比率
- %guest:运行一个虚拟处理器所消耗的CPU时间比率
05 – netstat
netstat命令,是Linux系统管理员几乎每天都会用到的命令(它已经逐步在被ss命令取代),他可以显示很多有关网络方面的信息,例如socket使用情况、路由情况、网卡情况、协议情况、网络流量统计等等。
一些常用的netstat选项包括:
-a : 显示所有socke信息
-r : 显示路由信息
-i : 显示网卡借口统计
-s : 显示网络协议统计
06 – nmon
nmon是Nigel’s Monitor的缩写,它是一个很知名的监视Linux系统性能的工具。
nmon可以查看到处理器利用率、内存使用率、运行队列信息、磁盘IO统计、网络IO统计、换页统计等。
你可以通过一个基于curses的类GUI界面来查看到上述信息。
nmon监控工具
nmon监控工具
07 – pmap
pmap命令可以显示进程占用的内存量。即报告进程的内存映射关系。
你可以通过pmap找到那个占用内存量最多的进程。
08/09 – ps/pstree
ps和pstree在Linux系统里是一对好兄弟,它们都是用来列出处于运行状态的进程的列表的。
ps告诉我们每个进程使用的内存量以及所消耗的CPU时间。
pstree则会告诉我们进程间的父子关系,
10 – sar
sar命令堪称系统监控工具里的瑞士军刀。
sar命令实际上是由三个程序组成的,即sar(用于显示数据)、sa1(用于采集数据)和sa2(用于存储数据)。
sar可以涵盖到CPU利用率信息、内存换页信息、网络IO传输信息、进程创建行为和存储设备行为。
sar和nmon的最大区别在于,sar更适用于长期的系统监控,而nmon则更适用于快速查看信息。
11 – strace
starce经常被用来作为追查程序问题的工具,但他的功能远非如此。
它可以解析和记录进程的系统调用行为,这使得strace成为了一个非常有用的诊断、调查和纠错工具。
举例来说,你可以适用strace来追查到一个程序在启动之初所需加载的配置文件信息。
当然,strace也有它自身的缺陷,那就是strace会严重拖慢调查对象(某个进程)的性能和运行速度。
12 – tcpdump
tcpdump是一个简单的、好用的网络监控工具。它的网络协议分析能力使得它能够看清网络中到底发生了什么,如果你希望更细节的调查的话,可以考虑适用功能更为强大的wireshark工具。
13 – top
top命令可以显示系统中的进程信息。默认情况下,top会按照CPU使用率从高到低来显示系统中的进程,并且每5秒刷新一次排行榜。
当然,你也可以让top按照PID、进程寿命、CPU耗时、内存消耗等维度对进程进行排序。(我经常使用的是P和M快捷键,分别是按CPU利用率排序、按内存使用量排序)
通过top命令,你可以很快的发现那些失去控制或不符合预期的进程。
[root@beanpc /]#
[root@beanpc /]# top
top - 07:19:35 up 10:10, 5 users, load average: 0.14, 0.09, 0.09
Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.0%us, 2.6%sy, 0.0%ni, 94.7%id, 1.2%wa, 0.2%hi, 0.3%si, 0.0%st
Mem: 1020536k total, 910684k used, 109852k free, 9608k buffers
Swap: 1048568k total, 406756k used, 641812k free, 383188k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4 root 20 0 0 0 0 S 1.6 0.0 7:12.07 ksoftirqd/0
8092 root 20 0 15136 1288 920 R 1.6 0.1 0:00.22 top
9 root 20 0 0 0 0 S 1.3 0.0 9:14.96 ksoftirqd/1
1669 root 20 0 105m 684 508 S 0.7 0.1 0:04.22 ksmtuned
11 root 20 0 0 0 0 S 0.3 0.0 1:09.35 events/0
345 root 20 0 0 0 0 S 0.3 0.0 0:32.43 jbd2/dm-0-8
2944 oracle 20 0 635m 16m 14m S 0.3 1.7 0:40.57 oracle
14030 oracle 20 0 635m 3584 3352 S 0.3 0.4 0:40.36 oracle
14038 oracle 20 0 636m 17m 16m S 0.3 1.7 0:12.66 oracle
14056 oracle 20 0 637m 22m 21m S 0.3 2.3 0:51.08 oracle
14082 oracle 20 0 639m 76m 74m S 0.3 7.7 0:31.74 oracle
16064 oracle 20 0 2045m 210m 3672 S 0.3 21.1 5:47.80 java
16090 oracle 20 0 1175m 13m 5604 S 0.3 1.4 1:53.35 emagent
16154 oracle 20 0 643m 73m 70m S 0.3 7.3 0:33.52 oracle
17142 oracle 20 0 641m 81m 77m S 0.3 8.1 0:41.03 oracle
1 root 20 0 19348 588 368 S 0.0 0.1 0:06.57 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:15.29 migration/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:01.94 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:11.31 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.02 migration/1
10 root RT 0 0 0 0 S 0.0 0.0 0:00.61 watchdog/1
12 root 20 0 0 0 0 S 0.0 0.0 0:13.20 events/1
[root@beanpc /]#
经验技巧:
- top指令的输出信息包括系统运行时间、平均负载、内存使用情况。CPU状态和最占系统资源的进程状态列表等信息
- top显示的信息每隔3秒钟自动刷新一次,可以使用空格键立即刷新
- top指令可以杀死指定的进程,操作方法为在top运行界面下按K键,然后输入进程号并按Enter键两次即可。
14 – uptime
通过uptime命令可以查看系
统已经运行了多久,可以统计当前处于登陆状态的用户数量,还可以显示当前服务器的负载情况。
[root@beanpc /]# uptime
06:58:37 up 9:49, 5 users, load average: 0.14, 0.11, 0.16
[root@beanpc /]#
15 – vmstat
大多数情况下,你可以使用vmstat命令去查看系统的虚拟内存情况,因为Linux通常会通过虚拟内存来获得更好的存储性能。
如果你的程序占用了大量了内存,那么系统会进行内存页换出的动作,以便把程序从内存中移动到系统SWAP空间中,也就是硬盘中。
如果系统的内存页的换入换出动作频度超过一个临界值,那么这种状态被叫做“Thrashing”。当系统处于thrashing状态时,性能会急剧下降。
vmstat命令便可以帮助人们及时发现此类问题,找出那个拖慢系统的元凶。
vmstat 1
[root@beanpc /]# 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
1 0 406956 85712 10552 408360 14 21 345 388 236 222 3 6 84 7 0
0 0 406956 85704 10552 408424 0 0 0 0 214 305 1 2 97 0 0
0 0 406956 85704 10552 408424 0 0 0 0 230 312 0 2 98 0 0
2 0 406956 85704 10552 408424 0 0 0 32 240 321 1 3 96 0 0
0 0 406956 85704 10552 408424 0 0 0 0 200 308 0 2 98 0 0
3 0 406956 85704 10560 408420 0 0 0 36 200 316 0 2 96 2 0
0 0 406956 85704 10560 408424 0 0 0 32 256 322 1 4 95 0 0
0 0 406956 85704 10560 408424 0 0 0 36 220 313 0 3 97 0 0
^C
[root@beanpc /]#
16 – wireshark
Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包, 并尝试显示包的尽可能详细的情况。 你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级)
Wireshark的前身叫做Ethereal,我们可以认为wireshark是tcpdump命令的大师兄,因为wireshark会更为专业,也具有更高级的协议分析和统计能力。
Wireshark同时具有GUI界面和shell接口。