在不同的 Linux 发行版中,会有不同的 GUI 程式可以显示各种系统资讯,比如 SUSE Linux 发行版中,就有非常棒的图形化的配置和管理工具 YaST,KDE 桌面环境里的 KDE System Guard 也很不错。
然而,对于一名 Linux 系统管理员来说,除非迫不得已,否则不会在 Linux 站群服务器上去执行这样的 GUI 程式,主要还是因为 GUI 会占用很多的系 统资源。所以呢,使用 GUI 工具一般都是做简单的排查,如果你真的想知道系统里真正发生了什么,那么请关掉你的 GUI,快点进入 Linux 命令列的世界 吧。
如果希望追求最佳效能,那么 Linux 站群服务器应该执行在 runlevel 3 级别,也就是支援互联网和多使用者功能,但不支援 GUI 功能。如果你真的需要 GUI,那么可以在命令列输入 startx 进入 GUI 。
如果你的 Linux 系统预设就是进入 GUI,你可以调一调配置,让他预设进入 runlevel 3 。具体方法就是:

1 开启一个终端,su 到 root 账号
2 用你喜欢的编辑器(vi/emacs/…)开启/etc/inittab 档案
3 查询 initdefault 关键字,将 “id:5:initdefault:” 修改为 “id:3:initdefault:”

如果系统中根本就没有/etc/inittab 档案的话,也没关系,直接建立这个档案,并新增新的一行 “id:3” 。这样的话,你再重启站群服务器,便会预设进入命令列状态。当然,如果你只想在临时进入命令列状态,那么直接在终端中输入 “init 3” 就好了。
至此,我们的命令列准备好了,下面就可以开始通过强大的命令来检视 “到底站群服务器里发生了什么”:

[01 – iostat ]
[02/03 – meminfo/free ]
[04 – mpstat ]
[05 – netstat ]
[06 – nmon ]
[07 – pmap ]
[08/09 – ps/pstree ]
[10 – sar ]
[11 – strace ]
[12 – tcpdump ]
[13 – top ]
[14 – uptime ]
[15 – vmstat ]
[16 – wireshark ]

[01 – iostat]
iostat 命令显示的是你的储存系统的细节状态。你通常可以用这个命令去检测你的储存装置是否工作正常,
完全可以在使用者抱怨站群服务器慢之前,通过这个命令发现系统 IO 方面的问题。
如下可以看到 iostat 既可以显示 CPU 使用情况,也可以看到每个磁碟的 IO 情况。

