问题讨论
在进行云计算项目的开发时,开发人员与Linux服务器进行交互是必要的。除了掌握常用的Linux命令外,还需对Linux服务器的性能分析命令。假如在开发时,出现连接Linux服务器的SSH,即22端口经常性的断开连接问题,还有进程拥堵问题等。这些涉及Linux系统的问题,在代码层面是无法检测的。上诉的问题可能是在连接ssh客户端时,未及时的close(),导致进程拥堵。为了证实和解决这些系统层面的问题,掌握关于Linux性能分析和工具解决的命令是很必要的。Linux Performance Analysis and Tools【Linux性能分析和工具】就是关于这个体系的。
如果你能看明白这个图,就说明你已经学会了:
Analysis and tools 命令大全
Linux性能分析工具有很多,常用的工具有下述几个:
- vmstat:用于监控系统整体的虚拟内存统计信息,包括CPU、内存、磁盘、进程等。
- iostat:用于监控磁盘I/O性能,包括磁盘吞吐量、响应时间、I/O队列长度等。
- dstat: 是第三方的工具,功能是vmstat与iostat的结合,展示效果好一些。
- top:用于实时监视系统的进程和资源使用情况,包括CPU、内存等。
- sar:一个系统活动报告工具。用于收集和报告系统各项资源的历史数据。可以观测一个系统在长时间的运行情况。
- strace:用于跟踪和调试进程的系统调用和信号,可以帮助定位进程的问题。
- tcpdump:常用的网络抓包工具,可以在计算机上捕获和分析网络数据包。
1.vmstat 3 5
解释:当在Linux系统终端时运行该命令,将提供关于系统虚拟机内存统计的输出。3表示每隔三秒收集一次数据;5表示总共收集5次数据。每一行记录表示每隔三秒的内存统计信息的变化。
[root@server83 ~]# vmstat 3 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 33536 487316 2096 13504744 0 0 4 13 1 2 1 1 98 0 0
0 0 33536 487236 2096 13504796 0 0 0 10 1590 2180 1 1 98 0 0
0 0 33536 485852 2096 13504872 0 0 0 141 1746 2435 1 1 98 0 0
0 0 33536 485912 2096 13504872 0 0 0 12 715 1077 0 0 99 0 0
0 0 33536 486408 2096 13504944 0 0 0 180 810 1166 1 0 99 0 0
- procs:表示系统中进程数量,包括r和b。
r表示系统中的活动进程数量.
b表示正在等待CPU调度的进程数量.
- memory:显示系统内存的使用情况。包括swpd、free、buff、cache。
swpd:表示已经被换出到交换空间的内存大小。
free:表示未被使用的内存大小。
buff:表示用作缓冲区的内存大小。
cache:表示用作缓冲的内存大小。
- swap:提供了关于系统交换分区使用情况的统计信息,包括si、so。
si:表示从磁盘读取数据到交换分区的速率。
so:表示从交换分区写入到磁盘的速率。
- io:展示块设备I/O操作的统计信息
bi:表示每秒从块设备读取的块数。
bo:表示每秒向块设备写入的块数。
- system:
in:表示每秒中断的数量。
cs:表示每秒上下文切换的数量。
- cpu:显示了CPU使用率和负载情况
us:表示用户态的CPU时间占比。
sy:表示系统态的CPU时间占比。
id:表示空闲的CPU时间占比。
wa:表示等待IO完成的CPU时间占比。
st:表示由于运行在虚拟机上的其他操作,而被偷取的CPU时间占比。
对vmstat的各个参数进行讲解:
[root@localhost hang]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
2 0 0 601356 473556 563156 0 0 914 47 147 548 3 3 91 3 0
[root@localhost hang]# vmstat 3 5 -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
2 0 0 601416 473556 563156 0 0 899 46 145 541 3 3 91 3 0
0 0 0 601416 473556 563172 0 0 0 0 34 65 0 0 100 0 0
1 0 0 601292 473556 563140 0 0 0 0 42 82 0 0 99 0 0
0 0 0 601292 473556 563168 0 0 0 0 29 57 0 0 100 0 0
0 0 0 601292 473556 563168 0 0 0 0 34 61 0 0 100 0 0
解释:a参数表示显示所有的活动和非活动内存区域的详细信息,默认为a
[root@localhost hang]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sr0 0 0 0 0 0 0 0 0 0 0
sda 12384 2 1204695 121093 3418 444 61538 1433 0 44
解释:-d表示显示磁盘活动的统计信息。
分析:disk表示磁盘设备的名称;reads表示读取,writes表示写入,IO表示IO流。至于ms、total、merged、sectors等字段,是很底层的数据信息,如果有兴趣,可以查阅官网资料。
[root@localhost hang]# vmstat -w -t
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st PDT
2 0 0 595340 2084 676860 0 0 445 23 89 300 2 2 95 1 0 2023-06-29 19:53:56
解释:-w表示以宽输出,就是输出信息宽一些。-t表示加上时间戳信息,每一行信息都有时间记录。
2.iostat 3 5
解释:参数3和5同上。iostat是一个用于监视系统输入、输出的实时程序。提供了关于磁盘、CPU和网络等方面的性能统计信息。
[root@localhost hang]# iostat 3 2
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 06/29/2023 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.15 0.03 1.15 1.01 0.00 96.66
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 8.34 314.82 16.67 602563 31912
avg-cpu: %user %nice %system %iowait %steal %idle
0.33 0.00 0.00 0.00 0.00 99.67
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
- 操作系统版本:Linux 3.10.0-957.el7.x86_64
- 主机名:localhost.localdomain
- 当前日期:06/29/2023
- 系统架构:x86_64
- CPU核心数:1
平均CPU利用率:
- %user:用户态CPU使用率为1.15%
- %nice:优先级较高的任务使用的CPU使用率为0.03%
- %system:内核态CPU使用率为1.15%
- %iowait:等待I/O完成的CPU使用率为1.01%
- %steal:被虚拟化环境偷取的CPU使用率为0.00%
- %idle:空闲CPU的使用率为96.66%
磁盘设备统计:
- 设备:sda
- tps:每秒传输的操作数为8.34个
- kB_read/s:每秒读取的数据量为314.82 KB
- kB_wrtn/s:每秒写入的数据量为16.67 KB
- kB_read:总共读取的数据量为602,563 KB
- kB_wrtn:总共写入的数据量为31,912 KB
3. dstat -cdlmnpsy
上诉的统计信息看着不舒服,可以借助dstat工具。先使用yum去安装dstat工具。
sudo yum install dstat
[root@localhost hang]# yum install dstat
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.sjtu.edu.cn
* extras: ftp.sjtu.edu.cn
* updates: ftp.sjtu.edu.cn
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
updates/7/x86_64/primary_db | 22 MB 00:00:16
Resolving Dependencies
--> Running transaction check
---> Package dstat.noarch 0:0.7.2-12.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================
Installing:
dstat noarch 0.7.2-12.el7 base 163 k
Transaction Summary
=================================================================================================================================================
Install 1 Package
Total download size: 163 k
Installed size: 752 k
Is this ok [y/d/N]: y
Downloading packages:
dstat-0.7.2-12.el7.noarch.rpm | 163 kB 00:00:06
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : dstat-0.7.2-12.el7.noarch 1/1
Verifying : dstat-0.7.2-12.el7.noarch 1/1
Installed:
dstat.noarch 0:0.7.2-12.el7
Complete!
安装好dstat后,即可使用命令
[root@localhost hang]# dstat -cdlmnpsy
'----total-cpu-usage---- -dsk/total- ---load-avg--- ------memory-usage----- -net/total- ---procs--- ----swap--- ---system--
usr sys idl wai hiq siq| read writ| 1m 5m 15m | used buff cach free| recv send|run blk new| used free| int csw
1 1 97 1 0 0| 268k 67k|0.10 0.07 0.06| 778M 2084k 805M 234M| 0 0 |0.0 0 3.3| 0 2049M| 73 195
0 0 100 0 0 0| 0 0 |0.09 0.07 0.06| 778M 2084k 805M 234M| 60B 1346B| 0 0 0| 0 2049M| 40 88
0 0 100 0 0 0| 0 0 |0.09 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 45 86
0 1 99 0 0 0| 0 0 |0.09 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 49 98
0 0 100 0 0 0| 0 0 |0.09 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 61 106
0 0 100 0 0 0| 0 0 |0.09 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 68 124
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 53 93
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 51 97
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 53 98
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 120B 574B| 0 0 0| 0 2049M| 53 98
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 50 100
1 0 99 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 660B 514B| 0 0 0| 0 2049M| 56 109
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 34 74
0 1 99 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 40 84
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 37 75
0 0 100 0 0 0| 0 0 |0.08 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 45 92
0 0 100 0 0 0| 0 0 |0.07 0.07 0.06| 778M 2084k 805M 234M| 60B 514B| 0 0 0| 0 2049M| 31 72
彩色标记,实时的抓取统计信息。代表的字段跟上述iostat与vmstat是一致的。
4.top
解释:top用于查看系统的实时性能数据,包括CPU使用率、内存使用情况、进程状态等。主要是进程使用情况。终端输入top后,会进入到进程信息实时监控,使用ctrl + c即可退出。
[root@localhost hang]# top
top - 22:16:41 up 2:45, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 195 total, 1 running, 194 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863224 total, 243380 free, 648468 used, 971376 buff/cache
KiB Swap: 2098172 total, 2098172 free, 0 used. 960748 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8434 hang 20 0 566640 25952 19120 S 0.3 1.4 0:08.02 vmtoolsd
10547 root 20 0 0 0 0 S 0.3 0.0 0:00.41 kworker/0:0
1 root 20 0 128176 6892 4188 S 0.0 0.4 0:02.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.31 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.57 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 watchdogd
top - 22:16:41 up 2:45, 2 users, load average: 0.00, 0.01, 0.05
反馈了时间信息:本虚拟机在启动时计时已经运行了2:45。系统有2个用户;任务负载的平均值是0.00,0.01,0.05
Tasks: 195 total, 1 running, 194 sleeping, 0 stopped, 0 zombie
反馈了总共有195个进程,其中在运行的进程只有1个,其余194个进程在休眠,0个停止的进程,0个僵尸进程
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
反馈了CPU的使用率和空闲率。us表示用户空间占用CPU的百分比,这里用户占用了0.3%。sy表示系统内核空间占用CPU的百分比,这里系统占用了0.3%。id表示CPU的空闲率,这里CPU空闲率为99.3%。至于wa、hi、si、st不常见,就不去了解了。若有兴趣可以查阅资料。
KiB Mem : 1863224 total, 243380 free, 648468 used, 971376 buff/cache
反馈了内存使用情况:KiB是内存单位;total表示总共有1863224KiB内存大小;free表示空闲的内存大小为243380KiB;被使用的648468KiB。用于缓存的971376KiB。可以看出此时我的虚拟机的内存大约于在1.8G左右。
KiB Swap: 2098172 total, 2098172 free, 0 used. 960748 avail Mem
反馈了交换空间的使用情况:总共有2098172 KiB的交换空间,未被使用。剩余的960748 KiB可用内存。
在我们使用top命令去查询系统信息时,主要的关注点还是进程。接下来详细的讲解一下进程字段的含义:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:表示进程ID,是进程的唯一标识符。
USER:表示启动该进程的是哪个用户。
PR:表示进程的优先级。其取值范围在【-20,19】,值越低表示优先级越高,CPU就会优先的处理优先级高的进程。
NI:进程的nice值,决定了进程的调度优先级。一般来说,NI与PR是相差20个值的。比如,pR为20,那么IN就为0;PR为0,IN就为-20.
VIRT:进程使用的虚拟内存大小
RES:进程使用的物理内存大小
SHR:进程使用的共享内存大小
%CPU:表示该进程使用CPU资源百分比
%MEM:表示该进程使用内存资源百分比
TIME+:表示进程累计的CPU时间
COMMAND:表示启动该进程的命令是什么
5. sar
解释:sar用于收集和报告系统的各项资源的历史数据。它能够提供关于CPU利用率、内存利用率、磁盘IO、网络流量、进程状态等方面的信息。
[root@localhost hang]# sar
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 06/29/2023 _x86_64_ (1 CPU)
07:31:37 PM LINUX RESTART
07:40:01 PM CPU %user %nice %system %iowait %steal %idle
07:50:01 PM all 0.14 0.00 0.13 0.00 0.00 99.73
08:00:01 PM all 0.08 0.00 0.11 0.02 0.00 99.79
08:10:01 PM all 0.11 0.02 0.33 0.11 0.00 99.43
08:20:01 PM all 0.75 0.00 0.45 1.50 0.00 97.31
08:30:01 PM all 0.10 0.00 0.11 0.00 0.00 99.79
08:40:01 PM all 0.09 0.00 0.09 0.00 0.00 99.82
08:50:01 PM all 0.09 0.00 0.10 0.00 0.00 99.81
09:00:01 PM all 0.09 0.00 0.09 0.00 0.00 99.82
09:10:01 PM all 0.12 0.00 0.09 0.00 0.00 99.79
09:20:02 PM all 0.09 0.00 0.09 0.00 0.00 99.82
09:30:01 PM all 0.09 0.00 0.09 0.00 0.00 99.82
09:40:01 PM all 0.10 0.00 0.08 0.00 0.00 99.82
09:50:01 PM all 0.08 0.00 0.08 0.00 0.00 99.84
10:00:01 PM all 0.08 0.00 0.08 0.00 0.00 99.83
10:10:01 PM all 0.13 0.00 0.14 0.02 0.00 99.70
10:20:01 PM all 0.14 0.00 0.14 0.00 0.00 99.71
10:30:01 PM all 0.09 0.00 0.09 0.00 0.00 99.82
10:40:02 PM all 0.09 0.00 0.09 0.00 0.00 99.82
10:50:01 PM all 0.09 0.00 0.09 0.00 0.00 99.82
Average: all 0.13 0.00 0.13 0.09 0.00 99.65
%user:表示用户空间程序使用CPU的百分比。这包括用户运行的应用程序和进程。%nice:表示以较高优先级运行的用户空间程序(通常是调整过优先级的)使用CPU的百分比。%system:表示内核空间程序使用CPU的百分比。这包括操作系统内核和内核进程。%iowait:表示CPU等待IO操作完成的时间所占的百分比。当系统中有大量阻塞IO操作时,此值会增加。%steal:表示被虚拟化环境(如虚拟机)窃取的CPU时间的百分比。这个指标在虚拟化环境中使用,并且只适用于特定情况。%idle:表示CPU空闲的时间所占的百分比。
sar与一些参数的联合使用:
[root@localhost hang]# sar 1
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 06/29/2023 _x86_64_ (1 CPU)
11:09:11 PM CPU %user %nice %system %iowait %steal %idle
11:09:12 PM all 0.00 0.00 0.00 0.00 0.00 100.00
11:09:13 PM all 0.00 0.00 0.00 0.00 0.00 100.00
11:09:14 PM all 0.00 0.00 0.00 0.00 0.00 100.00
11:09:15 PM all 0.00 0.00 0.00 0.00 0.00 100.00
11:09:16 PM all 0.00 0.00 0.00 0.00 0.00 100.00
11:09:17 PM all 0.00 0.00 0.98 0.00 0.00 99.02
参数: 1表示每隔一秒就会打印sar的信息。
6.strace -p {pid}
解释:strace一般与指定的进程一起使用。可以去实时的跟踪该进程执行过程中的系统调用和信号。
[root@localhost hang]# strace -p 8279
strace: Process 8279 attached
restart_syscall(<... resuming interrupted poll ...>) = 0
futex(0x1f630d0, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x1f630c0, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout)
futex(0x1f630d0, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x1f630c0, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=3, events=POLLIN}], 1, 4997) = 0 (Timeout)
futex(0x1f630d0, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x1f630c0, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=3, events=POLLIN}], 1, 4992) = 0 (Timeout)
futex(0x1f630d0, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x1f630c0, FUTEX_WAKE_PRIVATE, 1) = 1
restart_syscall(<... resuming interrupted poll ...>):恢复被中断的poll系统调用。futex(0x1f630d0, FUTEX_WAKE_PRIVATE, 1):唤醒一个等待中的线程或进程。poll([{fd=3, events=POLLIN}], 1, 4999) = 0 (Timeout):进行一次poll操作,检查文件描述符3上是否有可读事件,并设置超时时间为4999毫秒。此次调用返回值为0,表示超时结束。
7.tcpdump -i any
解释:tcpdump是一种常用的网络抓包工具,可以在计算机上捕获和分析网络数据包。它提供了强大的功能,用于检查和故障排除网络连接、监视网络流量以及进行安全分析。一般是网络安全技术方面的命令,可以了解一下。
[root@localhost hang]# tcpdump -i any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:21:15.314391 IP localhost.localdomain.ssh > 192.168.182.1.50719: Flags [P.], seq 1171837498:1171837694, ack 1967326365, win 274, length 196
23:21:15.314484 IP 192.168.182.1.50719 > localhost.localdomain.ssh: Flags [.], ack 196, win 4095, length 0
tcpdump -i any 中,any表示当前系统上的所有网络接口;可以把any换成eth0.
还记得文章开始处的那张图片吗?现在回头去看那个图片,应该是能看明白一些了。如果你能理解那张图片上的所有命令,那你就是大佬了哟。
讲解图
在图中的方框内,有Applications、System Libraies、System Call interface、VFS、Sockets、Scheduler、File Systems、TCP/UDP、Volume Manager、IP、Block Device、Net Device、Virtual Memory、Device Drivers模块。
总结
还是点个赞吧,我也整理了许久的。
希望你们能带走这篇文章的知识点,而不是字节流~~~