|
当你发现 Linux 服务器上的系统性能问题,在最开始的 1 分钟时间里,你会查看哪些系统指标呢? Netflix 在 AWS 上有着大规模的 EC2 集群,以及各种各样的性能分析和监控工具。比如我们使用 Atlas 来监控整个平台,用 Vector 实时分析 EC2 实例的性能。这些工具已经能够帮助我们解决大部分的问题,但是有时候我们还是要登录进机器内部,用一些标准的 Linux 性能分析工具来定位问题。
在这篇文章里,Netflix 性能工程团队会介绍一些我们使用的标准的 Linux 命令行工具,在发现问题的前 60 秒内去分析和定位问题。在这 60 秒内,你可以使用下面这 10 个命令行了解系统整体的运行情况,以及当前运行的进程对资源的使用情况。在这些指标里面,我们先关注和错误、以及和资源饱和率相关的指标,然后再看资源使用率。相对来讲,错误和资源饱和率比较容易理解。饱和的意思是指一个资源(CPU,内存,磁盘)上的负载超过了它能够处理的能力,这时候我们观察到的现象就是请求队列开始堆积,或者请求等待的时间变长。 - . r" k+ o. V4 ~6 {
- uptime
% X' V0 g! K% W - dmesg | tail
( ?2 h2 k: r- d5 j0 u - vmstat 1 " a% I7 b9 l7 g8 Z% `0 _
- mpstat -P ALL 1
0 m$ N: b) W1 N4 x' D - pidstat 1
' [. M5 z/ Z, _' q2 ]) ? }1 z; X - iostat -xz 1 4 N6 U7 }, n1 G! `5 e
- free -m " E0 r+ o o+ M: J/ a) F
- sar -n DEV 1 4 }2 O- x9 S" a/ ^% W
- sar -n TCP,ETCP 1 6 J* L7 J4 |, b/ w
- top
复制代码
! G* {! Z1 _. V: ?- o3 `5 U4 R4 q有些命令行依赖于 sysstat 包。通过这些命令行的使用,你可以熟悉一下分析系统性能问题时常用的一套方法或者流程:USE 。这个方法主要从资源使用率(Utilization)、资源饱和度(Satuation)、错误(Error),这三个方面对所有的资源进行分析(CPU,内存,磁盘等等)。在这个分析的过程中,我们也要时刻注意我们已经排除过的资源问题,以便缩小我们定位的范围,给下一步的定位提供更明确的方向。 下面的章节对每个命令行做了一个说明,并且使用了我们在生产环境的数据作为例子。对这些命令行更详细的描述,请查看相应的帮助文档。 1. uptime
9 c6 i1 e& Z( M p; B- $ uptime
2 P0 e2 w. M* r" |+ b: L' n - 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
复制代码 8 u+ Y# i1 f0 T- y/ h* O5 l$ ~" _
这个命令能很快地检查系统平均负载,你可以认为这个负载的值显示的是有多少任务在等待运行。在 Linux 系统里,这包含了想要或者正在使用 CPU 的任务,以及在 io 上被阻塞的任务。这个命令能使我们对系统的全局状态有一个大致的了解,但是我们依然需要使用其它工具获取更多的信息。 这三个值是系统计算的 1 分钟、5 分钟、15 分钟的指数加权的动态平均值,可以简单地认为就是这个时间段内的平均值。根据这三个值,我们可以了解系统负载随时间的变化。比如,假设现在系统出了问题,你去查看这三个值,发现 1 分钟的负载值比 15 分钟的负载值要小很多,那么你很有可能已经错过了系统出问题的时间点。 在上面这个例子里面,负载的平均值显示 1 分钟为 30,比 15 分钟的 19 相比增长较多。有很多原因会导致负载的增加,也许是 CPU 不够用了;vmstat 或者 mpstat 可以进一步确认问题在哪里。 2. dmesg | tail
1 ?$ N6 M T0 U0 Z1 d
( z0 X5 s/ O0 | G! |- $ dmesg | tail 8 o& r, z+ s2 `7 H& e
- [1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 ! x" K, M! }( R! ^0 F
- [...] : v. V: Z: b8 z2 N2 X. \
- [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
+ ]# j8 e0 D+ c* n( [8 L/ J - [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
) ?2 f8 f ]5 a: Z1 ^$ G - [2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP count
复制代码 + B) e2 u- D) e/ f! @
这个命令显示了最新的几条系统日志。这里我们主要找一下有没有一些系统错误会导致性能的问题。上面的例子包含了 oom-killer 以及 TCP 丢包。 不要略过这一步!dmesg 永远值得看一看。 3. vmstat 1
5 p& y. n9 Q" R5 a1 v1 @7 Q' o5 ^, E7 ^! @- 6 Q P! H8 q- T2 ~9 t8 D
- $ vmstat 1 - J5 b( _- ^8 \/ G- Z
- procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# w" g6 j& \* o - r b swpd free buff cache si so bi bo in cs us sy id wa st
+ _& F( d3 d8 m9 A - 34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0
2 c K. u% ?/ { - 32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0
6 q: m* c0 c/ J! R, y7 z - 32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0
! n9 m8 Y \4 n7 `( l - 32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0
: | G2 ]- P0 l. _/ v- x- N - 32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0 ' t6 F0 j9 ^3 |( ~- ?& s, O2 T
- ^C
复制代码 7 Z1 h g! g7 Z" `% l$ P
vmstat 展示了虚拟内存、CPU 的一些情况。上面这个例子里命令行的 1 表示每隔 1 秒钟显示一次。在这个版本的 vmstat 里,第一行表示了这一次启动以来的各项指标,我们可以暂时忽略掉第一行。 需要查看的指标: - r:处在 runnable 状态的任务,包括正在运行的任务和等待运行的任务。这个值比平均负载能更好地看出 CPU 是否饱和。这个值不包含等待 io 相关的任务。当 r 的值比当前 CPU 个数要大的时候,系统就处于饱和状态了。
- free:以 KB 计算的空闲内存大小。
- si,so:换入换出的内存页。如果这两个值非零,表示内存不够了。
- us,sy,id,wa,st:CPU 时间的各项指标(对所有 CPU 取均值),分别表示:用户态时间,内核态时间,空闲时间,等待 io,偷取时间(在虚拟化环境下系统在其它租户上的开销)$ G b( P) u9 E' z* f" Q) ?
把用户态 CPU 时间(us)和内核态 CPU 时间(sy)加起来,我们可以进一步确认 CPU 是否繁忙。等待 IO 的时间 (wa)高的话,表示磁盘是瓶颈;注意,这个也被包含在空闲时间里面(id), CPU 这个时候也是空闲的,任务此时阻塞在磁盘 IO 上了。你可以把等待 IO 的时间(wa)看做另一种形式的 CPU 空闲,它可以告诉你 CPU 为什么是空闲的。 系统处理 IO 的时候,肯定是会消耗内核态时间(sy)的。如果内核态时间较多的话,比如超过 20%,我们需要进一步分析,也许内核对 IO 的处理效率不高。 在上面这个例子里,CPU 时间大部分都消耗在了用户态,表明主要是应用层的代码在使用 CPU。CPU 利用率 (us + sy)也超过了 90%,这不一定是一个问题;我们可以通过 r 和 CPU 个数确定 CPU 的饱和度。 4. mpstat -P ALL 1
& [/ ~6 Z) j z! {: q8 z
) j* C3 R7 Z- e: B, Y- $ mpstat -P ALL 1
/ L' \3 A" o9 ^/ F R - Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)7 L F( f- T. n" U8 u7 h9 t5 |
- y; U2 R" P4 Y4 y: ]- 07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
, e+ g* B1 w8 s. E - 07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
3 e' p) v8 i3 p0 d - 07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99 % ^1 x$ o( t4 B5 A9 U) J- }
- 07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 / { `/ g2 j3 p9 Q1 R
- 07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 * k; }5 j, Z6 P }
- 07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03 & C" V4 i; ?6 l5 ?; P
- [...]
复制代码 # b. }( r9 r6 }+ l' d0 K' n( w
这个命令把每个 CPU 的时间都打印出来,可以看看 CPU 对任务的处理是否均匀。比如,如果某一单个 CPU 使用率很高的话,说明这是一个单线程应用。 5. pidstat 1
8 {! }6 x5 j4 I- 1 {5 k1 w, k; a7 S; [
- $ pidstat 1 ) R$ s; n: w* x
- Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)/ \" r+ e% G: I7 w! J. T
8 ]% ]9 K$ u; q( m( L% U, r- ? U- 07:41:02 PM UID PID %usr %system %guest %CPU CPU Command
) U2 h# i! l4 R) D( _: v: o( U - 07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0 ) I! X) @4 \! Z1 e5 q1 ?
- 07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave
3 y/ y6 g; |0 L% [$ a9 v - 07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java
! K* z# m" o$ ]( j' q P8 B0 ] - 07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java
% v! t! ^" Q+ ?/ V! S2 d. g - 07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java
' g) ~" T/ m9 J$ B+ J# M - 07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat
5 l5 z I- v& r" o8 V
( g! B2 o7 C$ w, v/ {, @- 07:41:03 PM UID PID %usr %system %guest %CPU CPU Command
" B1 H0 c' C u/ }$ j2 T - 07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave % L0 Y+ m0 ? H# Z( Q" m& O; E
- 07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java H( {+ O+ l) r$ `8 O. z) S2 r3 b( f
- 07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java
6 R' x* D; ?1 v( h' u/ |) i - 07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass
( v: a" v% p6 B. ?) ^9 I- L - 07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat
9 v) x1 o) _1 ~4 z" N' I% j - ^C
复制代码 P1 I6 X0 z" x( T. ?. c! @6 m2 O
pidstat 和 top 很像,不同的是它可以每隔一个间隔打印一次,而不是像 top 那样每次都清屏。这个命令可以方便地查看进程可能存在的行为模式,你也可以直接 copy past,可以方便地记录随着时间的变化,各个进程运行状况的变化。 上面的例子说明有 2 个 Java 进程消耗了大量 CPU。这里的 %CPU 表明的是对所有 CPU 的值,比如 1591% 标识这个 Java 进程几乎消耗了 16 个 CPU。 6. iostat -xz 1
n& z' o& [; w1 W4 {3 N
. g: L7 S# Y2 l' @- $ iostat -xz 1
7 J; z, j6 e* r- E - Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 x86_64 (32 CPU) 5 {$ G' G: g" |: g
- avg-cpu: %user %nice %system %iowait %steal %idle
6 s- E# {% \' {& A; g( P - 73.96 0.00 3.73 0.03 0.06 22.21
U8 x6 A( @/ i& l/ ? - Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
" ~, w" ^, ?: K5 p' a0 }3 j o - xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
7 K4 q; n5 e& N3 V6 r - xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
3 g0 x) K" O: L# N7 P9 w( t - xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
0 |: W- k3 b% R6 c7 ` ` - dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04 % k4 w% z, u0 B& v
- dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00 ) o w* l: U4 E5 b8 I3 {1 Y
- dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23
复制代码
) m# W& b; j3 liostat 是理解块设备(磁盘)的当前负载和性能的重要工具。几个指标的含义: - r/s,w/s,rkB/s,wkB/s:系统发往设备的每秒的读次数、每秒写次数、每秒读的数据量、每秒写的数据量。这几个指标反映的是系统的工作负载。系统的性能问题很有可能就是负载太大。
- await:系统发往 IO 设备的请求的平均响应时间。这包括请求排队的时间,以及请求处理的时间。超过经验值的平均响应时间表明设备处于饱和状态,或者设备有问题。
- avgqu-sz:设备请求队列的平均长度。队列长度大于 1 表示设备处于饱和状态。
- %util:设备利用率。设备繁忙的程度,表示每一秒之内,设备处理 IO 的时间占比。大于 60% 的利用率通常会导致性能问题(可以通过 await 看到),但是每种设备也会有有所不同。接近 100% 的利用率表明磁盘处于饱和状态。
. `1 ^$ N! n" d! R! n0 J: o; z
如果这个块设备是一个逻辑块设备,这个逻辑快设备后面有很多物理的磁盘的话,100% 利用率只能表明有些 IO 的处理时间达到了 100%;后端的物理磁盘可能远远没有达到饱和状态,可以处理更多的负载。 还有一点需要注意的是,较差的磁盘 IO 性能并不一定意味着应用程序会有问题。应用程序可以有许多方法执行异步 IO,而不会阻塞在 IO 上面;应用程序也可以使用诸如预读取,写缓冲等技术降低 IO 延迟对自身的影响。 7. free -m# W, k$ o) `- i1 f5 g) T
! B( I; `. e) q- $ free -m - r: D' Y7 w% u; |* ?( h
- total used free shared buffers cached
$ |+ T, o* @4 u$ _9 ~$ } - Mem: 245998 24545 221453 83 59 541
# i- L; }& n: \: m+ q+ n - -/+ buffers/cache: 23944 222053
9 L/ N1 k9 N, \. q! J8 v, ^ - Swap:
复制代码 " e; V- }( z* ] A2 E- z: N
右边的两列显式: - buffers:用于块设备 I/O 的缓冲区缓存。
- cached:用于文件系统的页面缓存。! X$ t1 u# ^/ [. t- Y" c
我们只是想要检查这些不接近零的大小,其可能会导致更高磁盘 I/O(使用 iostat 确认),和更糟糕的性能。上面的例子看起来还不错,每一列均有很多 M 个大小。 比起第一行,-/+ buffers/cache 提供的内存使用量会更加准确些。Linux 会把暂时用不上的内存用作缓存,一旦应用需要的时候就立刻重新分配给它。所以部分被用作缓存的内存其实也算是空闲的内存。为了解释这一点, 甚至有人专门建了个网站:http://www.linuxatemyram.com/。 如果使用 ZFS 的话,可能会有点困惑。ZFS 有自己的文件系统缓存,在 free -m 里面看不到;系统看起来空闲内存不多了,但是有可能 ZFS 有很多的缓存可用。 8. sar -n DEV 1
; c! F5 X. p! z! n6 D- $ Y6 E* Y. k" q/ }3 @3 w% i
- $ sar -n DEV 1 ) j9 t& Z s T
- Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
4 C9 Q( }. f+ v3 x
. p& c2 X" k6 S7 [* M- 12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
0 |/ g7 k; p* e. U2 S - 12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
" ^6 ^* C( `7 p. r7 J; K) o# t6 a - 12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00 8 N9 U8 U/ v! \" Z: \
- 12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
W, t, K C8 v
; l) {( z! k+ p* n- 12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil ; u- J6 g5 o. ] p5 m
- 12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00 " i& A: y2 {2 X: O6 y' {) O9 b
- 12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
8 {/ O b& G7 }5 J - 12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2 s; f1 l4 E* x: ?, f
- ^C
复制代码
; M& F) [4 j/ y# e9 F* Y这个工具可以查看网络接口的吞吐量:rxkB/s 和 txkB/s 可以测量负载,也可以看是否达到网络流量限制了。在上面的例子里,eth0 的吞吐量达到了大约 22 Mbytes/s,差不多 176 Mbits/sec ,比 1 Gbit/sec 还要少很多。 这个例子里也有 %ifutil 标识设备利用率,我们也用 Brenan 的 nicstat tool 测量。和 nicstat 一样,这个设备利用率很难测量正确,上面的例子里好像这个值还有点问题。 9. sar -n TCP,ETCP 1! y& _; l" Q# a s8 Y
- 2 X1 t* q/ Q' A1 S9 `2 d; D
- $ sar -n TCP,ETCP 1
/ V' I$ g, W! a1 ~* M - Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
! ^- Y1 l8 e2 n# S! W
, j+ w$ m# L9 M6 H3 o" e/ b9 A- 12:17:19 AM active/s passive/s iseg/s oseg/s 6 q: h& d3 |$ H; A: @
- 12:17:20 AM 1.00 0.00 10233.00 18846.000 l: i0 f2 }7 `* e, `
- 7 o1 q* x7 l4 w9 L1 \! |6 O3 o6 J
- 12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
+ `/ E, ~" h' b - 12:17:20 AM 0.00 0.00 0.00 0.00 0.00
" Z$ d# v# t, q
; ^% e1 j# H( k# E# H4 Q* E' H2 J4 w( p/ ?- 12:17:20 AM active/s passive/s iseg/s oseg/s
' y$ m( d0 t4 L3 m7 Q+ @ r* X - 12:17:21 AM 1.00 0.00 8359.00 6039.00
' [# s; Q0 e4 I2 b9 G$ m0 I' g
7 @8 @+ s6 a# b. ~/ x4 _6 K; E- 12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
% A9 p# P8 t' r( P D - 12:17:21 AM 0.00 0.00 0.00 0.00 0.00
. M% S& V1 `% [' E9 P - ^C
复制代码 ) |9 G6 y4 ~, g
这是对 TCP 重要指标的一些概括,包括: - active/s:每秒钟本地主动开启的 TCP 连接,也就是本地程序使用 connect() 系统调用
- passive/s:每秒钟从源端发起的 TCP 连接,也就是本地程序使用 accept() 所接受的连接
- retrans/s:每秒钟的 TCP 重传次数
- atctive 和 passive 的数目通常可以用来衡量服务器的负载:接受连接的个数(passive),下游连接的个数(active)。可以简单认为 active 为出主机的连接,passive 为入主机的连接;但这个不是很严格的说法,比如 loalhost 和 localhost 之间的连接。
N# ~1 I: d+ I* i4 l
重传表示网络或者服务器的问题。也许是网络不稳定了,也许是服务器负载过重开始丢包了。上面这个例子表示每秒只有 1 个新连接建立。 10. top
- H3 s; x8 P# l$ K% e- 7 _ @0 ` A9 E+ V7 g2 j
- $ top
" \+ B6 |( N _! z; ~1 ?/ _ - top - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92
& \2 }# t1 p2 ?* m' K8 {1 h - Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie
) |) a% X( G: a( _, D+ R- y x - %Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
& x' q' N& ]+ M# p - KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers ) l# N/ x4 L. q! P5 G& ]
- KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem8 f( @/ n o q) d
& M% f2 u$ J* w: D+ x# W- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8 r0 h5 P @+ x1 |( Q L( W6 I - 20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java
" `1 B7 Z9 p2 t/ J1 t0 }1 l: H - 4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave
/ B- u4 G! v0 v3 { - 66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top
" z+ [7 G, k4 d, l - 5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java
+ p0 L4 p: }' s% Y; u: g( f - 4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java
6 p, d! K9 M5 t - 1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init
$ k. Q6 \6 U+ ]; O2 e t* w - 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
; g$ W) e" L0 z1 V- p - 3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0
7 H! M( F- K$ i - 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 q. V( @* b& w' r* m - 6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0
, F* P$ U( O4 m) A4 V: g# z - 8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched
复制代码 & z. G% P0 h$ K' [, @
top 命令涵盖了我们前面讲述的许多指标。我们可以用它来看和我们之前查看的结果有没有很大的不同,如果有的话,那表示系统的负载在变化。 top 的缺点就是你很难找到这些指标随着时间的一些行为模式,在这种情况下,vmstat 或者 pidstat 这种可以提供滚动输出的命令是更好的方式。如果你不以足够快的速度暂停输出(Ctrl-S 暂停,Ctrl-Q 继续),一些间歇性问题的线索也可能由于被清屏而丢失。 0 c! d& L8 L8 f7 p- I
0 p x, f, [! ]9 t% m0 ^. b
|