@gy-ban
2017-03-26T14:32:12.000000Z
字数 6510
阅读 415
系统优化
作为一个系统运维人员,在系统出现故障能快速准确定位问题所在是一项必须掌握的技能。
通过运行下面十个命令,你就能在六十秒内粗略地了解系统正在运行的进程及资源使用情况。通过查看这些命令输出的错误信息和资源饱和度(它们都很容易看懂),你可以接下来对资源进行优化。饱和是指某个资源的负载超出了其能够处理的限度。一旦出现饱和,它通常会在请求队列的长度或等待时间上暴露出来。
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
其中某些命令需要预先安装 sysstat 软件包。这些命令展示出来的信息能够帮你实施 USE 方法(一种用于定位性能瓶颈的方法),比如检查各种资源(如 CPU、内存、磁盘等)的使用率、饱和度和错误信息。另外在定位问题的过程中,你可以通过使用这些命令来排除某些导致问题的可能性,帮助你缩小检查范围,为下一步检查指明方向。
$ uptime
22:14:27 up 64 days, 5:48, 1 user, load average: 0.00, 0.02, 0.00
这是一种用来快速查看系统平均负载的方法,也能了解到系统运行的时长,它仅仅是对系统负载的一个粗略展示,稍微看下即可。你还需要其他工具来进一步了解具体情况。
powernow-k8: 2 : pstate 2 (1600 MHz)
powernow-k8: 3 : pstate 3 (800 MHz)
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
eth0: no IPv6 routers present
fuse init (API version 7.14)
SELinux: initialized (dev fuse, type fuse), uses genfs_contexts
这条命令显式了最近的 10 条系统消息,主要用来查找能够导致性能问题的错误。
]$ 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
0 0 632568 414844 494384 1337604 0 0 10 12 3 1 6 2 91 0 0
1 0 632568 414836 494384 1337632 0 0 0 0 1301 1319 5 3 92 0 0
0 0 632568 414712 494384 1337632 0 0 72 4 1392 1472 6 4 89 1 0
0 0 632568 414588 494384 1337704 0 0 0 0 1320 1373 5 3 92 0 0
vmstat(8) 是虚拟内存统计的简称,其是一个常用工具(几十年前为了 BSD 所创建)。其在每行打印一条关键的服务器的统计摘要。
vmstat 命令指定一个参数 1 运行,来打印每一秒的统计摘要。(这个版本的 vmstat)输出的第一行的那些列,显式的是开机以来的平均值,而不是前一秒的值。现在,我们跳过第一行,除非你想要了解并记住每一列。
检查这些列:
r:CPU 中正在运行和等待运行的进程的数量。其提供了一个比平均负载更好的信号来确定 CPU 是否饱和,因为其不包含 I/O。解释:“r”的值大于了 CPU 的数量就表示已经饱和了。
free:以 kb 为单位显式的空闲内存。如果数字位数很多,说明你有足够的空闲内存。“free -m” 命令,是下面的第七个命令,其可以更好的说明空闲内存的状态。
si, so:Swap-ins 和 swap-outs。如果它们不是零,则代表你的内存不足了。
us, sy, id, wa, st:这些都是平均了所有 CPU 的 CPU 分解时间。它们分别是用户时间(user)、系统时间(内核)(system)、空闲(idle)、等待 I/O(wait)、以及占用时间(stolen)(被其他访客,或使用 Xen,访客自己独立的驱动域)。
CPU 分解时间将会通过用户时间加系统时间确认 CPU 是否为忙碌状态。等待 I/O 的时间一直不变则表明了一个磁盘瓶颈;这就是 CPU 的闲置,因为任务都阻塞在等待挂起磁盘 I/O 上了。你可以把等待 I/O 当成是 CPU 闲置的另一种形式,其给出了为什么 CPU 闲置的一个线索。
对于 I/O 处理来说,系统时间是很重要的。一个高于 20% 的平均系统时间,可以值得进一步的探讨:也许内核在处理 I/O 时效率太低了。
$ mpstat -P ALL 1
Linux 2.6.32-504.8.1.el6.x86_64 (boohee-qa) 2017年03月26日 _x86_64_ (2 CPU)
22时23分25秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
22时23分26秒 all 5.58 0.00 2.54 0.00 0.00 0.00 0.00 0.00 91.88
22时23分26秒 0 6.12 0.00 2.04 0.00 0.00 1.02 0.00 0.00 90.82
22时23分26秒 1 4.95 0.00 2.97 0.00 0.00 0.00 0.00 0.00 92.08
22时23分26秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
22时23分27秒 all 6.09 0.00 1.52 0.00 0.00 0.51 0.00 0.00 91.88
22时23分27秒 0 6.25 0.00 1.04 0.00 0.00 0.00 0.00 0.00 92.71
22时23分27秒 1 6.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 92.00
这个命令打印每个 CPU 的 CPU 分解时间,其可用于对一个不均衡的使用情况进行检查。一个单独 CPU 很忙碌则代表了正在运行一个单线程的应用程序。
$ pidstat 1
Linux 2.6.32-504.8.1.el6.x86_64 (boohee-qa) 2017年03月26日 _x86_64_ (2 CPU)
22时24分09秒 PID %usr %system %guest %CPU CPU Command
22时24分10秒 7 0.00 0.89 0.00 0.89 1 migration/1
22时24分10秒 1060 0.89 0.00 0.00 0.89 0 ruby
22时24分10秒 1169 0.00 1.79 0.00 1.79 0 kondemand/0
22时24分10秒 1778 0.00 0.89 0.00 0.89 0 mfschunkserver
22时24分10秒 2214 0.89 0.00 0.00 0.89 1 beam.smp
22时24分10秒 5173 0.00 0.89 0.00 0.89 1 ruby
22时24分10秒 5641 0.89 0.00 0.00 0.89 1 ruby
22时24分10秒 6140 1.79 0.89 0.00 2.68 1 ruby
22时24分10秒 6344 0.89 0.00 0.00 0.89 0 ruby
22时24分10秒 8215 0.89 0.00 0.00 0.89 1 ruby
22时24分10秒 11494 0.89 0.00 0.00 0.89 0 ruby
22时24分10秒 11944 1.79 0.00 0.00 1.79 1 ruby
22时24分10秒 13312 0.89 0.89 0.00 1.79 1 ruby
22时24分10秒 22491 0.00 0.89 0.00 0.89 1 ruby
22时24分10秒 29499 0.00 0.89 0.00 0.89 0 pidstat
pidstat 命令有点像 top 命令对每个进程的统计摘要,但循环打印一个滚动的统计摘要来代替 top 的刷屏。其可用于实时查看,同时也可将你所看到的东西(复制粘贴)到你的调查记录中。
iostat -xz 1
Linux 2.6.32-504.8.1.el6.x86_64 (boohee-qa) 2017年03月26日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
6.28 0.00 2.41 0.35 0.00 90.95
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.30 4.90 0.97 8.37 40.21 47.49 9.39 0.08 8.65 1.07 1.00
dm-0 0.00 0.00 0.45 9.48 26.09 17.60 4.40 0.05 5.09 0.57 0.56
dm-1 0.00 0.00 0.02 0.05 0.18 0.40 8.00 0.00 18.79 0.69 0.01
dm-2 0.00 0.00 0.81 3.69 13.94 29.48 9.66 0.68 151.64 1.07 0.48
avg-cpu: %user %nice %system %iowait %steal %idle
6.06 0.00 2.02 0.00 0.00 91.92
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
avg-cpu: %user %nice %system %iowait %steal %idle
5.58 0.00 3.05 0.51 0.00 90.86
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 3.00 0.00 144.00 0.00 48.00 0.02 6.33 6.33 1.90
dm-0 0.00 0.00 3.00 0.00 144.00 0.00 48.00 0.02 6.33 6.33 1.90
这是用于查看块设备(磁盘)情况的一个很棒的工具,无论是对工作负载还是性能表现来说。查看个列:
r/s, w/s, rkB/s, wkB/s:这些分别代表该设备每秒的读次数、写次数、读取 kb 数,和写入 kb 数。这些用于描述工作负载。性能问题可能仅仅是由于施加了过大的负载。
await:以毫秒为单位的 I/O 平均消耗时间。这是应用程序消耗的实际时间,因为它包括了排队时间和处理时间。比预期更大的平均时间可能意味着设备的饱和,或设备出了问题。
avgqu-sz:向设备发出的请求的平均数量。值大于 1 说明已经饱和了(虽说设备可以并行处理请求,尤其是由多个磁盘组成的虚拟设备。)
%util:设备利用率。这个值是一个显示出该设备在工作时每秒处于忙碌状态的百分比。若值大于 60%,通常表明性能不佳(可以从 await 中看出),虽然它取决于设备本身。值接近 100% 通常意味着已饱和。
如果该存储设备是一个面向很多后端磁盘的逻辑磁盘设备,则 100% 利用率可能只是意味着当前正在处理某些 I/O 占用,然而,后端磁盘可能远未饱和,并且可能能够处理更多的工作。
请记住,磁盘 I/O 性能较差不一定是程序的问题。许多技术通常是异步 I/O,使应用程序不会被阻塞并遭受延迟(例如,预读,以及写缓冲)。
$ free -m
total used free shared buffers cached
Mem: 15949 15559 389 1 483 1312
-/+ buffers/cache: 13764 2185
Swap: 5015 617 4398
右边的两列显式:
buffers:用于块设备 I/O 的缓冲区缓存。
cached:用于文件系统的页面缓存。
我们只是想要检查这些不接近零的大小,其可能会导致更高磁盘 I/O(使用 iostat 确认),和更糟糕的性能。上面的例子看起来还不错,每一列均有很多 M 个大小。
比起第一行,-/+ buffers/cache 提供的内存使用量会更加准确些。Linux 会把暂时用不上的内存用作缓存,一旦应用需要的时候就立刻重新分配给它。所以部分被用作缓存的内存其实也算是空闲的内存。为了解释这一点, 甚至有人专门建了个网站: linuxatemyram。
$ sar -n DEV 1
Linux 2.6.32-504.8.1.el6.x86_64 (boohee-qa) 2017年03月26日 _x86_64_ (2 CPU)
22时29分44秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
22时29分45秒 lo 2.04 2.04 0.12 0.12 0.00 0.00 0.00
22时29分45秒 eth0 225.51 213.27 19.28 18.44 0.00 0.00 0.00
22时29分45秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
22时29分46秒 lo 25.26 25.26 1.50 1.50 0.00 0.00 0.00
22时29分46秒 eth0 261.05 257.89 19.95 21.05 0.00 0.00 0.00
这个工具可以被用来检查网络接口的吞吐量:rxkB/s 和 txkB/s,以及是否达到限额。上面的例子中,eth0 接收的流量达到 22Mbytes/s,也即 176Mbits/sec(限额是 1Gbit/sec)
我们用的版本中还提供了 %ifutil 作为设备使用率(接收和发送的最大值)的指标。我们也可以用 Brendan 的 nicstat 工具计量这个值。一如 nicstat,sar 显示的这个值是很难精确取得的,在这个例子里面,它就没在正常的工作(0.00)。
$ sar -n TCP,ETCP 1
Linux 2.6.32-504.8.1.el6.x86_64 (boohee-qa) 2017年03月26日 _x86_64_ (2 CPU)
22时30分37秒 active/s passive/s iseg/s oseg/s
22时30分38秒 0.00 0.00 230.61 230.61
22时30分37秒 atmptf/s estres/s retrans/s isegerr/s orsts/s
22时30分38秒 0.00 0.00 0.00 0.00 0.00
22时30分38秒 active/s passive/s iseg/s oseg/s
22时30分39秒 0.00 0.00 250.00 242.71
22时30分38秒 atmptf/s estres/s retrans/s isegerr/s orsts/s
22时30分39秒 0.00 0.00 0.00 0.00 0.00
这是一些关键的 TCP 指标的汇总视图。这些包括:
active/s:每秒本地发起 TCP 连接数(例如,通过 connect())。
passive/s:每秒远程发起的 TCP 连接数(例如,通过 accept())。
retrans/s:每秒重传 TCP 次数。
active 和 passive 的连接数往往对于描述一个粗略衡量服务器负载是非常有用的:新接受的连接数(passive),下行连接数(active)。可以理解为 active 连接是对外的,而 passive 连接是对内的,虽然严格来说并不完全正确(例如,一个 localhost 到 localhost 的连接)。
重传是出现一个网络和服务器问题的一个征兆。其可能是由于一个不可靠的网络(例如,公网)造成的,或许也有可能是由于服务器过载并丢包。上面的例子显示了每秒只有一个新的 TCP 连接。
top 命令包含了很多我们之前已经检查过的指标。可以方便的执行它来查看相比于之前的命令输出的结果有很大不同,这表明负载是可变的。
top 的一个缺点是,很难看到数据随时间变动的趋势。vmstat 和 pidstat 提供的滚动输出会更清楚一些。如果你不以足够快的速度暂停输出(Ctrl-S 暂停,Ctrl-Q 继续),一些间歇性问题的线索也可能由于被清屏而丢失。