Linux性能分析常用命令

《图解性能优化》笔记

主要记录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也是发出方便的性能分析工具。

本文只是简单的介绍,具体可以根据提到的命令进行详细的学习。

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/80881320