《图解性能优化》笔记
主要记录sar、vmstat、ps、netstat、iostat、top、wireshark、tcpdumpp、pstack、strace、Profiler命令使用。
1.sar命令
1.安装sysstat
apt-get install sysstat
2.安装后使用报错
Cannot open /var/log/sysstat/sa02: No such file or directory
Please check if data collecting is enabled in /etc/default/sysstat
3.修改配置文件:vi /etc/default/sysstat
将false改为true
----
# Should sadc collect system activity informations? Valid values
# are "true" and "false". Please do not put other values, they
# will be overwritten by debconf!
ENABLED="true"
----
4.重启sysstat服务即可
service sysstat restart
5.Vim修改readonly文件
需要结合sudo和tee两个命令:W !sudo tee %
Linux终端下修改文件常用命令:https://blog.csdn.net/DaveBobo/article/details/52431014
Vim修改readonly文件:https://blog.csdn.net/xiakexiaohu/article/details/53574553
sar主要可以知道CPU的使用率和空闲情况、读写I/O的量、内存的概况等信息。
yangyang@ubuntu:~$ sar
Linux 3.13.0-151-generic (ubuntu) 07/01/2018 _i686_ (1 CPU)
06:51:15 PM LINUX RESTART
2.vmstat
yangyang@ubuntu:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 1148772 46804 450024 0 0 165 40 75 298 4 2 95 0 0
vmstat主要是等待执行的平均进程数、由于某些原因而被迫等待(被阻塞)的平均进程数。还可以知道CPU使用率、对Swap空间的I/O、通常的I/O、上下文切换次数等。
r列:等待执行的平均进程数
b列:被阻塞的进程数
wa列:被作为I/O等待的指标
3.ps
3 0 0 1148772 46804 450024 0 0 165 40 75 298 4 2 95 0 0
yangyang@ubuntu:~$ ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 1180 - 18:14 ? 00:00:01 /sbin
1 S root 2 0 0 80 0 - 0 - 18:14 ? 00:00:00 [kthr
1 S root 3 2 0 80 0 - 0 - 18:14 ? 00:00:00 [ksof
1 S root 4 2 0 80 0 - 0 - 18:14 ? 00:00:00 [kwor
1 S root 5 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [kwor
1 R root 7 2 0 80 0 - 0 - 18:14 ? 00:00:01 [rcu_
1 S root 8 2 0 80 0 - 0 - 18:14 ? 00:00:00 [rcu_
1 S root 9 2 0 -40 - - 0 - 18:14 ? 00:00:00 [migr
5 S root 10 2 0 -40 - - 0 - 18:14 ? 00:00:00 [watc
1 S root 11 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [khel
5 S root 12 2 0 80 0 - 0 - 18:14 ? 00:00:00 [kdev
1 S root 13 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [netn
1 S root 14 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [writ
1 S root 15 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [kint
1 S root 16 2 0 60 -20 - 0 - 18:14 ? 00:00:00 [bios
ps命令主要是可以获取某个瞬间存在哪些进程、某个瞬间进程的状态(执行中、休眠中等)、进程的名称或者命令、进程的编号、各个进程的CPU累计时间。
4.netstat
yangyang@ubuntu:~$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.183.2 0.0.0.0 UG 0 0 0 eth0
192.168.183.0 * 255.255.255.0 U 0 0 0 eth0
ps命令使用-a参数,能知道那个瞬间的套接字(快照形式);使用-r参数,能知道那个瞬间的路由信息(快照形式);使用-i参数,能知道各个接口的统计信息(概要形式)。
5.iostat
yangyang@ubuntu:~$ iostat
Linux 3.13.0-151-generic (ubuntu) 07/01/2018 _i686_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.55 0.07 1.54 0.06 0.00 94.78
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 8.63 131.78 42.60 440371 142360
iostat命令式块设备(Block Device)级别的信息。在OS内核的内部。一般不会记录文件缓存等OS文件系统级别的操作。这使得从OS上的应用程序看到的性能信息与iostat级别的性能信息之间产生了差异。
iostat能知道磁盘的繁忙度(使用率)。通过使用-x参数,能知道响应时间和各种队列的长度。
6.top
yangyang@ubuntu:~$ top
top - 19:15:32 up 1:01, 2 users, load average: 0.00, 0.03, 0.08
Tasks: 181 total, 1 running, 180 sleeping, 0 stopped, 0 zombie
%Cpu(s): 17.5 us, 6.6 sy, 0.0 ni, 75.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2063660 total, 958788 used, 1104872 free, 48812 buffers
KiB Swap: 2094076 total, 0 used, 2094076 free. 466352 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1176 root 20 0 186620 43296 16648 S 11.6 2.1 0:33.76 Xorg
3940 yangyang 20 0 69140 16304 11712 S 7.0 0.8 0:04.66 gnome-terminal
2762 yangyang 20 0 239412 65564 34700 S 5.3 3.2 0:31.80 compiz
4064 yangyang 20 0 176772 67688 13112 S 0.7 3.3 0:13.94 sublime_text
2540 yangyang 20 0 117740 20720 14148 S 0.3 1.0 0:20.63 hud-service
4250 yangyang 20 0 5544 1428 1008 R 0.3 0.1 0:00.12 top
1 root 20 0 4720 2716 1416 S 0.0 0.1 0:01.80 init
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.20 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 0:01.58 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
10 root rt 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/0
11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u17:0
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ata_sff
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 devfreq_wq
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
26 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
27 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 vmstat
28 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
29 root 39 19 0 0 0 S 0.0 0.0 0:00.52 khugepaged
30 root 20 0 0 0 0 S 0.0 0.0 0:00.00 fsnotify_mark
31 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ecryptfs-kthrea
32 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
44 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld
top这个命令最适合用来实时掌握OS整体的情况。使用这个命令可以一边适当地更新信息一边将信息显示出来。具体来说,每隔几秒会显示一下OS整体地情况,并整理出活跃地进程,显示这些进程地信息。由于据此可以知道哪些程序和进程活动频繁,因此便于调查最有可能引起故障地进程。
7.数据包转储(wireshark、tcpdump等)
据此能详细把握正在进行什么通信。通过检查数据包信息,能大致猜出哪个正在处理、哪个正在等待。另外,通过从两个服务器两边进行分段查找,可以特定到无法测量的网络部分的性能。
8.patack
从OS看到的调用栈的信息。
从这个命令据此能知道某个程序(进程)在某个瞬间执行了什么样的处理。由于只是快照形式,因此必须要多次执行来获取信息。如果程序在等待什么,那么即使多次执行pstack命令,应该也是在同一个调用栈等待。反复执行同一个处理的情况下,应该也能看到很多相同的调用栈。
9.系统调用(strace等)
这个命令能知道在等待哪个系统调用、OS的哪个函数比较耗时。
首先,通过使用top命令等,可以确定哪个进程值得怀疑。确定后再根据需要执行strace命令(特别是在OS异常的时候使用strace)。
10.Profiler
能够知道哪个函数被调用了多少次,以及时间耗费在了哪个函数上。
在开发者调查开发环境中整个程序的哪个地方比较耗时时,使用Profiler会很有效。原本OS的Profiler就需要目标程序在编译时加上-g(调试)参数,因此其多用于调查自己编写的程序。运行环境不同,Profiler的名字也各不相同(Linux中叫作perf,Gnu中叫作gprof)。
虽然Profiler是用来获取OS上的性能信息的工具,但是各种语言环境中,Profiler也是发出方便的性能分析工具。
本文只是简单的介绍,具体可以根据提到的命令进行详细的学习。