你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

60 秒内去分析和定位 Linux系统整体的运行情况

[复制链接]
gaosmile 发布时间:2020-11-20 18:54

当你发现 Linux 服务器上的系统性能问题,在最开始的 1 分钟时间里,你会查看哪些系统指标呢?

Netflix 在 AWS 上有着大规模的 EC2 集群,以及各种各样的性能分析和监控工具。比如我们使用 Atlas 来监控整个平台,用 Vector 实时分析 EC2 实例的性能。这些工具已经能够帮助我们解决大部分的问题,但是有时候我们还是要登录进机器内部,用一些标准的 Linux 性能分析工具来定位问题。

微信图片_20201120185013.png

在这篇文章里,Netflix 性能工程团队会介绍一些我们使用的标准的 Linux 命令行工具,在发现问题的前 60 秒内去分析和定位问题。在这 60 秒内,你可以使用下面这 10 个命令行了解系统整体的运行情况,以及当前运行的进程对资源的使用情况。在这些指标里面,我们先关注和错误、以及和资源饱和率相关的指标,然后再看资源使用率。相对来讲,错误和资源饱和率比较容易理解。饱和的意思是指一个资源(CPU,内存,磁盘)上的负载超过了它能够处理的能力,这时候我们观察到的现象就是请求队列开始堆积,或者请求等待的时间变长。

  1. . r" k+ o. V4 ~6 {
  2. uptime
    % X' V0 g! K% W
  3. dmesg | tail
    ( ?2 h2 k: r- d5 j0 u
  4. vmstat 1 " a% I7 b9 l7 g8 Z% `0 _
  5. mpstat -P ALL 1
    0 m$ N: b) W1 N4 x' D
  6. pidstat 1
    ' [. M5 z/ Z, _' q2 ]) ?  }1 z; X
  7. iostat -xz 1 4 N6 U7 }, n1 G! `5 e
  8. free -m " E0 r+ o  o+ M: J/ a) F
  9. sar -n DEV 1 4 }2 O- x9 S" a/ ^% W
  10. sar -n TCP,ETCP 1 6 J* L7 J4 |, b/ w
  11. top
复制代码

! G* {! Z1 _. V: ?- o3 `5 U4 R4 q

有些命令行依赖于 sysstat 包。通过这些命令行的使用,你可以熟悉一下分析系统性能问题时常用的一套方法或者流程:USE 。这个方法主要从资源使用率(Utilization)、资源饱和度(Satuation)、错误(Error),这三个方面对所有的资源进行分析(CPU,内存,磁盘等等)。在这个分析的过程中,我们也要时刻注意我们已经排除过的资源问题,以便缩小我们定位的范围,给下一步的定位提供更明确的方向。

下面的章节对每个命令行做了一个说明,并且使用了我们在生产环境的数据作为例子。对这些命令行更详细的描述,请查看相应的帮助文档。

1. uptime

  1. 9 c6 i1 e& Z( M  p; B
  2. $ uptime  
    2 P0 e2 w. M* r" |+ b: L' n
  3. 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

  1. ( z0 X5 s/ O0 |  G! |
  2. $ dmesg | tail 8 o& r, z+ s2 `7 H& e
  3. [1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 ! x" K, M! }( R! ^0 F
  4. [...] : v. V: Z: b8 z2 N2 X. \
  5. [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
    + ]# j8 e0 D+ c* n( [8 L/ J
  6. [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
    ) ?2 f8 f  ]5 a: Z1 ^$ G
  7. [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 ^! @
  1. 6 Q  P! H8 q- T2 ~9 t8 D
  2. $ vmstat 1 - J5 b( _- ^8 \/ G- Z
  3. procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    # w" g6 j& \* o
  4. r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    + _& F( d3 d8 m9 A
  5. 34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0
    2 c  K. u% ?/ {
  6. 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
  7. 32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0
    ! n9 m8 Y  \4 n7 `( l
  8. 32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0
    : |  G2 ]- P0 l. _/ v- x- N
  9. 32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0 ' t6 F0 j9 ^3 |( ~- ?& s, O2 T
  10. ^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

  1. ) j* C3 R7 Z- e: B, Y
  2. $ mpstat -P ALL 1
    / L' \3 A" o9 ^/ F  R
  3. 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 |

  4. - y; U2 R" P4 Y4 y: ]
  5. 07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle
    , e+ g* B1 w8 s. E
  6. 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
  7. 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- }
  8. 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
  9. 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  }
  10. 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
  11. [...]
复制代码
# b. }( r9 r6 }+ l' d0 K' n( w

这个命令把每个 CPU 的时间都打印出来,可以看看 CPU 对任务的处理是否均匀。比如,如果某一单个 CPU 使用率很高的话,说明这是一个单线程应用。