# iostat 1
Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012 年 12 月 22 日 _i686_ (4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.55 0.00 0.03 0.02 0.00 99.40

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sdb 0.41 2.61 5.76 2558664 5653872
sda 0.24 0.80 4.12 784650 4038344

[02/03 – meminfo/free]
meminfo 提供了很详细的内存使用状况。可以直接用 cat 命令检视:

cat /proc/meminfo

当然 meminfo 里包含了太多细节,你可以直接使用 free 命令来检视有关内存的综述。

# free -m
total used free shared buffers cached
Mem: 1513 1429 83 0 343 836
-/+ buffers/cache: 249 1263
Swap: 0 0 0

[04 – mpstat]
mpstat 用在多处理器的站群服务器上,用来显示每一个 CPU 的状态。
另外,mpstat 也会显示所有处理器的平均状况。
你可以设定显示每个站群服务器的 CPU 统计资讯,或者每个处理的 CPU 统计资讯。

# mpstat -P ALL
Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012 年 12 月 22 日 _i686_ (4 CPU)

17 时 46 分 35 秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
17 时 46 分 35 秒 all 0.55 0.00 0.03 0.02 0.00 0.00 0.00 0.00 99.40
17 时 46 分 35 秒 0 0.84 0.00 0.04 0.03 0.00 0.01 0.00 0.00 99.08
17 时 46 分 35 秒 1 0.51 0.00 0.03 0.02 0.00 0.00 0.00 0.00 99.44
17 时 46 分 35 秒 2 0.45 0.00 0.02 0.01 0.00 0.00 0.00 0.00 99.51
17 时 46 分 35 秒 3 0.40 0.00 0.02 0.01 0.00 0.00 0.00 0.00 99.56

# mpstat -P 0
Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012 年 12 月 22 日 _i686_ (4 CPU)

17 时 46 分 39 秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
17 时 46 分 39 秒 0 0.84 0.00 0.04 0.03 0.00 0.01 0.00 0.00 99.08

其中各个域的含义简述如下:

1 CPU:处理器编号,如果为 all,则此行表示的是所有处理器的统计平均值
2 %usr:使用者态的 CPU 利用率
3 %nice:具有排程优先顺序的使用者态 CPU 利用率
4 %sys:核心态 CPU 利用率(此值不包括响应硬体中断和站群软件中断的时间)
5 %iowait:处理 IO 请求导致 CPU 处于 IDLE 状态的时间百分比
6 %irq:CPU 响应硬体中断的时间比率
7 %soft:CPU 响应站群软件中断的时间比率
8 %steal:当虚拟机器监控器在服务于其他虚拟处理器时,虚拟 CPU 的被动等待时间比率
9 %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 监控工具
[07 – pmap]
pmap 命令可以显示程序占用的内存量。
你可以通过 pmap 找到那个占用内存量最多的程序。
如下就是 nignx 主程序所占用的内存情况:

# pmap 2395|head -n 10
2395: nginx: master process ./sbin/nginx
00110000 240K r-x– /lib/libgssapi_krb5.so.2.2
0014c000 4K —– /lib/libgssapi_krb5.so.2.2
0014d000 4K r—- /lib/libgssapi_krb5.so.2.2
0014e000 4K rw— /lib/libgssapi_krb5.so.2.2
0014f000 12K r-x– /lib/libcom_err.so.2.1
00152000 4K r—- /lib/libcom_err.so.2.1
00153000 4K rw— /lib/libcom_err.so.2.1
00154000 48K r-x– /lib/libnss_files-2.12.so
00160000 4K r—- /lib/libnss_files-2.12.so

b78e4000 20K rw— [ anon ]
b78f3000 4K rw-s- /dev/zero (deleted)
b78f4000 4K rw— [ anon ]
bfeaa000 84K rw— [ stack ]
total 7280K

[08/09 – ps/pstree]
ps 和 pstree 在 Linux 系统里是一对好兄弟,它们都是用来列出处于执行状态的程序的列表的。
ps 告诉我们每个程序使用的内存量以及所消耗的 CPU 时间。
pstree 则会告诉我们程序间的父子关系,如下便是 mysql 的一些父子关系资讯:

# pstree -p 1829
mysqld_safe(1829)───mysqld(2307)─┬─{mysqld}(2309)
├─{mysqld}(2310)
├─{mysqld}(2311)
├─{mysqld}(2312)
├─{mysqld}(2313)
├─{mysqld}(2314)
├─{mysqld}(2315)
├─{mysqld}(2316)
├─{mysqld}(2317)
├─{mysqld}(2318)
├─{mysqld}(2320)
├─{mysqld}(2321)
├─{mysqld}(2322)
├─{mysqld}(2323)
├─{mysqld}(2325)
├─{mysqld}(2544)
├─{mysqld}(2548)
├─{mysqld}(7912)
├─{mysqld}(7914)
├─{mysqld}(7916)
├─{mysqld}(24689)
├─{mysqld}(27329)
└─{mysqld}(27331)

[10 – sar]
sar 命令堪称系统监控工具里的瑞士军刀。
sar 命令实际上是由三个程式组成的,即 sar(用于显示资料)、 sa1(用于采集资料) 和 sa2(用于储存资料)。
sar 可以涵盖到 CPU 利用率资讯、内存换页资讯、互联网 IO 传输资讯、程序建立行为和储存装置行为。
sar 和 nmon 的最大区别在于,sar 更适用于长期的系统监控,而 nmon 则更适用于快速检视资讯。
如果希望更详细的学习 sar 命令,可以阅读《sar 访谈》-linux 命令五分钟系列之二十九。
[11 – strace]
starce 经常被用来作为追查程式问题的工具,但他的功能远非如此。
它可以解析和记录程序的系统呼叫行为,这使得 strace 成为了一个非常有用的诊断、调查和纠错工具。
举例来说,你可以适用 strace 来追查到一个程式在启动之初所需载入的配置档案资讯。
当然,strace 也有它自身的缺陷,那就是 strace 会严重拖慢调查物件(某个程序)的效能和执行速度。
顺便推荐一篇非常好的 strace 的文章:《strace 使用详解》
另外,如果你使用 MAC,strace 的替代品是 truss 。
[12 – tcpdump]
tcpdump 是一个简单的、好用的互联网监控工具。它的互联网协议分析能力使得它能够看清互联网中到底发生了什么,如果你希望更细节的调查的话,可以考虑适用功能更为强大的 wireshark 工具。
tcpdump 的系列教程 “在这里” 。
[13 – top]
top 命令可以显示系统中的程序资讯。预设情况下,top 会按照 CPU 使用率从高到低来显示系统中的程序,并且每 5 秒重新整理一次排行榜。
当然,你也可以让 top 按照 PID 、程序寿命、 CPU 耗时、内存消耗等维度对程序进行排序。(我经常使用的是 P 和 M 快捷键,分别是按 CPU 利用率排序、按内存使用量排序)
通过 top 命令,你可以很快的发现那些失去控制或不符合预期的程序。
[14 – uptime]
通过 uptime 命令可以检视系统已经执行了多久,可以统计当前处于登陆状态的使用者数量,还可以显示当前站群服务器的负载情况。

# uptime
18:35:17 up 11 days, 9:30, 1 user, load average: 0.00, 0.00, 0.00

[15 – vmstat]
大多数情况下,你可以使用 vmstat 命令去检视系统的虚拟内存情况,因为 Linux 通常会通过虚拟内存来获得更好的储存效能。
如果你的程式占用了大量了内存,那么系统会进行内存页换出的动作,以便把程式从内存中移动到系统 SWAP 空间中,也就是硬碟中。
如果系统的内存页的换入换出动作频度超过一个临界值,那么这种状态被叫做 “Thrashing” 。当系统处于 thrashing 状态时,效能会急剧下降。
vmstat 命令便可以帮助人们及时发现此类问题,找出那个拖慢系统的元凶。

# 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 57484 356864 861332 0 0 0 1 7 3 1 0 99 0 0
0 0 0 57468 356864 861360 0 0 0 0 336 145 6 1 94 0 0
0 0 0 57468 356864 861360 0 0 0 0 43 51 0 0 100 0 0
0 0 0 57468 356864 861360 0 0 0 16 51 62 0 0 100 0 0

[16 – wireshark]
Wireshark 的前身叫做 Ethereal, 我们可以认为 wireshark 是 tcpdump 命令的大师兄,因为 wireshark 会更为专业,也具有更高阶的协议分析和统计能力。
Wireshark 同时具有 GUI 介面和 shell 借口。
如果你是一位资深的互联网管理员,那么你一定使用过 ethereal 。而如果你正在使用 wireshark/ethereal,那么我推荐你阅读 Chris Sander 的一本非常好的书《Practical Packet Analysis》。
谢谢!

原文连结:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.techug.com%2F