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接口。