5. pidstat 1
8 {! }6 x5 j4 I
  1. 1 {5 k1 w, k; a7 S; [
  2. $ pidstat 1 ) R$ s; n: w* x
  3. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)/ \" r+ e% G: I7 w! J. T

  4. 8 ]% ]9 K$ u; q( m( L% U, r- ?  U
  5. 07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    ) U2 h# i! l4 R) D( _: v: o( U
  6. 07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0 ) I! X) @4 \! Z1 e5 q1 ?
  7. 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
  8. 07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java
    ! K* z# m" o$ ]( j' q  P8 B0 ]
  9. 07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java
    % v! t! ^" Q+ ?/ V! S2 d. g
  10. 07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java
    ' g) ~" T/ m9 J$ B+ J# M
  11. 07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat
    5 l5 z  I- v& r" o8 V

  12. ( g! B2 o7 C$ w, v/ {, @
  13. 07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    " B1 H0 c' C  u/ }$ j2 T
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. ^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

  1. . g: L7 S# Y2 l' @
  2. $ iostat -xz 1
    7 J; z, j6 e* r- E
  3. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  x86_64 (32 CPU) 5 {$ G' G: g" |: g
  4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle
    6 s- E# {% \' {& A; g( P
  5. 73.96    0.00    3.73    0.03    0.06   22.21
      U8 x6 A( @/ i& l/ ?
  6. 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
  7. 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
  8. 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
  9. 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 `  `
  10. 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
  11. 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
  12. 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 l

iostat 是理解块设备(磁盘)的当前负载和性能的重要工具。几个指标的含义:

  • 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

  1. ! B( I; `. e) q
  2. $ free -m - r: D' Y7 w% u; |* ?( h
  3.          total       used       free     shared    buffers     cached
    $ |+ T, o* @4 u$ _9 ~$ }
  4. Mem:        245998      24545     221453         83         59        541
    # i- L; }& n: \: m+ q+ n
  5. -/+ buffers/cache:      23944     222053
    9 L/ N1 k9 N, \. q! J8 v, ^
  6. 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
  1. $ Y6 E* Y. k" q/ }3 @3 w% i
  2. $ sar -n DEV 1 ) j9 t& Z  s  T
  3. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)
    4 C9 Q( }. f+ v3 x

  4. . p& c2 X" k6 S7 [* M
  5. 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
  6. 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
  7. 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: \
  8. 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

  9. ; l) {( z! k+ p* n
  10. 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
  11. 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. 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
  13. 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
  14. ^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
  1. 2 X1 t* q/ Q' A1 S9 `2 d; D
  2. $ sar -n TCP,ETCP 1
    / V' I$ g, W! a1 ~* M
  3. Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
    ! ^- Y1 l8 e2 n# S! W

  4. , j+ w$ m# L9 M6 H3 o" e/ b9 A
  5. 12:17:19 AM  active/s passive/s    iseg/s    oseg/s 6 q: h& d3 |$ H; A: @
  6. 12:17:20 AM      1.00      0.00  10233.00  18846.000 l: i0 f2 }7 `* e, `
  7. 7 o1 q* x7 l4 w9 L1 \! |6 O3 o6 J
  8. 12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
    + `/ E, ~" h' b
  9. 12:17:20 AM      0.00      0.00      0.00      0.00      0.00
    " Z$ d# v# t, q

  10. ; ^% e1 j# H( k# E# H4 Q* E' H2 J4 w( p/ ?
  11. 12:17:20 AM  active/s passive/s    iseg/s    oseg/s
    ' y$ m( d0 t4 L3 m7 Q+ @  r* X
  12. 12:17:21 AM      1.00      0.00   8359.00   6039.00
    ' [# s; Q0 e4 I2 b9 G$ m0 I' g

  13. 7 @8 @+ s6 a# b. ~/ x4 _6 K; E
  14. 12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
    % A9 p# P8 t' r( P  D
  15. 12:17:21 AM      0.00      0.00      0.00      0.00      0.00
    . M% S& V1 `% [' E9 P
  16. ^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
  1. 7 _  @0 `  A9 E+ V7 g2 j
  2. $ top
    " \+ B6 |( N  _! z; ~1 ?/ _
  3. top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92
    & \2 }# t1 p2 ?* m' K8 {1 h
  4. Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie
    ) |) a% X( G: a( _, D+ R- y  x
  5. %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
  6. KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers ) l# N/ x4 L. q! P5 G& ]
  7. KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem8 f( @/ n  o  q) d

  8. & M% f2 u$ J* w: D+ x# W
  9. PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    8 r0 h5 P  @+ x1 |( Q  L( W6 I
  10. 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
  11. 4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave
    / B- u4 G! v0 v3 {
  12. 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top
    " z+ [7 G, k4 d, l
  13. 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
  14. 4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java
    6 p, d! K9 M5 t
  15. 1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init
    $ k. Q6 \6 U+ ]; O2 e  t* w
  16. 2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
    ; g$ W) e" L0 z1 V- p
  17. 3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 ksoftirqd/0
    7 H! M( F- K$ i
  18. 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
  19. 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
  20. 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
赞 收藏 评论0 发布时间:2020-11-20 18:54

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版