This commit is contained in:
wizardforcel 2017-08-26 17:45:23 +08:00
parent 7d6262f000
commit 20e012aa74
1 changed files with 363 additions and 0 deletions

363
ex28.md Normal file
View File

@ -0,0 +1,363 @@
# 练习 28性能获取性能情况`uptime``free``top`
> 原文:[Exercise 28. Performance: getting performance stats, uptime, free, top](https://archive.fo/U2SqV)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
这个练习很简单。首先,我们需要什么样的性能数据?
+ CPU 使用情况:
+ 它的负载如何?
+ 哪些进程正在使用它?
+ 内存使用情况:
+ 使用了多少内存?
+ 多少内存是空闲的?
+ 多少内存用于缓存?
+ 哪些进程消耗了它?
+ 磁盘使用情况:
+ 执行多少输入/输出操作?
+ 由哪个进程?
+ 网络使用情况:
+ 传输了多少数据?
+ 由哪个进程?
+ 进程情况:
+ 有多少进程?
+ 他们在做什么 工作,还是等待什么?
+ 如果在等待什么它是什么呢CPU磁盘网络
为了获取这些情况,我们可以使用以下工具:
+ `uptime` - 系统运行了多长时间。
+ `free` - 显示系统中可用和使用的内存量。
+ `vmstat` - 进程,内存,分页,块 IO陷阱磁盘和 cpu 活动的信息。
+ `top` - 实时显示 Linux 任务。
我们来看看这个程序及其输出。
`uptime`的输出:
```
user1@vm1:~$ uptime
#(1) (2) (3) (4) (5) (6)
03:13:58 up 4 days, 22:45, 1 user, load average: 0.00, 0.00, 0.00
```
字段和描述:
| 字段 | 描述 |
| --- | --- |
| 1 | 当前时间。 |
| 2 | 正常运行时间(启动后的时间)。 |
| 3 | 目前有多少用户登录。 |
| 4 | 过去 1 分钟的 CPU 负载。这不是规范化的,所以负载均值为 1 意味着单个 CPU 的满负载,但是在 4 个 CPU 的系统上,这意味着它有 75% 空闲时间。 |
| 5 | 过去 5 分钟的 CPU 负载。 |
| 6 | 过去 15 分钟的 CPU 负载。 |
`free`的输出:
```
user1@vm1:~$ free -mt
# (1) (2) (3) (4) (5) (6)
total used free shared buffers cached
Mem: 496 267 229 0 27 196
# (7) (8)
-/+ buffers/cache: 43 453
# 9
Swap: 461 0 461
# 10
Total: 958 267 691
```
字段和描述:
| 字段 | 描述 |
| --- | --- |
| 1 | 物理内存总量。 |
| 2 | 使用的物理内存总量。 |
| 3 | 空闲的物理内存总量。 |
| 4 | 共享内存列应该被忽略;它已经过时了。 |
| 5 | 专用于缓存磁盘块的 RAM 和文件系统元数据总量。 |
| 6 | 专用于从文件读取的页面的 RAM 总量。 |
| 7 | 物理内存总量不包括缓冲区和缓存2-5-6 |
| 8 | 空闲的物理内存总量包括空闲的缓冲区和缓存1-7 |
| 9 | 交换文件使用信息。 |
| 10 | 总内存使用信息,包括交换内存 |
`vmstat`输出:
```
user1@vm1:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
#(1,2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12,13,14,15,16)
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 229 27 196 0 0 0 0 11 6 0 0 100 0
user1@vm1:~$ vmstat -S M -a
# (17) (18)
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free inact active si so bi bo in cs us sy id wa
0 0 0 11 434 19 0 0 24 2 11 6 0 0 100 0
user1@vm1:~$ vmstat -d
#19 (20) (21) (22) (23) (24) (25) (26) (27) (28) (29)
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 11706 353 402980 17612 9303 40546 336358 46980 0 19
sr0 0 0 0 0 0 0 0 0 0 0
loop0 0 0 0 0 0 0 0 0 0 0
user1@vm1:~$ vmstat -m | head
#(30) (31) (32) (33) (34)
Cache Num Total Size Pages
ext3_inode_cache 13700 13700 808 10
ext3_xattr 0 0 88 46
journal_handle 170 170 24 170
journal_head 37 72 112 36
revoke_table 256 256 16 256
revoke_record 128 128 32 128
kmalloc_dma-512 8 8 512 8
ip6_dst_cache 16 24 320 12
UDPLITEv6 0 0 1024 8
```
字段和描述:
| 模式 | 情况 | 字段 | 描述 |
| --- | --- | --- | --- |
| 虚拟内存 | 进程 | 1 | r等待运行的进程数。 |
| | | 2 | b不间断睡眠中的进程数。 |
| | 内存 | 3 | swpd使用的虚拟内存量。 |
| | | 4 | free空闲内存量。 |
| | | 5 | buff用作缓冲区的内存量。 |
| | | 6 | cache用作缓存的内存量。 |
| | | 17 | inact非活动内存量。 |
| | | 18 | active活动内存量。 |
| | 交换 | 7 | si从磁盘换入的内存量/秒)。 |
| | | 8 | so换出到磁盘的内存量/秒)。 |
| | I/O | 9 | bi从设备接收的块块/秒)。 |
| | | 10 | bo发送到设备的块块/秒)。 |
| | 系统 | 11 | in每秒中断的次数包括时钟。 |
| | | 12 | cs每秒上下文切换的数量。 |
| | CPU | 13 | us运行非内核代码的时间。用户时间包括优先的时间 |
| | | 14 | sy运行内核代码的时间。系统时间 |
| | | 15 | id闲置时间。在 Linux 2.5.41 之前,这包括 IO 等待时间。 |
| | | 16 | waIO 等待时间。在 Linux 2.5.41 之前,包含在闲置时间中。 |
| 磁盘,`-d` | 设备 | 19 | 设备名称 |
| | 读 | 20 | total成功完成的总读取数 |
| | | 21 | merge分组的读取数生成一个 I/O |
| | | 22 | sectors成功读取的分区 |
| | | 23 | ms用于读取的毫秒 |
| | 写 | 24 | total成功完成的总写入数 |
| | | 25 | merge分组的写入数生成一个 I/O |
| | | 26 | sectors成功写入的分区 |
| | | 27 | ms用于写入的毫秒 |
| | I/O | 28 | cur正在进行中的 I/O |
| | | 29 | s用于 I/O 的秒数 |
| Slab`-m` | Slab | 30 | 缓存:缓存名称 |
| | | 31 | num当前活动对象的数量 |
| | | 32 | total可用对象的总数 |
| | | 33 | size每个对象的大小 |
| | | 34 | page具有至少一个活动对象的页数 |
`top`的输出:
```
# (1) (2) (3) (4)
top - 03:22:44 up 4 days, 22:54, 1 user, load average: 0.00, 0.00, 0.00
# (5) (6) (7) (8) (9)
Tasks: 63 total, 1 running, 62 sleeping, 0 stopped, 0 zombie
# (10) (11) (12) (13) (14) (15) (16) (17)
Cpu(s): 0.0%us, 1.1%sy, 0.0%ni, 98.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
# (18) (19) (20) (21)
Mem: 508820k total, 273792k used, 235028k free, 27844k buffers
# (22) (23) (24) (25)
Swap: 473080k total, 0k used, 473080k free, 201252k cached
#(26) (27) (28)(29) (30) (31) (32,33) (34)(35) (36) (37)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 8356 804 676 S 0.0 0.2 0:05.99 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.06 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
6 root 20 0 0 0 0 S 0.0 0.0 0:03.25 events/0
7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuset
<...>
```
字段和输出:
| 部分 | 字段 | 描述 |
| --- | --- | --- |
| 正常运行时间 | 1 | 当前时间。 |
| | 2 | 正常运行时间(启动后的时间)。 |
| | 3 | 目前有多少用户登录。 |
| | 4 | 过去 15 和 15 分钟内的 CPU 负载。这不是规范化的,所以负载均值为 1 意味着单个 CPU 的满负载,但是在 4 个 CPU 的系统上,这意味着它有 75% 空闲时间。 |
| 任务 | 5 | 运行进程总数。 |
| | 6 | 当前正在执行的进程数。 |
| | 7 | 当前正在睡眠的进程数。 |
| | 8 | 被停止的进程数(例如使用`CTRL + Z`)。 |
| | 9 | 已经停止(“僵尸”)的进程数量,已终止,但未由其父进程回收。 |
| CPUS | 10 | CPU 运行不优先的用户进程的时间。 |
| | 11 | CPU 运行内核及其进程的时间。 |
| | 12 | CPU 运行优先的用户进程的时间。 |
| | 13 | CPU 花费的空闲时间。 |
| | 14 | CPU 等待 I/O 完成的时间。 |
| | 15 | CPU 维护硬件中断的时间。 |
| | 16 | CPU 维护软件中断的时间。 |
| | 17 | 由管理程序从这个虚拟机“偷走”的 CPU 总量,用于其他任务(例如启动另一个虚拟机)。 |
| 内存/交换 | 18 | 物理内存总量。 |
| | 19 | 使用的物理内存总量。 |
| | 20 | 完全空闲的物理内存。 |
| | 21 | 专用于缓存磁盘块的 RAM 和文件系统元数据总量。 |
| | 22,23,24 | 总,使用和空闲交换内存。 |
| | 25 | 专用于从文件读取的页面的 RAM 总量。 |
| 进程 | 26 | 任务的唯一进程 ID它定期地包装尽管从未重新启动。 |
| | 27 | 任务所有者的有效用户名。 |
| | 28 | 任务的优先级。 |
| | 29 | 任务的优先值。负的优先值表示更高的优先级,而正的优先值表示较低的优先级。在这个字段中的零只是代表在确定任务的调度时不会调整优先级。 |
| | 30 | 任务使用的虚拟内存总量。它包括所有代码,数据和共享库,以及已经被替换的页面。以及已被映射但未被使用的页面。 |
| | 31 | 任务已使用的未交换的物理内存。 |
| | 32 | 任务使用的共享内存量。它只是反映可能与其他进程共享的内存。 |
| | 33 | 任务的状态可以是以下之一:`D`=不间断睡眠,`R`=运行,`S`=睡眠,`T`=跟踪或停止,`Z`=僵尸。 |
| | 34 | 自上次屏幕更新以来,所经过的 CPU 时间的任务份额,以 CPU 时间总数的百分比表示。 |
| | 35 | 任务当前使用的可用物理内存的份额。 |
| | 36 | CPU 时间,单位是百分之一秒,与`TIME`相同,但通过百分之一秒反映更大的粒度。 |
| | 37 | 命令 - 命令行或程序名称 |
你可能会看到很多字段。许多字段都存在于多个工具中,这些工具有些冗余的功能。通常情况下,你只需要这个字段的一小部分,但你需要知道,系统性能的许多信息(实际上还有更多)可用于你,因为有时候会出现一个模糊的问题,并且为了能够解决它,需要知道如何读取这些数据。
现在,你将学习如何使用系统性能工具。
## 这样做
```
1: uptime
2: free
3: vmstat
4: ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )& vmstat 1
5: uptime
6: ( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat )& vmstat -nd 1 | egrep -v 'loop|sr0'
7: echo 3 | sudo tee /proc/sys/vm/drop_caches
8: free -mt ; find / >/dev/null 2>&1 ; free -mt
9: echo 3 | sudo tee /proc/sys/vm/drop_caches
10: cat test.img /dev/null ; free -mt
```
## 你会看到什么
```
user1@vm1:~$ uptime
05:36:45 up 6 days, 1:08, 1 user, load average: 0.00, 0.00, 0.00
user1@vm1:~$ free
total used free shared buffers cached
Mem: 508820 239992 268828 0 820 213720
-/+ buffers/cache: 25452 483368
Swap: 473080 0 473080
user1@vm1:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 268828 820 213720 0 0 21 10 14 11 0 0 100 0
user1@vm1:~$ ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )& vmstat 1
[1] 6078
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 1 0 268556 828 213736 0 0 21 10 14 11 0 0 100 0
0 0 0 268556 828 213772 0 0 16 0 19 10 0 0 100 0
0 0 0 268556 828 213772 0 0 0 0 13 8 0 0 100 0
0 0 0 268556 828 213772 0 0 0 0 15 11 0 0 100 0
0 0 0 268556 828 213772 0 0 0 0 14 10 0 0 100 0
0 0 0 268556 828 213772 0 0 0 0 18 13 0 0 100 0
1 0 0 267316 836 213844 0 0 74 0 267 26 0 99 1 0
1 0 0 267316 836 213844 0 0 0 0 303 7 0 100 0 0
1 0 0 267316 836 213844 0 0 0 0 271 11 0 100 0 0
1 0 0 267316 836 213844 0 0 0 0 257 12 0 100 0 0
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 4.95038 s, 6.4 MB/s
0 0 0 267928 860 213860 0 0 27 0 265 29 1 97 2 0
0 0 0 267936 860 213848 0 0 0 0 15 9 0 0 100 0
0 0 0 267936 860 213848 0 0 0 0 14 7 0 0 100 0
0 0 0 267936 860 213848 0 0 0 0 14 7 0 0 100 0
0 0 0 267936 860 213848 0 0 0 0 13 11 0 0 100 0
Terminated
user1@vm1:~$ uptime
05:22:15 up 6 days, 54 min, 1 user, load average: 0.07, 0.02, 0.00
[1]+ Done ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )
user1@vm1:~$ uptime
05:22:22 up 6 days, 54 min, 1 user, load average: 0.06, 0.02, 0.00
user1@vm1:~$ ( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat )& vmstat -nd 1 | egrep -v 'loop|sr0'
[1] 6086
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 146985 2230744 21821320 105848 32190 1343154 10927338 1330144 0 105
sda 146995 2230744 21821648 105848 32190 1343154 10927338 1330144 0 105
sda 146995 2230744 21821648 105848 32190 1343154 10927338 1330144 0 105
sda 146995 2230744 21821648 105848 32190 1343154 10927338 1330144 0 105
sda 146995 2230744 21821648 105848 32190 1343154 10927338 1330144 0 105
sda 146995 2230744 21821648 105848 32190 1343154 10927338 1330144 0 105
sda 146999 2230744 21821680 105856 32190 1343154 10927338 1330144 0 105
sda 146999 2230744 21821680 105856 32190 1343154 10927338 1330144 0 105
sda 147000 2230744 21821688 105856 32208 1344160 10935530 1330288 0 105
sda 147000 2230744 21821688 105856 32274 1349214 10976490 1330748 0 105
sda 147000 2230744 21821688 105856 32325 1353259 11009258 1331236 0 105
sda 147000 2230744 21821688 105856 32450 1364657 11101442 1337176 0 105
sda 147000 2230744 21821688 105856 32450 1364657 11101442 1337176 0 105
sda 147001 2230744 21821696 105856 32471 1366301 11114762 1337348 0 105
sda 147001 2230744 21821696 105856 32525 1370529 11149018 1337732 0 105
sda 147001 2230744 21821696 105856 32573 1374577 11181786 1338064 0 105
sda 147001 2230744 21821696 105856 32698 1386562 11278666 1346244 0 105
6553600+0 records in
6553600+0 records out
209715200 bytes (210 MB) copied, 11.7088 s, 17.9 MB/s
sda 147001 2230744 21821696 105856 32698 1386562 11278666 1346244 0 105
sda 147001 2230744 21821696 105856 32698 1386562 11278666 1346244 0 105
sda 147001 2230744 21821696 105856 32698 1386562 11278666 1346244 0 105
sda 147001 2230744 21821696 105856 32698 1386562 11278666 1346244 0 105
sda 147001 2230744 21821696 105856 32762 1393910 11337962 1349192 0 105
user1@vm1:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[1]+ Done ( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat )
user1@vm1:~$ free -mt ; find / >/dev/null 2>&1 ; free -mt
total used free shared buffers cached
Mem: 496 30 466 0 0 5
-/+ buffers/cache: 24 472
Swap: 461 0 461
Total: 958 30 928
total used free shared buffers cached
Mem: 496 64 432 0 22 6
-/+ buffers/cache: 35 461
Swap: 461 0 461
Total: 958 64 894
user1@vm1:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
user1@vm1:~$ cat test.img /dev/null ; free -mt
total used free shared buffers cached
Mem: 496 230 265 0 0 205
-/+ buffers/cache: 24 471
Swap: 461 0 461
Total: 958 230 727
user1@vm1:~$
```
## 解释
1. 打印当前的正常运行时间。
1. 打印出可用内存信息。
1. 这个很有趣,最好认为是一种实验。首先,我们在后台启动` ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )&`,之后我们 以连续模式启动`vmstat`,所以它将打印出其信息直到中断。我们可以看到,在这个命令启动 5 秒钟后CPU 负载显着增加了一段时间,然后减少,另外 5 秒钟后`vmstat`被杀死。
1. 打印当前的正常运行时间。注意负载平均值的变化。
1. 这是另一个实验,几乎和以前一样,但这次用磁盘写入。
1. 删除所有缓存和缓冲区。
1. 另一个实验。我们想看看读取系统中的所有文件和目录名称,会如何影响内存中的文件系统缓存,并且我们可以看到它被缓存在缓冲区中,这是有理论根据的。
1. 再次删除所有缓存和缓冲区。
1. 这次我们想看看,文件读取如何影响内存中的文件系统缓存。我们可以看到读取的文件被缓存在缓存部分,来增加后续访问的时间。
## 附加题
+ 为什么在我们的第一个实验中,不是`user`,而是`system` CPU 使用率上升到 100
+ 这是什么意思?`dd if=/dev/zero of=test.img bs=32 count=$( (32*1024*200) )`。
+ 启动`top`,并按下`h`。现在尝试按照 CPU内存和 PID 对其输出进行排序。