Linux性能优化大师

监控工具

因为Linux操作系统的开放性和灵活性,诞生了大量的性能监控工具。其中有些Linux版本的工具是众所周知的UNIX工具,其他还有一些是为Linux特别设计的。大多数Linux性能监控工具基本都支持虚拟的proc文件系统。

介绍

企业级Linux发行版附带了许多监控工具。一些工具可处理度量标准,并提供更好的格式化输出,便于我们理解系统活动。一些工具是针对特定的性能度量标准(比如磁盘I/O)的,并可以给出更详细的信息。

熟悉这些工具可以帮助我们深入了解“系统发生了什么”,并帮助我们找到一个问题可能出现的原因。

工具功能概述

工具 最有用的工具功能
top 提供运行系统的动态实时视图。显示系统摘要信息以及任务列表
uptime 显示系统平均负载
ps、pstree 提供当前进程列表
free 显示系统中空闲内存和已使用内存的数量
mpstat 报告处理器相关的统计数据
vmstat 报告进程、内存、磁盘、系统、CPU的统计信息
iostat 报告CPU统计数据,还有设备和分区的输入/输出统计数据
netstat,ss 显示相关网络统计信息
sar 收集、报告系统活动信息
numastat 显示每个NUMA节点的内存统计信息
pmap 报告一个进程的内存映射
iptraf 交互式局域网监控程序
tcpdump,wireshark 用来捕捉和分析网络流量
strace,ltrace 系统调用和库调用跟踪程序
gnuplot 命令行绘图工具
Gnome System Monitor Gnome桌面环境的图形性能分析工具
KDE System Guard KDE任务管理器和性能监控器

top

top提供一个运行系统的动态实时视图。它可以显示系统摘要信息,以及目前正在由Linux内核管理的任务列表。默认情况下,它会显示运行在服务器上最占用CPU的任务,并每3s更新列表。可以通过进程标识符(PID)、内存使用(%MEM)、优先级(PR)、命令名称(COMMAND)等对进程进行排序。

top工具支持一些有用的热键,包括:

□ t,显示任务cpu信息的开关。

□ m,显示内存信息的开关。

□ f,进入top的交互式配置屏幕,添加/删除所显示的列,有助于为某个特定的任务设置top。

□ o,进入top的交互式配置屏幕,配置top列显示的顺序(从左到右)。

□ r,使用renice修改某个进程的优先级。

□ k,运行kill命令,如果一个进程挂起或者占用更多的CPU,可以杀死进程。

□ h,显示top热键的帮助信息。

uptime

uptime显示一行信息,包含当前时间,系统已经运行了多长时间,当前有多少用户登录,在过去1分钟、5分钟、15分钟的系统平均负载.

21:34:59 up  8:40,  1 user,  load average: 0.28, 0.37, 0.61

系统平均负载是可运行状态进程或不可中断状态进程的平均数。处在可运行状态的进程要么是正在使用CPU,要么是等待使用CPU。处在不可中断状态的进程正在等待一些I/O访问,例如等待磁盘。平均值有3个时间间隔。因为系统中CPU的数量、平均负载不是规范化的,所以,平均负载为1意味着一个单CPU系统始终是有负载的,在一个4核CPU系统上则意味着它有75%的空闲时间。

平均负载最佳值为1,这意味着每个进程都能立刻访问CPU,并且没有丢失CPU周期。对于单(核)处理器工作站,1或2是可以接受的,而在多处理器服务器上你可能会看到8到10的数字(单核CPU负载是2,4核CPU负载可能是8)。

可以使用uptime确定问题出在服务器还是网络。例如,如果一个网络应用程序运行很糟糕,则可以运行uptime,查看系统负载是否很高。如果没有,则这个问题很可能关系到你的网络,而不是你的服务器。

ps、pstree

当进行系统分析时,ps命令和pstree命令是最基本的常用命令。ps显示有关选择的活跃进程的信息。ps命令提供当前已存在进程的列表。top命令动态显示进程信息,但是ps命令可以以静态方式提供更详细的信息。

ps可以使用3种不同类型的命令选项:

□ UNIX选项,可以组合起来,必须在前面加一个连字符“-”。

□ BSD选项,可以组合起来,不能使用连字符“-”。

□ GNU长选项,在前面有两个连字符“--”。

默认情况下,ps选择具有与当前用户相同的有效用户ID(euid=EUID),并与使用相同终端作为调用程序相关联的所有进程。它显示进程ID(pid=PID)、进程相关联的终端(tname=TTY)、[dd-]hh:mm:ss格式的累计CPU时间(time=TIME)、可执行文件的名称(ucmd=CMD)。默认输出是不排序的。

列出进程的数量与信息取决于所使用的选项。键入简单的ps -ef命令可列出所有的进程:

parallels@parallels-Parallels-Virtual-Platform:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12:54 ?        00:00:06 /sbin/init splash
root         2     0  0 12:54 ?        00:00:00 [kthreadd]
root         4     2  0 12:54 ?        00:00:00 [kworker/0:0H]
root         6     2  0 12:54 ?        00:00:00 [mm_percpu_wq]
root         7     2  0 12:54 ?        00:01:11 [ksoftirqd/0]
root         8     2  0 12:54 ?        00:00:15 [rcu_sched]
root         9     2  0 12:54 ?        00:00:00 [rcu_bh]
root        10     2  0 12:54 ?        00:00:00 [migration/0]
root        11     2  0 12:54 ?        00:00:00 [watchdog/0]
root        12     2  0 12:54 ?        00:00:00 [cpuhp/0]
root        13     2  0 12:54 ?        00:00:00 [cpuhp/1]
root        14     2  0 12:54 ?        00:00:00 [watchdog/1]
root        15     2  0 12:54 ?        00:00:00 [migration/1]
root        16     2  0 12:54 ?        00:00:03 [ksoftirqd/1]
root        18     2  0 12:54 ?        00:00:00 [kworker/1:0H]
root        19     2  0 12:54 ?        00:00:00 [kdevtmpfs]

它们各自的PID对进一步操作至关重要,如果使用pmap或renice工具,PID号码是必需的。

使用BSD风格的选项将增加一个进程状态(stat=STAT)显示,并显示命令参数(args=COMMAND)来取代可执行文件的名称。键入ps aux,输出如下:

parallels@parallels-Parallels-Virtual-Platform:~$ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.5 373000  5456 ?        Ss   12:54   0:06 /sbin/init spla
root         2  0.0  0.0      0     0 ?        S    12:54   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   12:54   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   12:54   0:00 [mm_percpu_wq]
root         7  0.2  0.0      0     0 ?        S    12:54   1:11 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    12:54   0:15 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    12:54   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    12:54   0:00 [migration/0]
root        11  0.0  0.0      0     0 ?        S    12:54   0:00 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    12:54   0:00 [cpuhp/0]
root        13  0.0  0.0      0     0 ?        S    12:54   0:00 [cpuhp/1]
root        14  0.0  0.0      0     0 ?        S    12:54   0:00 [watchdog/1]
root        15  0.0  0.0      0     0 ?        S    12:54   0:00 [migration/1]
root        16  0.0  0.0      0     0 ?        S    12:54   0:03 [ksoftirqd/1]
root        18  0.0  0.0      0     0 ?        I<   12:54   0:00 [kworker/1:0H]
root        19  0.0  0.0      0     0 ?        S    12:54   0:00 [kdevtmpfs]
root        20  0.0  0.0      0     0 ?        I<   12:54   0:00 [netns]

使用BSD风格的选项还可以改变进程选择,包括在其他终端(TTY)中拥有的进程。此外,还可以设置在所有进程中过滤,以排除其他用户所拥有的进程或没有在一个终端上的进程。例如使用用户定义的格式查看每一个进程:

[root@zyg ~]# ps axo user,pid,priority,nice,command
USER	PID	PRI	NI	COMMAND
root	1	20	0	/sbin/init
root	2	20	0	[kthreadd]
root	3	-100	-	[migration/0]
root	4	20	0	[ksoftirqd/0]
root	5	-100	-	[migration/0]
root	6	-100	-	[watchdog/0]
root	7	-100	-	[migration/1]
...

如果仅显示httpd则可以键入ps–C httpd:

[root@zyg ~]# ps -C httpd
PID	TTY	TIME CMD
44626	?	00:00:00 httpd
44629	?	00:00:00 httpd
44630	?	00:00:00 httpd
44631	?	00:00:00 httpd
44632	?	

如果仅显示httpd的进程ID,则可以键入ps–C httpd–o pid=:

[root@zyg ~]# ps -C httpd -o pid=
44626
44629
44630
44631
44632
44633
44634
44635
44636

如果要查看线程信息,则可以键入如下命令:

[root@zyg ~]# ps aux | grep httpd
root	44661	0.0	0.2	186560	4168	?	Ss	22:05	0:00	/usr/sbin/httpd.worker
apache	44665	0.4	0.2	530820	5352	?	Sl	22:05	0:00	/usr/sbin/httpd.worker
apache	44668	0.4	0.2	596356	5356	?	Sl	22:05	0:00	/usr/sbin/httpd.worker
apache	44671	0.5	0.2	596356	5360	?	Sl	22:05	0:00	/usr/sbin/httpd.worker
root	44777	0.0	0.0	103252	832	pts/0	S+	22:05	0:00	grep httpd
[root@zyg ~]# ps -L 44665
PID	LWP	TTY	STAT	TIME	COMMAND
44665	44665	?	Sl	0:00	/usr/sbin/httpd.worker
44665	44670	?	Sl	0:00	/usr/sbin/httpd.worker
44665	44676	?	Sl	0:00	/usr/sbin/httpd.worker

1.简单的进程选择
□ -A,选择所有进程,与-e相同。

□ -N,选择除满足指定条件以外的所有进程。(否定选择)与--deselect相同。

□ T,选择与该终端相关的所有进程。与不带任何参数的t选项相同。

□ -a,选择除session leader(参见getsid(2))以外的进程和与该终端不相关的所有进程。

□ a,这个选项使得ps列出使用该终端(tty)的所有进程,或当与x选项一起使用时列出所有进程。

□ -d,选择除session leader以外的所有进程。

□ -e,选择所有进程,与-A相同。

□ g,真正所有的进程,甚至是session leader。此选项已经废弃。

□ r,限制只选择正在运行的进程。

□ X,此选项使得ps列出你拥有的所有进程,或当与a选项一起使用时列出所有进程。

□ --deselect,选择除满足指定条件以外的所有进程。(否定选择)与-N相同。

ps命令可以使用这些选项来选择要显示的信息。输出可以因个性化设置而不同。输出格式控制如下:

□ -F,额外的全格式。参见-f选项。

□ -O format,类似于-o,但是预加载了一些默认列。与-o pid、format、state、tname、time、command或-o pid、format、tname、time、cmd相同。参见-o。

□ O format,当作为一个格式化选项使用时,与-O相同。

□ -M,添加安全性数据列。与Z相同(SELinux)。

□ X,寄存器的格式。

□ Z,添加安全性数据列。与-M相同(SELinux)。

□ -c,为-l选项显示不同的调度器信息。

□ -f,全格式的列表。此选项可以与很多其他UNIX风格的选项组合来添加额外的列。与-L一起使用时,添加NLWP(线程数量)和LWP(线程ID)列。

□ j,BSD job控制格式。

□ -j,job格式。

□ l,显示BSD长格式。

□ -l,长格式,-y选项通常对此选项有用。

□ o format,指定用户定义的格式。与-o和--format相同。

□ -o format,用户定义的格式。format作为单独的参数,是空格分隔或逗号分隔列表的格式,其提供了一个方法来指定单独输出列。标题可以重命名(ps -o pid,ruser=RealUser -o comm=Command)。如果所有列标题为空(ps -o pid= -o comm=)那么此标题行将不会显示。

□ s,显示信号格式。

□ u,显示面向用户的格式。

□ v,显示虚拟内存格式。

□ -y,不显示选项;显示rss的地址位。这个选项只能与-l一起使用。

□ -Z,显示安全上下文格式(SELinux等)。

□ --format format,用户定义的格式。与-o和o相同。

□ --context,显示安全上下文格式(SELinux)。

2.线程显示
□ H,显示线程,好像它们是进程。

□ -L,显示线程,可能使用LWP和NLWP列。

□ -T,显示线程,可能使用SPID列。

□ M,在进程之后显示线程。

□ -m,在进程之后显示线程。

3.进程FLAGS
在F列中显示这些值的总和,它是由flag输出说明符来提供的。

□ 1,已经fork但没有exec。

□ 4,使用超级用户特权。

进程状态代码:

□ D,不可中断的睡眠(通常为IO)。

□ R,正在运行或可运行(在运行队列中)。

□ S,可中断的睡眠(等待一个事件完成)。

□ T,已停止,通过一个job控制信号或因为它正在被跟踪。

□ W,分页(从2.6.xx内核开始已无效)。

□ X,死亡(永远不会看到)。

□ Z,已消亡的进程,已经终止但是它的父进程还没有回收。

对于BSD格式,当使用stat关键字时,可能会显示其他的字符:

□ <,高优先级(其他用户不能nice)。

□ N,低优先级(其他用户可以nice)。

□ L,在内存中锁定分页(用于实时或定制IO)。

□ s,session leader。

□ l,多线程(使用CLONE_THREAD,像是NPTL pthreads)。

□ +,在前台进程组中。

pstree可以以树形结构显示运行的进程,从而方便我们观察进程间的父子关系。下面是pstree的部分输出:

parallels@parallels-Parallels-Virtual-Platform:~$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─avahi-daemon───avahi-daemon
        ├─boltd───2*[{boltd}]
        ├─colord───2*[{colord}]
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd
        ├─dbus-daemon
        ├─fwupd───4*[{fwupd}]
        ├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───{Xorg}
 ... ...
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─udisksd───4*[{udisksd}]
        ├─unattended-upgr───{unattended-upgr}
        ├─upowerd───2*[{upowerd}]
        ├─whoopsie───2*[{whoopsie}]
        └─wpa_supplicant

添加-p选项我们还能看到进程的PID:

parallels@parallels-Parallels-Virtual-Platform:~$ pstree -p
systemd(1)─┬─ModemManager(489)─┬─{ModemManager}(528)
           │                   └─{ModemManager}(554)
           ├─NetworkManager(29256)─┬─dhclient(31967)
           │                       ├─{NetworkManager}(29257)
           │                       └─{NetworkManager}(29259)
           ├─accounts-daemon(461)─┬─{accounts-daemon}(477)
           │                      └─{accounts-daemon}(552)
           ├─acpid(473)
           ├─avahi-daemon(573)───avahi-daemon(575)
           ├─boltd(1457)─┬─{boltd}(1470)
           │             └─{boltd}(1472)
           ├─colord(602)─┬─{colord}(629)
           │             └─{colord}(635)

free

free命令可以显示系统中空闲物理内存总量、已使用物理内存总量、swap空间、内核使用的缓冲和缓存信息,如图2-7所示。共享内存(shared)表示/proc/meminfo文件中MemShared(2.4内核)或Shmem(2.6内核之后)。在RedHat Enterprise Linux 6之前该字段为0,RedHat Enterprise Linux 7中显示为/proc/meminfo下的Shmem文件。下面是free命令输出示例:

parallels@parallels-Parallels-Virtual-Platform:~$ free
              total        used        free      shared  buff/cache   available
Mem:        1003204      600876       80380        9020      321948      235516
Swap:       2097148      448080     1649068

当使用free时,记得Linux内存架构和虚拟内存管理工作的方式。空闲内存使用受限,单纯swap的使用率统计并不一定反映出现内存瓶颈。

free命令的参数包括:

□ -b、--bytes,显示内存的总量,以字节为单位。

□ -k、--kilo,显示内存的总量,以KB为单位。这是默认值。

□ -m、--mega,显示内存的总量,以MB为单位。

□ --tera,显示内存的总量,以TB为单位(RedHat Enterprise Linux 7)。

□ -h、--human,显示所有输出字段,自动缩放到最短三位数单位并显示单位(RedHat Enterprise Linux 7)。

□ B = bytes

□ K = kilos

□ M = megas

□ G = gigas

□ T = teras

如果没找到单位,你有PB的RAM或swap,则数字在TB级别显示。

□ -c、--count count,显示结果count次。需要与-s选项一起使用。

□ -l、--lohi,显示详细的低内存和高内存统计数据。

□ -o、--old,以旧格式显示输出,唯一的区别是这个选项禁用了详细的“调整缓冲区”行的显示。

□ -s、--seconds seconds,延迟seconds连续显示结果。实际上可以指定任何浮点数的延迟,usleep(3)用微秒解析delay时间。

□ --si,使用1000而不是1024(RedHat Enterprise Linux 7)。

□ -t、--total,显示一行列的总计。

□ --help,显示帮助信息(RedHat Enterprise Linux 7)。

□ -V、--version,显示版本信息。

区域中使用的内存

使用-l选项,可以看到每个内存区域中使用了多少内存。下面显示了32位和64位系统free -ml输出的例子。请注意64位系统不再使用高内存。

32位系统上键入free -ml命令,输出如下:

[root@zyg ~]# free -ml
total	used	free	shared	buffers	cached
Mem:	4050	219	3831	0	15	148
Low:	850	36	814			
High:	3199	182	3017			
-/+ buffers/cache:	54	3995			
Swap:	5023	0	5023		

64位系统上键入free-ml命令,输出如下:

[root@zyg ~]# free -ml
total	used	free	shared	buffers	cached
Mem:	15936	15719	217	0	118	14066
Low:	15936	15719	217			
High:	0	0	0			
-/+ buffers/cache:	1534	14402			
Swap:	31999	5711	26288	

使用/proc/buddyinfo文件,还可以确定在每个区域中有多少内存块可用。每一列的数量意味着可用的分页数量。请记住伙伴系统(buddy system)如何分配分页(参考1.2.2节的内容)。这些信息告诉你内存是如何分片的,并给出一个建议,你可以放心地分配多少分页。通过下面命令可以查看分页数量:

[root@zyg ~]# cat/proc/buddyinfo
Node 0, zone Normal 10330 2001 0 1 1 48 25 10 3 0 0
Node 1, zone DMA11111010113
Node 1, zone DMA32 12388 2099 380 211 131 44 21 7 3 1 0
Node 1, zone Normal 1442 1100 714 500 238 81 32 22 9 4

这里以第一行为例来解释一下各部分的含义。Node 0表示numa节点编号。zone Normal表示内存区域。后面的数字按列排列,一共11列,但注意第一列为0,也就是说列是0~10。每列的可用分页数量为当前数字乘以2的列数次幂再乘以分页大小。例如,第0列的可用分页数量为:10330 * 2^0 * 4KB= 41320KB,第1列的可用分页数量为:2001 * 2^1 *4KB= 16008KB,后面数字以此类推进行计算。

mpstat

mpstat命令用来报告在多处理器服务器上每个可用CPU的相关统计数据。从CPU 0开始。还会报告所有CPU的全局平均活动。mpstat工具是sysstat软件包的一部分。

parallels@parallels-Parallels-Virtual-Platform:~$ mpstat 1 10
Linux 4.15.0-88-generic (parallels-Parallels-Virtual-Platform) 	04/10/2020 	_x86_64_	(2 CPU)

10:18:24 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:18:25 PM  all    2.99    0.00    1.49    0.00    0.00    0.50    0.00    0.00    0.00   95.02
10:18:26 PM  all    1.49    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   97.01
10:18:27 PM  all    1.99    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   96.02
10:18:28 PM  all    1.02    0.00    1.02    0.00    0.00    0.00    0.00    0.00    0.00   97.97
10:18:29 PM  all    2.00    0.00    1.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
10:18:30 PM  all    1.99    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   96.52

interval参数指定每次报告之间的时间间隔,以秒为单位。值为0(或没有参数)表明报告自系统启动以来的处理器统计数据。count参数如果不设置为0则可以和interval参数结合使用。count的值决定了间隔秒数生成报告的次数。如果只指定interval参数,没有count参数,那么mpstat命令将不断地生成报告。

mpstat命令的参数包括:

□ -A,这个选项相当于指定-u -I ALL -P ALL。

□ -I {SUM | CPU | SCPU | ALL},报告中断统计数据。
• SUM,mpstat命令报告每个处理器中断的总共数量。显示以下值:
○ CPU,处理器编号。all表明统计数据为所有处理器之间计算的平均值。
○ intr/s,一个CPU或多个CPU每秒接收中断的总数。
• CPU,显示一个CPU或多个CPU每秒接收的每个独特中断的数量。
• SCPU,显示一个CPU或多个CPU每秒接收的每个独特软件中断的数量。此选项只能在2.6.31内核和之后版本(RHEL7)中使用。
• ALL,相当于指定以上所有关键字,所以显示所有中断统计信息。

□ -P {cpu [,...] | ON | ALL},指明报告统计数据的处理器编号。cpu是处理器编号。注意,处理器0是第一个处理器。ON表明报告每个在线处理器的统计数据,ALL表明报告所有处理器的统计数据。

□ -u,报告CPU使用率,显示以下值:
• CPU,处理器编号。all表明统计数据为所有处理器之间计算的平均值。
• %usr,显示在用户级别(应用程序)执行时发生的CPU使用率百分比。
• %nice,显示在用户级别使用nice优先级执行时发生的CPU使用率百分比。
• %sys,显示在系统级别(内核)执行时发生的CPU使用率百分比。注意,这没有包括为硬件和软件中断服务所花费的时间。
• %iowait,显示在系统未完成磁盘I/O请求期间,一个CPU或多个CPU空闲时间的百分比。
• %irq,显示一个CPU或多个CPU服务硬件中断花费时间的百分比。
• %soft,显示一个CPU或多个CPU服务软件中断花费时间的百分比。
• %steal,显示当hypervisor为另一个虚拟处理器服务的时候,一个虚拟CPU或多个虚拟CPU非主动等待所花费时间的百分比。
• %guest,显示一个CPU或多个CPU运行一个虚拟处理器所花费时间的百分比(Red Hat Enterprise Linux 6)。
• %gnice,显示一个CPU或多个CPU运行一个nice的虚拟机所花费时间的百分比(Red Hat Enterprise Linux 7)。
• %idle,显示一个CPU或多个CPU空闲时间的百分比,并且系统没有未完成的磁盘I/O请求。

□ -V,显示版本号,然后退出。

mpstat工具可以显示每个系统或每个处理器整体CPU的统计信息。当使用采样模式时,mpstat可以通过一个采样频率和一个采样计数创建统计信息。下面为通过mpstat -P ALL命令显示每个处理器的平均CPU使用率,创建一个采样输出。

这是在多处理器上mpstat命令的输出示例:

[root@zyg ~]# mpstat -P ALL
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)	10/14/14	_x86_64_ (16 CPU)
16:19:03	CPU	%usr	%nice	%sys	%iowait	%irq	%soft	%steal	%guest	%idle
16:19:03	all	0.09	0.19	0.20	1.66	0.00	0.01	0.00	0.00	97.85
16:19:03	0	0.21	0.11	0.42	2.85	0.00	0.02	0.00	0.00	96.40
16:19:03	1	0.05	0.46	0.09	1.55	0.00	0.00	0.00	0.00	97.85
16:19:03	2	0.20	0.10	0.44	1.71	0.00	0.06	0.00	0.00	97.49
16:19:03	3	0.02	0.21	0.07	1.32	0.00	0.00	0.00	0.00	98.38
16:19:03	4	0.03	0.07	0.12	1.43	0.00	0.00	0.00	0.00	98.35
16:19:03	5	0.08	0.22	0.12	2.80	0.00	0.00	0.00	0.00	96.77
16:19:03	6	0.35	0.11	0.75	1.58	0.00	0.01	0.00	0.00	97.20
16:19:03	7	0.02	0.15	0.07	1.30	0.00	0.00	0.00	0.00	98.46
16:19:03	8	0.07	0.08	0.13	2.68	0.00	0.00	0.00	0.00	97.04
16:19:03	9	0.01	0.09	0.07	1.08	0.00	0.00	0.00	0.00	98.74
16:19:03	10	0.24	0.21	0.54	1.32	0.00	0.01	0.00	0.00	97.68
16:19:03	11	0.05	0.45	0.10	1.10	0.00	0.00	0.00	0.00	98.30
16:19:03	12	0.02	0.02	0.05	1.05	0.00	0.00	0.00	0.00	98.86
16:19:03	13	0.03	0.07	0.08	2.57	0.00	0.00	0.00	0.00	97.26
16:19:03	14	0.11	0.34	0.16	1.14	0.00	0.01	0.00	0.00	98.24
16:19:03	15	0.01	0.41	0.05	1.01	0.00	0.00	0.00	0.00	98.52

对于一个多处理器服务器上的CPU0,间隔1秒钟显示2次统计信息条目,使用命令:

mpstat -P 0 1 2

下面是在机器上使用mpstat命令采集CPU0数据2次:

[root@zyg ~]# mpstat -P 0 1 2
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)	10/14/14	_x86_64_ (16 CPU)
16:20:19	CPU	%usr	%nice	%sys	%iowait	%irq	%soft	%steal	%guest	%idle
16:20:20	0	0.99	0.00	0.00	0.00	0.00	0.00	0.00	0.00	99.01
16:20:21	0	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00	100.00
Average:	0	0.50	0.00	0.00	0.00	0.00	0.00	0.00	0.00	99.50

vmstat

vmstat用来报告关于进程、内存、分页、块IO、中断、CPU活动的信息。vmstat命令显示平均数据或实际样本。通过给vmstat命令提供一个采样频率和采样次数可启用采样模式。

注意: 在采样模式中,要考虑在实际数据收集期间出现峰值的可能性。将采样频率设置为一个较低的值可以避开这样隐藏的峰值。

键入vmstat 1,可以看到以下输出:

[root@zyg ~]# vmstat 1
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	5848876	230184	112644	14420508	8	2	25	71	00	0	0	98	2	0
0	0	5848876	229184	112652	14421436	0	0	0	16	1022	2033	0	0	100	0	0
0	0	5848876	229308	112652	14421540	0	0	0	0	1144	2238	0	0	100	0	0
0	0	5848876	229020	112652	14422280	0	0	0	0	1580	3188	0	0	100	0	0
0	0	5848876	228216	112652	14423108	0	0	0	0	1094	2142	0	0	100	0	0
0	0	5848876	227368	112652	14423936	0	0	0	4932	1342	2235	0	0	99	0	0

注意: 第一行产生的报告是自上次重启之后的平均值,因此应该考虑排除它。可以使用delay给出采样周期的长度报告更多的信息。进程和内存的报告是瞬时的。

虚拟内存模式中显示的字段:

□ Procs
• r,可运行进程的数量(正在运行或等待运行时间)。
• b,不可中断睡眠状态进程的数量。

□ memory
• swpd,虚拟内存使用的数量。
• free,用作空闲内存的数量。
• buff,用作缓冲区的内存数量。
• cache,用作缓存的内存数量。
• inact,非活跃内存的数量(使用-a选项)。
• active,活跃内存的数量(使用-a选项)。

□ swap
• si,从磁盘换入的内存数量(每秒)。
• so,交换到磁盘的内存数量(每秒)。

□ io
• bi,从块设备接收到的块(每秒块数)。
• bo,发送到块设备的块(每秒块数)。

□ system
• in,每秒中断的数量,包含时钟中断。
• cs,每秒上下文切换的数量。

□ cpu,CPU总时间的百分比。
• us,运行非内核代码花费的时间(用户时间,包括nice时间)。
• sy,运行内核代码花费的时间(系统时间)。
• id,空闲花费的时间。在Linux 2.5.41内核之前,包含IO-wait时间。
• wa,IO等待花费的时间。在Linux 2.5.41内核之前,包含idle时间。
• st,虚拟机偷走的时间。在Linux 2.6.11内核之前,是未知的。

下面是磁盘模式的输出:

磁盘模式中显示的字段:

□ reads
• total,成功完成读取的总量。
• merged,合并后分组的读(导致一个I/O)。
• sectors,成功读取的扇区。
• ms,读取所花费的毫秒。

□ writes
• total,成功完成写入的总量。
• merged,合并后分组的写(导致一个I/O)。
• sectors,成功写入的扇区。
• ms,写入所花费的毫秒。

□ IO
• cur,正在进行的I/O。
• sec,I/O花费的秒数。

下面是分区模式的输出:

[root@zyg ~]# vmstat -p /dev/sda1 1 10
sda1	reads	read sectors	writes	requested writes
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88
			13244		4304970				20					88

磁盘分区模式中显示的字段:

□ reads,发给这个分区读的总数。

□ read sectors,分区总共读取的扇区。

□ writes,发给这个分区写的总数。

□ requested writes,对分区执行写请求的总数。

使用-m选项可以看到SLAB模式的输出:

[root@zyg ~]# vmstat -m 1 1
Cache	Num	Total	Size	Pages
nf_conntrack_expect	0	0	240	16
nf_conntrack_ffffffff81c9a600	37	65	304	13
pid_2	0	0	128	30
bridge_fdb_cache	0	0	64	59
libfc_em	0	0	256	15
libfc_fcp_pkt	0	0	320	12
scsi_tgt_cmd	0	0	80	48
rpc_buffers	8	8	2048	2
rpc_tasks	8	15	256	15
rpc_inode_cache	8	8	832	4
cachefiles_object_jar	1	12	320	12
fscache_cookie_jar	0	0	72	53
fib6_nodes	22	59	64	59
ip6_dst_cache	15	36	320	12
ndisc_cache	1	15	256	15
ip6_mrt_cache	0	0	128	30
RAWv6	35	36	960	4

SLAB模式中显示的字段:

□ cache,缓存名称。

□ num,当前活动对象的数量。

□ total,可用对象的总数。

□ size,每个对象的大小。

□ pages,至少一个活动对象的分页数量。

vmstat支持的选项:

□ delay,在更新之间延迟的秒数。如果没有指定delay,只报告一行自启动开始到目前的平均值。

□ count,更新的次数。没有count,当定义delay的时候,默认是无限的。

□ -a、--active,显示活跃和非活跃内存,在2.5.41内核之后支持。

□ -f、--forks,显示自启动开始到目前的fork数量,包含了fork、vfork、clone系统调用,相当于创建任务的总数。每个进程由一个或多个任务来表示,这取决于线程的使用。这个显示不会重复。

□ -m、--slabs,显示slab信息。

□ -n、--one-header,只显示标题一次,而不是周期性的。如果在采样模式下运行vmstat,通过管道输出到一个文件是有用的。

□ -s、--stats,显示包含各种事件计数器和内存统计信息的一张表。这个显示不会重复。

□ -d、--disk,报告磁盘统计数据(在2.5.70内核之后支持)。

□ -D、--disk-sum,报告关于磁盘活动的一些汇总统计数据(RedHat Enterprise Linux 7)。

□ -p, --partition devic,有关分区的详细统计信息(在2.5.70内核之后支持)。

□ -S, --unit character,在1000(k)、1024(K)、1000 000(m)或1048576(M)字节之间切换输出。注意,不会改变swap(si/so)或块(bi/bo)字段。

□ -V、--version,显示版本信息并退出。

□ -h、--help,显示帮助并退出。

注意: vmstat不需要特殊的权限。这些报告的目的是帮助确定系统瓶颈。Linux vmstat不将本身作为一个正在运行的进程。目前所有Linux块都为1024字节。旧版内核可能报告块为512字节、2048字节、4096字节。从procps 3.1.9开始,vmstat可以让用户选择单位(k,、K、m、M)。默认模式中默认为K(1024字节)。vmstat使用slabinfo 1.1。

iostat

iostat报告CPU统计数据,并观察有关设备的平均传输速率的活跃时间,其用来监控系统输入/输出设备负载。iostat命令生成的报告可以用来更改系统配置,进行详细的I/O瓶颈和性能调整,以在物理磁盘之间更好地平衡输入/输出负载。iostat工具是sysstat软件包的一部分。

通过iostat命令生成的第一部分报告提供了有关系统自启动以后的统计数据,除非使用-y选项(这种情况下,省略第一份报告)。随后每次的报告涵盖了自上一次报告以后的时间。每次iostat命令运行会报告所有的统计数据。报告由一个CPU标题行后面跟一排CPU统计数据组成。在多处理器系统上,使用系统范围内所有处理器的平均值计算CPU统计数据。设备标题行后面跟着一行配置每个设备的统计数据。

interval参数指定在每次报告之间以秒为单位的时间量。count参数可以与interval参数一起指定。如果指定了count参数,则count值决定了在interval秒产生的报告数。如果指定了interval参数而没有指定count参数,则iostat命令将不断地生成报告。

iostat命令生成两种类型的报告:CPU使用率报告和设备使用率报告。

1.CPU使用率报告
通过iostat命令生成的第一部分报告是CPU使用率报告。对于多处理器系统,它是所有处理器总数的CPU全局平均值。报告包含以下格式:

□ %user,显示当在用户级别(应用程序)执行时发生的CPU使用率百分比。

□ %nice,显示在拥有nice优先级用户级别执行时发生的CPU使用率百分比。

□ %system,显示当在系统级别(内核)执行时发生的CPU使用率百分比。

□ %iowait,显示在系统未完成磁盘I/O请求期间,一个CPU或多个CPU空闲时间的百分比。

□ %steal,显示当hypervisor为另一个虚拟处理器服务的时候,一个虚拟CPU或多个虚拟CPU非自愿等待所花费时间的百分比。

□ %idle,显示一个CPU或多个CPU空闲时间的百分比,并且系统没有未完成的磁盘I/O请求。

2.设备使用率报告
通过iostat命令生成的第二部分报告是设备使用率报告。设备报告提供了基于每个物理设备或每个分区上的统计数据。可以在命令行输入块设备和分区来显示统计数据。如果没有输入设备或分区,那么显示系统使用的每个设备统计数据,并提供内核对其维护的统计数据。如果在命令行上使用ALL选项,那么显示的统计数据为系统定义的每个设备的,包括那些从未使用过的。传输速率默认显示的块为1KB。该报告可以显示以下字段,这取决于所使用的标记:

□ Device,这列给出了在/dev目录中列出的设备(或分区)名称。

□ tps,指出每秒发出到设备的传输数量。传输是一个到设备的I/O请求。到设备的多个逻辑请求可以组合成一个单个的I/O请求。传输具有不确定的大小。

□ Blk_read/s,指出从设备读取的数据量,以每秒块的数量表示。块相当于扇区,因此大小为512字节。

□ Blk_wrtn/s,指出设备写入到的数据量,以每秒块的数量表示。块相当于扇区,因此大小为512字节。

□ Blk_read,总共读取的块数。

□ Blk_wrtn,总共写入的块数。

iostat可以使用很多选项。从性能角度来看,最有用的一个选项是-x。它显示扩展统计信息。下面是其示例输出:

□ rrqm/s,设备请求队列中,每秒合并的读请求数量。

□ wrqm/s,设备请求队列中,每秒合并的写请求数量。

□ r/s,设备每秒完成的读请求的数量(合并之后)。

□ w/s,设备每秒完成的写请求的数量(合并之后)。

□ rsec/s,每秒从设备读取的扇区的数量。

□ wsec/s,每秒写入到设备的扇区的数量。

□ avgrq-sz,发出到设备的请求的平均大小(以扇区为单位)。

□ avgqu-sz,发出到设备的请求的平均队列长度。

□ await,发出到设备的I/O请求到被服务的平均时间(以毫秒为单位)。这包括请求在队列中花费的时间和服务请求花费的时间。

□ svctm,发出到设备的I/O请求的平均服务时间(以毫秒为单位)。

□ %util,在I/O请求发出到设备期间CPU时间的百分比(设备的带宽使用率)。当这个值接近100%的时候设备饱和。

当定制到一个磁盘子系统的访问模式时,它可能有助于计算平均I/O大小。下面的例子是使用iostat -d和-x标志的输出,这里只显示关于磁盘子系统的信息。

使用iostat -x–d分析平均I/O大小示例:

iostat -d -x/dev/sda3 1

注意: 当文件系统使用默认的async模式时,iostat中显示的只有平均请求大小是正确的。即使通过应用程序执行不同大小的写请求,Linux的I/O层将尽可能地合并它们并因此改变平均I/O大小。

iostat支持的选项:

□ -c,显示CPU使用率报告。

□ -d,显示设备使用率报告。

□ -g group_name {device [...] | ALL},显示一组设备的统计数据。iostat命令报告列表中每个单独设备的统计数据,然后显示与组名相同的一组的全局统计数据,并提出列表中的所有设备。ALL意味着系统定义的所有块设备将被包含在组中(RedHat Enterprise Linux 7)。

□ -h,使设备使用率报告更容易被人阅读。

□ -j {ID | LABEL | PATH | UUID | ...} [device [...] | ALL],显示持久设备名称。选项ID、LABEL等指定持久名称的类型。这些选项没有限制,唯一的前提是具有持久名称的目录存在/dev/disk中。另外,在选择的持久名称类型中可以指定多个设备。因为持久设备名称通常很长,启用-h选项隐含了它(RedHat Enterprise Linux 7)。

□ -k,显示每秒统计数据,以KB为单位。

□ -m,显示每秒统计数据,以MB为单位。

□ -N,对于任何映射设备,显示已注册设备的映射名称,用于查看LVM2统计数据。

□ -p [{device [,...] | ALL}],显示系统使用的块设备和它所有分区的统计数据。如果在命令行输入设备名称,那么它和它所有分区的统计数据都会显示。ALL表明显示系统定义的所有块设备和分区的统计数据,包括那些从未使用过的。如果在此选项前使用-j选项,则在命令行上输入的设备可以选择指定持久名称类型。

□ -T,这个选项必须与-g选项一起使用,表示只有该组的全局统计数据被显示,而不是组中各个设备的统计数据(RedHat Enterprise Linux 7)。

□ -t,为显示的每个报告打印时间。

□ -V,显示版本号并退出。

□ -x,显示扩展的统计数据。

□ -y,如果在给定interval显示多条记录,省略第一次自系统启动以来统计数据的报告(RedHat Enterprise Linux 7)。

□ -z,告诉iostat在采样期间省略任何不活跃设备的输出。

netstat、ss

netstat是最流行的工具之一。如果在网络上工作,你应该熟悉这个工具。它显示许多网络相关的信息,比如socket的使用、路由、接口、协议及网络统计信息等。下面是一些基本的选项:
□ (none),默认情况下,netstat显示打开的socket列表。如果没有指定任何地址,那么所有配置地址的活跃socket都将显示。

□ --route,-r,显示内核的路由表。netstat -r与route -e可以生成相同的输出。

□ --groups,-g,显示IPV4和IPV6组播组成员信息。

□ --interfaces=iface,-I=iface,-i。显示所有网络接口的表,或指定接口的表。

□ --masquerade,-M,显示伪装的连接列表。

□ --statistics,-s,显示每个协议的统计数据总结。

注意: 这个程序已经被废弃了。替换netstat的是ss,替换netstat -r的是ip route,替换netstat -i的是ip -s link,替换netstat -g的是ip maddr。

下面的例子显示了socket信息的部分输出示例(使用netstat命令显示socket信息):

[root@zyg ~]# netstat -n
Active Internet connections (w/o servers)
Proto	Recv-Q	Send-Q	Local Address	Foreign Address	State
tcp	0	232	219.168.5.38:9825	123.120.27.173:53432	ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto	RefCnt	Flags	Type	State	I-Node Path
unix	2	[]	DGRAM	14021	/tmp/fcoemon.dcbd.2162
unix	3	[]	DGRAM	13943	/var/run/lldpad/clif
unix	2	[]	DGRAM	14025	/var/run/fcm/fcm_clif
unix	15	[]	DGRAM	24547910	/dev/log
unix	2	[]	DGRAM	9338	@/org/kernel/udev/udevd
unix	2	[]	DGRAM	14336	@/org/freedesktop/hal/udev_event
unix	2	[]	DGRAM	25205379	
unix	2	[]	DGRAM	24548943	
...

1.Active Internet connections
□ Proto,socket使用的协议(tcp、udp、udpl、raw)。

□ Recv-Q
• Established,连接这个socket的用户程序非复制的字节数。
• Listening,从2.6.18内核开始这列包含了当前的syn_backlog。

□ Send-Q
• Established,远程主机没有确认的字节数。
• Listening,从2.6.18内核开始这列包含了syn_backlog的最大值。

□ Local Address,socket本地端的地址和端口号。除非指定–numeric(-n)选项,否则socket地址将被解析为规范主机名(FQDN),端口号被翻译成规范服务名称。

□ Foreign Address,socket远程端的地址和端口号。类似“Local Address”。

□ State,socket的状态。因为raw模式没有状态,通常没有状态用于UDP和UDPLite,这列可能保留为空。一般情况下会是以下值之一:
• ESTABLISHED,socket是一个已经建立的连接。
• SYN_SENT,socket积极尝试建立一个连接。
• SYN_RECV,从网络接收到一个连接请求。
• FIN_WAIT1,socket已关闭,并且连接关闭。
• FIN_WAIT2,连接已关闭,并且socket等待远程端关闭。
• TIME_WAIT,连接关闭之后socket等待处理的仍在网中的数据包。
• CLOSE,socket没有被使用。
• CLOSE_WAIT,远程端已经关闭,等待socket关闭。
• LAST_ACK,远程端已经关闭,并且socet已经关闭。等待确认。
• LISTEN,socket监听进来的连接。在输出中不包含这样的socket,除非你指定--listening(-l)或–all(-a)选项。
• CLOSING,两端scoket已经关闭,但是仍然没有发送所有的数据。
• UNKNOWN,socket的状态是未知。

2.Active UNIX domain Sockets
□ Proto,socket使用的协议(通常是UNIX)。

□ RefCnt,引用计数(例如通过这个socket附加进程)。

□ Flags,显示的flags有SO_ACCEPTON(显示为ACC)、SO_WAITDATA(W)或SO_NOSPACE(N)。如果其相应的进程正在等待一个连接请求,则SO_ACCECPTON用于未连接的套接字。其他标志一般不关心。

□ Type,其有一些socket访问类型:
• SOCK_DGRAM,socket被用于数据报(无连接)模式。
• SOCK_STREAM,这是一个流(连接)socket。
• SOCK_RAW,socket用作raw socket。
• SOCK_RDM,这一列提供可靠传递的消息。
• SOCK_SEQPACKET,这是一个连续数据包的socket。
• SOCK_PACKET,raw接口访问socket。
• UNKNOWN,“谁知道未来会带给我们什么”,就填写在这里。

□ State,这个字段包含以下内容:
• FREE,这个socket没有被分配。
• LISTENING,这个socket监听连接请求。在输出中不包含这样的socket,除非你指定—listening(-l)或–all(-a)选项。
• CONNECTING,这个socket是关于建立一个连接的socket。
• CONNECTED,这个socket是已经连接的socket。
• DISCONNECTING,这个socket是断开连接的socket。
• (empty),这个socket没有连接到另一个socket。
• UNKNOWN,这个状态应该永远不会发生。

□ I-Node,Socket的inode号码。

□ Path,附加到socket的相应进程的路径名称。

使用netstat显示路由表信息示例:

[root@zyg ~]# netstat -r -n
Kernel IP routing table
Destination	Gateway	Genmask	Flags	MSS	Window	irtt Iface
219.168.2.38	0.0.0.0	255.255.255.240	U	0	0	0 eth0
192.168.122.0	0.0.0.0	255.255.255.0	U	0	0	0 virbr0
169.254.0.0	0.0.0.0	255.255.0.0	U	0	0	0 eth0
0.0.0.0	219.168.2.250	0.0.0.0	UG	0	0	0 eth0

netstat支持的选项:

□ --verbose、-v,通过详细信息告诉用户发生了什么事。特别是显示关于未配置地址的一些有用的信息。

□ --wide、-W,通过不截断IP地址使用一样宽的输出。这个选项现在不再打断已存在的脚本。

□ --numeric、-n,显示数字形式的地址,取代尝试确定符号代码形式的主机、端口、用户名。

□ --numeric-hosts,显示数字形式的主机地址,但是不要影响端口或用户名的解析。

□ --numeric-ports,显示数字形式的端口号,但是不要影响主机或用户名的解析。

□ --numeric-users,显示数字形式的用户ID,但是不要影响主机或端口名称的解析。

□ --protocol=family、-A,为显示出来的连接指定地址家族(也许可以更好地描述低等级的协议)。地址家族的列表使用逗号分隔各家族,如inet、inet6、unix、ipx、ax25、netrom、econet、ddp。使用--inet|-4、--inet6|-6、--unix|-x、--ipx、--ax25、--netrom、--ddp选项具有相同的影响。

地址家族inet(IPV4)包括raw、udp、udplite、tcp协议socket。

□ -c、--continuous,这将使得netstat每秒连续地显示所选择的信息。

□ -e、--extend,显示额外的信息。

□ -o、--timers,包括网络定时器的相关信息。

□ -p、--program,显示附属于每个socket的进程的PID和名称。

□ -l、--listening,显示仅监听的sockets(默认配置)。

□ -a、--all,显示监听和非监听(TCP意味着已经建立连接)的socket。与--interface选项一起,显示未启动的接口。

□ -F,显示FIB中的路由信息(默认配置)。

□ -C,显示路由缓存中的路由信息。

3.delay
netstat将周期地显示每次delay秒的统计数据。

ss是另一个探讨socket的实用程序,被用于显示socket统计数据。它显示的信息与netstat相似。它可以比其他工具显示更多的TCP信息和状态信息。

下面是一个ss命令输出的示例:

[root@zyg ~]# ss
State	Recv-Q	Send-Q	Local Address:Port	Peer Address:Port
ESTAB	0	52	219.168.2.38:9825	123.120.27.173:53432
ESTAB	0	0	219.168.2.38:9825	123.120.27.173:55863

ss支持的选项(当没有使用选项的时候,ss显示打开的已建立连接的非监听TCP socket列表):

□ -h、--help,显示选项的信息。

□ -V、--version,输出版本信息。

□ -n、--numeric,不要试图解析服务名称。

□ -r、--resolve,试图解析数字形式的地址/端口。

□ -a、--all,显示监听和非监听(对于TCP这意味着已经建立的连接)的socket。

□ -l、--listening,只显示监听的socket(默认情况下被省略)。

□ -o、--options,显示定时器信息。

□ -e、--extended,显示详细的socket信息。

□ -m、--memory,显示socket的内存使用情况。

□ -p、--processes,显示进程使用的socket。

□ -i、--info,显示内部TCP信息。

□ -s、--summary,显示汇总统计数据。此选项从各种源得到汇总,不解析socket列表。当socket数量巨大时很有用,解析/proc/net/tcp是很痛苦的。

□ -b、--bpf,显示socket BPF过滤器(只允许管理员得到这些信息)。

□ -4、--ipv4,只显示IPv4 socket(别名-f inet)。

□ -6、--ipv6,只显示IPv6 socket(别名-f inet6)。

□ -0、--packet,显示PACKET socket(别名-f link)。

□ -t、--tcp,显示TCP socket。

□ -u、--udp,显示UDP socket。

□ -w、--raw,显示RAW socket。

□ -d、--dccp,显示DCCP socket。

□ -x、--unix,显示UNIX域socket(别名-f unix)。

□ -f FAMILY、--family=FAMILY,显示FAMILY类型的socket。目前支持以下家族: unix、inet、inet6、link、netlink。

□ -A QUERY、--query=QUERY、--socket=QUERY,以逗号分隔socket表转储的列表。要理解以下标识符:all、inet、tcp、udp、raw、unix、packet、netlink、unix_dgram、unix_stream、packet_raw、packet_dgram。

□ -D FILE、--diag=FILE,如果FILE用于stdout。不显示任何信息,在应用过滤器之后只转储有关TCP socket的raw信息到FILE。

□ -F FILE、--filter=FILE,如果FILE用于stdin。从FILE读取过滤器信息。FILE的每一行像单一命令行选项被解释。

FILTER := [state TCP-STATE] [EXPRESSION]

可查看官方文档了解有关过滤器的详细信息(Debian软件包是iproute-doc)。

下面是显示所有TCP socket的示例:

[root@zyg ~]# ss -t -a
State	Recv-Q	Send-Q	Local Address:Port	Peer Address:Port
LISTEN	0	128	:::56136	:::*
LISTEN	0	128	*:47018	*:*
LISTEN	0	10	*:EtherNet/IP-1	*:*
LISTEN	0	128	:::sunrpc	:::*
LISTEN	0	128	*:sunrpc	*:*
LISTEN	0	5	192.168.122.1:domain	*:*

显示所有UDP socket:

[root@zyg ~]# ss -u -a
State	Recv-Q	Send-Q	Local Address:Port	Peer Address:Port
UNCONN	0	0	*:mdns	*:*
UNCONN	0	0	*:879	*:*
UNCONN	0	0	*:sunrpc	*:*

显示已经建立的ssh连接:

[root@zyg ~]# ss -o state established sport = :22
Recv-Q	Send-Q	Local Address:Port	Peer Address:Port
0	184	219.168.2.38:22	106.120.178.3:42325	timer:(on,204ms,0)

列出源端口是22并且目标地址是106.120.178.5的已建立连接的tcp socket,或是目标地址是106.120.178.3的已建立连接的tcp socket:

[root@zyg ~]# ss -o state established '(sport = :9825 dst 106.120.178.5)' or dst
106.120.178.3
Recv-Q	Send-Q	Local Address:Port	Peer Address:Port
0	132	219.168.2.38:22	106.120.178.3:42325	timer:(on,278ms,0)

sar

sar命令用于收集、报告、保存系统活动信息。sar工具是sysstat软件包的一部分。

提示: 建议如果可以,在所有系统上运行sar。如果发生性能问题,在非常小的开销和无须额外开销情况下,手上可以拥有非常详细的信息。

要做到这一点不难,其实系统已经为我们准备好了自动化作业/etc/crontab/sysstat。请记住,在你的系统上安装sysstat之后自动设置每天运行sar的默认自动化作业。

使用cron开启自动化记录报告的示例:

[root@zyg ~]# cat /etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 -S DISK 1 1
# 0 * * * * root /usr/lib64/sa/sa1 -S DISK 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

sa1命令用来将二进制数据收集和存储到/var/log/sa/sadd文件,dd参数表示当前天的日期。

sa2命令将每日报告写入到/var/log/sa/sardd文件,dd参数表示当前天的日期。

例如/var/log/sa/sa05表示本月05日的系统活动报告。检查你的结果,选择每月工作日和所要求的性能数据。

sar命令可以通过-f选项指定该文件,提取之前保存在文件中的记录并写入到标准输出。

例如从/var/log/sa/sa06中提取磁盘信息:

[root@zyg ~]# sar -f/var/log/sa/sa06 -d

sar命令将系统中选定的累计活动计数器的内容写到标准输出。基于count和interval参数的值统计系统,在特定的interval(秒为单位)间隔写入信息指定次数。如果interval参数设置为0,sar命令将显示自系统启动以来的平均统计数据。如果指定了interval参数而没有count参数,报告将不断地产生。通过-o filename除了可以将收集到的数据显示在屏幕上,也可以将其保存到指定文件中。如果省略了文件名,sar将使用/var/log/sa/sadd文件存储每日系统标准活动数据。dd参数表示当前日期。默认情况下,来自内核的所有可用数据都将保存到数据文件中。

可以使用选项选择相关特定系统活动信息。不指定任何选项仅显示CPU活动。指定-A选项则可以选定所有可能的活动。

sar命令默认监控系统的主要资源(CPU使用率)。如果CPU使用率接近100%(user + nice + system),则采样到的工作负载是CPU绑定型的。

如果想得到多个样本和多份报告,则可以很方便地为sar命令指定一个输出文件。以后台进程的方式运行sar命令。语法是:

sar -o datafile interval count >/dev/null 2>&1 &

所有捕获的数据为二进制形式并被存储在文件(datafile)中。使用-f选项可以通过sar命令使数据有选择性地显示。设置interval和count参数,选择间隔interval秒记录count次。如果没有设置count参数,则文件中存储的所有记录将都被选中。这种收集数据的方式有助于描述一段时间内的系统使用并确定高峰使用时间。

注意: 通过sar命令得到的值是报告的本地活动。

通过不同的选项,sar命令可以捕获广泛的系统信息,如:

□ -B,报告分页统计数据,显示下面的值:

[root@zyg ~]# sar -B 1 2
Linux 2.6.32-71.el6.x86_64 (zyg.power.com) 10/14/14 _x86_64_ (16 CPU)
17:02:32	pgpgin/s	pgpgout/s	fault/s	majflt/s	pgfree/s	pgscank/s	pgscand/s	pgsteal/s	%vmeff
17:02:33	0.00	12.24	36.73	0.00	113.27	0.00	0.00	0.00	0.00
17:02:34	0.00	0.00	42.00	0.00	108.00	0.00	0.00	0.00	0.00
Average:	0.00	6.06	39.39	0.00	110.61	0.00	0.00	0.00	0.00

□ pgpgin/s,每秒系统从磁盘置入分页的总量(KB)。

□ pgpgout/s,每秒系统移出分页到磁盘的总量(KB)。

□ fault/s,每秒系统产生分页错误(主要(major)+次要(minor))的数量。这不是生成I/O的分页错误的计数,因为没有I/O也可以解析一些分页错误。
• majflt/s,每秒系统产生主要错误的数量,需要从磁盘加载一个内存分页。
• pgfree/s,每秒系统放置在空闲列表上的分页数量。
• pgscank/s,每秒kswapd守护进程扫描的分页数量。
• pgscand/s,每秒直接扫描的分页数量。
• pgsteal/s,每秒系统从缓存回收的分页数量,以满足内存需求。
• %vmeff,pgsteal/pgscan计算,这是分页回收效率的一个度量。如果接近100%那么几乎每个分页都可以在inactive列表的底部获得。如果它变得太低(例如,小于20%),那么虚拟内存有一些问题。如果在interval时间内没有分页被扫描,则此字段为0。

□ -b,报告I/O和传输速率的统计数据,显示下面的值:

[root@zyg ~]# sar -b 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/14/14   _x86_64_ (16 CPU)
17:03:47	tps	rtps	wtps	bread/s	bwrtn/s
17:03:48	7.07	0.00	7.07	0.00	56.57
17:03:49	0.00	0.00	0.00	0.00	0.00
17:03:50	13.11	0.00	13.11	0.00	5436.07
17:03:51	0.00	0.00	0.00	0.00	0.00
17:03:52	0.00	0.00	0.00	0.00	0.00
17:03:53	3.19	0.00	3.19	0.00	25.53
17:03:54	0.00	0.00	0.00	0.00	0.00
17:03:55	7.00	0.00	7.00	0.00	1704.00
17:03:56	8.08	0.00	8.08	0.00	64.65
17:03:57	0.00	0.00	0.00	0.00	0.00
17:03:58	2.68	0.00	2.68	0.00	21.43
17:03:59	0.00	0.00	0.00	0.00	0.00
17:04:00	55.00	0.00	55.00	0.00	26232.00
17:04:01	12.12	0.00	12.12	0.00	96.97

• tps,每秒发出到物理设备的传输总数。一个传输就是到物理设备的一个I/O请求。发送到设备的多个逻辑请求可以合并成单个I/O请求。传输是大小不确定的。
• rtps,每秒发出到物理设备的读请求总数。
• wtps,每秒发出到物理设备的写请求总数。
• bread/s,每秒从设备读取数据的总量,以块为单位。块相当于扇区,因此具有512字节的大小。
• bwrtn/s,每秒写入到设备的数据总量,以块为单位。

□ -d。报告每个块设备的活动。当显示数据的时候,通常使用的设备规范是dev m-n(在DEV列)。m是设备的主设备号,n是它的次设备号。如果使用-p选项,则设备的名字也可以漂亮地显示;如果使用-j选项则可以显示持久的设备名称。注意,磁盘活动依赖于sadc的-S DISK和-S XDISK选项来收集。显示下面的值:

[root@zyg ~]# sar -d 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com) 10/14/14 _x86_64_ (16 CPU)
17:04:57	DEV	tps	rd_sec/s	wr_sec/s	avgrq-sz	avgqu-sz	await	svctm	%util
17:04:58	dev8-0	7.00	0.00	56.00	8.00	0.00	0.00	0.00	0.00
17:04:58	dev8-16	0.00	0.00	0.00	0.00	0.00	0.00	0.00	0.00

• tps,指出每秒发出到设备的传输量。发送到设备的多个逻辑请求可以合并成单个I/O请求,传输是大小不确定的。
• rd_sec/s,从设备读取的扇区数量。扇区的大小为512字节。
• wr_sec/s,写入到设备的扇区数量。扇区的大小为512字节。
• avgrq-sz,发出到设备的请求的平均大小(以扇区为单位)。
• avgqu-sz,发出到设备的请求的平均队列长度。
• await,发出到设备的I/O请求到被服务的平均时间(以毫秒为单位)。这包括请求在队列中花费的时间和服务请求花费的时间。
• svctm,发出到设备的I/O请求的平均服务时间(以毫秒为单位)。
• %util,在I/O请求发出到设备期间CPU时间的百分比(设备的带宽使用率)。当这个值接近100%的时候设备饱和。

□ -I {int [,...] | SUM | ALL | XALL},报告一个特定中断的统计数据。注意,中断统计数据的收集依赖于sadc“-S INT”选项,如:

[root@zyg ~]# sar -I SUM 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/14/14  _x86_64_ (16 CPU)
17:07:05	INTR	intr/s
17:07:06	sum	1292.00
17:07:07	sum	1424.00

• Int,中断号。在命令行上指定多个-I int参数将被认为是多个独立的中断。
• SUM,表示显示每秒接收到的中断总数。
• ALL,表示统计数据来自报告的前16个中断。
• XALL,表示统计数据来自所有中断,包括潜在的APIC中断源都会被报告。

□ -m {keyword [,...] | ALL},报告电源管理统计信息。注意,统计数据的收集依赖于sadc -S POWER选项。可能的keyword有CPU、FAN、FREQ、IN、TEMP、USB等:

[root@zyg ~]# sar -m 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/14/14   _x86_64_ (16 CPU)
17:08:10	CPU	MHz
17:08:11	all	2393.96
17:08:12	all	2393.96

• CPU,报告有关CPU的统计数据。显示下面的值:
○ MHz,瞬时的CPU时钟频率,以MHz为单位。
• FAN,报告有关风扇速度的统计数据。显示下面的值:
○ rpm,风扇速度,以每分钟转数为单位。

○ drpm,这个字段用来计算当前风扇数(rpm)与下限(fan_min)之间的差异。

○ DEVICE,传感器设备名称。

• FREQ,报告CPU时钟频率的统计数据。显示下面的值:

○ wghMHz,CPU时钟频率的加权平均值,以MHz为单位。注意,必须将cpufreq-stats驱动程序编译到内存中此选项才能工作。

• IN,报告有关电压输入的统计数据。显示下面的值:

○ inV,电压输入表示为伏特。

○ %in,相对的输入值。100%意味着输入电压达到上限(in_max),0%意味着达到下限(in_min)。

○ DEVICE,传感器设备名称。

• TEMP,报告有关设备温度的统计数据。显示下面的值:

○ degC,degC使用摄氏度表示设备的温度。

○ %temp,相对的设备温度。100%意味着温度已达到上限(temp_max)。

○ DEVICE,传感器设备名称。

• USB,sar命令生成当前插入系统所有USB的快照。在报告的末尾,sar将显示所有这些USB设备的汇总信息。显示下面的值:

○ BUS,根集线器USB设备的数量。

○ Idvendor,供应商ID号(通过USB组织分配)。

○ Idprod,产品ID号码(由制造商分配)。

○ Maxpower,设备的最大功耗(以mA为单位)。

○ Manufact,制造商名称。

○ Product,产品名称。

□ -n {keyword [,...] | ALL},报告网络统计数据。可能的keyword值有DEV、EDEV、NFS、NFSD、SOCK、IP、EIP、ICMP、EICMP、TCP、ETCP、UDP、SOCK6、IP6、EIP6、ICMP6、EICMP6、UDP6等。

• DEV,报告网络设备的统计数据。显示下面的值:

[root@zyg ~]# sar -n DEV 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com) 10/14/14  _x86_64_ (16 CPU)
22:04:58	IFACE	rxpck/s	txpck/s	rxkB/s	txkB/s	rxcmp/s	txcmp/s	rxmcst/s
22:04:59	lo	0.00	0.00	0.00	0.00	0.00	0.00	0.00
22:04:59	eth0	1902.27	2.27	1793.89	0.33	0.00	0.00	0.00

○ IFACE,报告统计报告的网络接口名称。

○ rxpck/s,每秒接收数据包的总数。

○ txpck/s,每秒传输的数据包总数。

○ rxkB/s,每秒接收的总数,单位为KB。

○ txkB/s,每秒传输的总数,单位为KB。

○ rxcmp/s,每秒接收的压缩数据包的数量。

○ txcmp/s,每秒传输的压缩数据包的数量。

○ rxmcst/s,每秒接收的多播数据包的数量。

• EDEV,报告来自网络设备的故障统计数据。显示下面的值:

○ IFACE,报告统计数据的网络接口名称。

○ rxerr/s,每秒接收坏数据包的数量。

○ txerr/s,当传输数据包时每秒发生错误的总数。

○ coll/s,当传输数据包时每秒发生冲突的数量。

○ rxdrop/s,因为Linux缓冲区空间不足,每秒丢弃接收数据包的数量。

○ txdrop/s,因为Linux缓冲区空间不足,每秒丢弃传输数据包的数量。

○ txcarr/s,当传输数据包时每秒发生载波错误的数量。

○ rxfram/s,每秒在接收数据包上发生帧同步错误的数量。

○ rxfifo/s,每秒在接收数据包上发生FIFO溢出错误的数量。

○ txfifo/s,每秒在传输数据包上发生FIFO溢出错误的数量。

• NFS,报告有关NFS客户端活动的统计数据。显示下面的值:

○ call/s,每秒产生RPC请求的数量。

○ retrans/s,每秒需要重传的RPC请求的数量(例如,因为服务器超时)。

○ read/s,每秒产生‘read’RPC调用的数量。

○ write/s,每秒产生‘write’RPC调用的数量。

○ access/s,每秒产生‘access’RPC调用的数量。

○ getatt/s,每秒产生‘getattr’RPC调用的数量。

• NFSD,报告有关NFS服务器活动的统计数据。显示下面的值:

○ scall/s,每秒接收RPC请求的数量。

○ badcall/s,每秒接收错误RPC请求的数量。

○ packet/s,每秒接收网络数据包的数量。

○ udp/s,每秒接收UDP数据包的数量。

○ tcp/s,每秒接收TCP数据包的数量。

○ hit/s,每秒回复缓存命中的数量。

○ miss/s,每秒回复缓存未命中的数量。

○ sread/s,每秒接收‘read’RPC调用的数量。

○ swrite/s,每秒接收‘write’RPC调用的数量。

○ saccess/s,每秒接收‘access’RPC调用的数量。

○ sgetatt/s,每秒接收‘getattr’RPC调用的数量。

• SOCK,报告使用中的socket统计数据(IPv4)。显示下面的值:

○ Totsck,系统使用的socket总数。

○ Tcpsck,当前使用中的TCP socket数量。

○ Udpsck,当前使用中的UDP socket数量。

○ Rawsck,当前使用中的RAW socket数量。

○ ip-frag,当前在队列中IP分片的数量。

○ tcp-tw,处于TIME_WAIT状态的TCP socket的数量。

• IP,报告有关IPv4网络流量的统计数据。注意,IPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值(方括号中的是正式SNMP名称):

○ irec/s,每秒从接口接收到的输入数据报的总数,包括错误接收[ipInReceives]。

○ fwddgm/s,每秒输入数据报的数量,这并不是它们最终的IP目的地,其结果是试图找到一个路由转发它们到最终的目的地[ipForwDatagrams]。

○ idel/s,每秒成功传递到IP用户协议的输入数据报的总数(包括ICMP)[ipInDelivers]。

○ orq/s,每秒提供的本地IP用户协议(包括ICMP)到传输请求IP[ipOutRequests]的IP数据报总数。注意,这个计数器不包含fwddgm/s计算的任何数据报。

○ asmrq/s,每秒接收的需要重组实体的IP分片数量[ipReasmReqds]。

○ asmok/s,每秒成功重组实体的IP数据报数量[ipReasmOKs]。

○ fragok/s,每秒对实体已经成功分片的IP数据报数量[ipFragOKs]。

○ fragcrt/s,每秒生成的IP数据报分片的数量,作为实体分片的一个结果[ipFragCreates]。

• EIP,报告有关IPv4网络错误的统计数据。注意,IPv4统计数据依赖于sadc“-S SNMP”选项的收集。显示下面的值(方括号中的是正式SNMP名称):

○ ihdrerr/s,由于IP报头错误,每秒丢弃输入数据报的数量,包括错误的checksum、版本号不匹配、其他格式错误、超过了生存时间、在处理它的IP选项时发现错误,等等[ipInHdrErrors]。

○ iadrerr/s,每秒丢弃输入数据报的数量,因为这个实体接收的IP报头目标地址字段的IP地址不是一个有效的地址。这个计数包含无效的地址(例如0.0.0.0)和不支持的地址类(例如,E类)。如果实体不是IP路由器而且不转发数据报,则这个计数器包括因为目标地址不是本地地址丢弃的数据报[ipInAddrErrors]。

○ iukwnpr/s,因为未知或不支持的协议每秒成功接收但是被丢弃的本地地址的数据报数量。

○ idisc/s,每秒输入IP数据报的数量。没有遇到阻止它继续被处理的问题,但是被丢弃(例如,缓冲区空间不足)[ipInDiscards]。注意,这个计数器不包括在等待重组时丢弃的任何数据包。

○ odisc/s,每秒输出IP数据报的数量,它们没有遇到阻止它们传输到它们目的地的问题,但是被丢弃(例如,缓冲区空间不足)[ipOutDiscards]。注意,这个计数器包含在fwddgm/s中。

○ onort/s,每秒丢弃IP数据报的数量,因为没有发现传输它们到它们的目的地的路由[ipOutNoRoutes]。注意,这个计数器包含在fwddgm/s中遇到的‘no-route’标准计算的任何数据报。注意,这包含了因为所有的默认路由下线,主机不能路由的任何数据报。

○ asmf/s,通过IP重组算法每秒检测到的故障数量(无论任何原因,超时、错误,等等)[ipReasmFails]。注意,这并不一定是被丢弃的IP分片的计数,因为一些算法在接收它们时由于合并它们可能会丢失分片的数量。

○ fragf/s,每秒丢弃IP数据报的数量,因为实体需要分片但是不能完成,例如,因为设置了它的Don’t Fragment标志[ipFragFails]。

• ICMP,报告有关ICMPv4网络流量的统计数据。注意,ICMPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值:

○ imsg/s,实体每秒接收ICMP消息的总数[icmpInMsgs]。注意,这个计数器包括所有由ierr/s计算得来的数据。

○ omsg/s,实体每秒尝试发送ICMP消息的总数[icmpOutMsgs]。注意,这个计数器包括所有由oerr/s计算得来的数据。

○ iech/s,每秒接收ICMP Echo(request)消息的数量[icmpInEchos]。

○ iechr/s,每秒接收ICMP Echo Reply消息的数量[icmpInEchoReps]。

○ oech/s,每秒发送ICMP Echo(request)消息的数量[icmpOutEchos]。

○ oechr/s,每秒发送ICMP Echo Reply消息的数量[icmpOutEchoReps]。

○ itm/s,每秒接收ICMP Timestamp(request)消息的数量[icmpInTimestamps]。

○ itmr/s,每秒接收ICMP Timestamp Reply消息的数量[icmpInTimestampReps]。

○ otm/s,每秒发送ICMP Timestamp(request)消息的数量[icmpOutTimestamps]。

○ otmr/s,每秒发送ICMP Timestamp Reply消息的数量[icmpOutTimestampReps]。

○ iadrmk/s,每秒接收ICMP Address Mask Request消息的数量[icmpInAddrMasks]。

○ iadrmkr/s,每秒接收ICMP Address Mask Reply消息的数量[icmpInAddrMaskReps]。

○ oadrmk/s,每秒发送ICMP Address Mask Request消息的数量[icmpOutAddrMasks]。

• EICMP,报告有关ICMPv4错误消息的统计数据。注意,ICMPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值(方括号中的是正式SNMP名称):

○ ierr/s,实体每秒接收的被确定为特定ICMP错误的ICMP消息数量(错误ICMP校验和、错误长度,等等)[icmpInErrors]。

○ oerr/s,实体每秒由于ICMP内发现错误而没有发送(比如缓冲区不足)的ICMP消息的数量[icmpOutErrors]。

○ idstunr/s,每秒接收的ICMP目的地不可达的数量[icmpInDestUnreachs]。

○ odstunr/s,每秒发送的ICMP目的地不可达的数量[icmpOutDestUnreachs]。

○ itmex/s,每秒接收的ICMP超时消息的数量[icmpInTimeExcds]。

○ otmex/s,每秒发送的ICMP超时消息的数量[icmpOutTimeExcds]。

○ iparmpb/s,每秒接收的ICMP参数错误消息的数量[icmpInParmProbs]。

○ oparmpb/s,每秒发送的ICMP参数错误消息的数量[icmpOutParmProbs]。

○ isrcq/s,每秒接收的ICMP源抑制消息的数量[icmpInSrcQuenchs]。

○ osrcq/s,每秒发送的ICMP源抑制消息的数量[icmpOutSrcQuenchs]。

○ iredir/s,每秒接收的ICMP重定向消息的数量[icmpInRedirects]。

○ oredir/s,每秒发送的ICMP重定向消息的数量[icmpOutRedirects]。

• TCP,报告有关TCPv4网络流量的统计数据。注意,TCPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值(方括号中的是正式SNMP名称):

○ active/s,每秒TCP连接从CLOSED状态直接转换到SYN-SENT状态的次数[tcpActiveOpens]。

○ passive/s,每秒TCP连接从LISTEN状态直接转换到SYN-RCVD状态的次数[tcpPassiveOpens]。

○ iseg/s,每秒接收分段的总数,包括错误的接收[tcpInSegs]。这个计数包括在当前已经建立连接上接收的分段。

○ oseg/s,每秒发送分段的总数,包括当前连接但不包括只包含重发的字节[tcpOutSegs]。

• ETCP,报告TCPv4网络错误的统计数据。注意,TCPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值(方括号中的是正式SNMP名称):

○ atmptf/s,每秒TCP连接从SYN-SENT状态或SYN-RCVD状态直接转换到CLOSED状态的次数,加上每秒TCP连接从SYN-RCVD状态直接转换到LISTEN状态的次数[tcpAttemptFails]。

○ estres/s,每秒TCP连接从ESTABLISHED状态或CLOSE-WAIT状态直接转换到CLOSED状态的次数[tcpEstabResets]。

○ retrans/s,每秒重发的分段总数,即传输TCP分段包含了一个或多个之前发送的字节[tcpRetransSegs]。

○ isegerr/s,每秒接收错误分段(例如,错误的TCP校验和)的总数[tcpInErrs]。

○ orsts/s,每秒发送的包含RST标志的TCP分段数量[tcpOutRsts]。

• UDP,报告有关UDPv4网络流量的统计数据。注意,UCPv4统计数据的收集依赖于sadc“-S SNMP”选项。显示下面的值(方括号中的是正式SNMP名称):

○ idgm/s,每秒转发到UDP用户的UDP数据报文的总数[udpInDatagrams]。

○ odgm/s,每秒实体发送的UPD数据报文的总数[udpOutDatagrams]。

○ noport/s,每秒接收的UDP数据报文的总数,但是目标地址属于任何应用程序[udpNoPorts]。

○ idgmerr/s,每秒接收的不能转发的UDP数据报文的数量,原因是缺少应用程序的目标端口[udpInErrors]。

□ -q,报告队列长度和平均负载,显示下面的值:

[root@zyg ~]# sar -q 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/14/14   _x86_64_ (16 CPU)
22:06:21	runq-sz	plist-sz	ldavg-1	ldavg-5	ldavg-15
22:06:22	0	471	0.05	0.08	0.05
22:06:23	0	471	0.05	0.08	0.05

• runq-sz,运行队列的长度(等待运行时间的任务的数量)。

• plist-sz,在任务列表中任务的数量。

• ldavg-1,最后一分钟的系统平均负载。平均负载的计算是在指定时间间隔,运行或可运行(R状态)任务的平均数量和不可中断睡眠状态(D状态)中任务的数量。

• ldavg-5,过去5分钟之内系统平均负载。

• ldavg-15,过去15分钟之内系统平均负载。

□ -R,报告内存统计数据。显示下面的值:

[root@zyg ~]# sar -R 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/14/14   _x86_64_ (16 CPU)
22:07:15	frmpg/s	bufpg/s	campg/s
22:07:16	-320.41	0.00	207.14
22:07:17	-596.97	0.00	628.28

• frmpg/s,每秒系统释放内存分页的数量。负值表示系统分配分页的数量。注意,根据机器的架构分页的大小有4KB或8KB。

• bufpg/s,每秒系统使用额外内存作为缓冲区的数量。负值意味着系统使用较少的分页作为缓冲区。

numastat

numastat为进程和操作系统显示每个NUMA(Non-Uniform Memory Architecture)节点的内存统计信息。

NUMA架构在企业级数据中心已经成为主流。然而,在对NUMA系统进行性能调优过程中出现了新的挑战。比如直到NUMA系统出现之前对于内存的位置我们不感兴趣。幸运的是,企业级Linux发行版提供一个工具来监控NUMA架构的行为。numastat命令提供关于本地对比远程内存使用比例和所有节点的整体内存配置。在numa_miss列中显示本地内存分配失败情况,在numa_foreign列中显示远程内存的分配(较慢的内存)情况,这是你应该进行调查的。远程内存的分配将增加系统延迟且可能会降低整体性能。将进程绑定到一个节点,在本地RAM中进行内存映射,将最有可能提高性能。

TODO.

pmap

pmap命令用来报告一个进程或多个进程的内存映射。可以使用这个工具确定系统是如何为服务器上的进程分配内存的。有关更详细的信息,使用pmap -d选项,如:

[root@zyg ~]# pmap -d 22718
22718: cat
Address	Kbytes	Mode	Offset	Device	Mapping
0000000000400000	44	r-x--	0000000000000000	008:00006	cat
000000000060b000	4	rw---	000000000000b000	008:00006	cat
000000000060c000	4	rw---	0000000000000000	000:00000	[anon]
0000000000d9f000	132	rw---	0000000000000000

TODO.

iptraf

iptraf(Red Hat Enterprise Linux 7是iptraf-ng)是一个基于ncurses的IP局域网监控程序,它可以生成各种网络统计数据,包括TCP信息、UDP计数、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验和错误,等等。iptraf工具是由iptraf软件包提供的。如图2-11所示为运行iptraf命令时没有任何命令行选项的情况,程序以交互模式启动,通过主菜单访问各种设备。

TODO.

tcpdump和wireshark

tcpdump和wireshark是用来捕捉和分析网络流量的两个工具。在Linux下使用libpcap库可以捕捉数据包。它们在一个网络适配器上通过混杂模式监控所有的流量,并且捕捉此适配器接收到的所有数据帧,这些命令应该由超级用户的特权执行,使接口处于混杂模式。

可以使用这些工具深入研究网络相关的问题。可以找到TCP/IP重传、窗口大小缩放,名称解析问题、网络配置错误,等等。记住,这些工具只可以监控网络适配器接收到的数据帧,而不是整个网络流量。

TODO.

strace和 ltrace

1.strace
strace用来跟踪系统调用和信号。strace是一个很有用的诊断、指导和调试的工具。系统管理员可以很方便地使用它来诊断和解决程序出现的问题,因为可以在不需要重新编译的情况下来跟踪它们。最简单的情况就是使用strace运行指定的命令,直到命令结束。它拦截并记录进程执行的系统调用和进程接收的信号。每个系统调用的名称、参数和返回值都将被显示在标准错误输出中或可以通过-o选项指定到文件。

TODO.

gnuplot

gnuplot是一个可移植的命令行绘图工具,其可以工作在Linux、OS/2、MS Windows、OSX、VMS和许多其他平台上,支持交互模式,也支持脚本。其源代码是有版权的,但是可以自由地发布。它最初被创建是为了让科学家和学生可以交互式地生成可视化数学函数和数据,gnuplot支持许多不同类型的二维平面和三维立体图形。自1986年由Colin Kelley和Thomas Williams开发以来,gnuplot一直都在被提供支持并积极发展。

访问 http://www.gnuplot.vt.edu/screenshots/index.html#demos 可以看到如图2-33所示的很多gnuplot的演示图,从中你也许可以找到制图的灵感。

gnuplot功能强大,这里只介绍如何使用gnuplot将监控工具(比如sar)所收集的数据绘制成图形,以满足我们日常工作的需要。如果大家想了解更多gnupolt的使用详情,请在 http://www.gnuplot.info 下载最新的文档。

简单来说,gnuplot在绘制平面图时,实际上是通过坐标点来描绘的,其通过某种方式将坐标点连接在一起就绘制出了我们想要的平面图。而坐标点是通过不同轴上的数据交汇在一起组成的。那数据从何而来呢?回想一下我们在前面介绍的监控工具mpstat、vmstat、iostat、sar,等等。下面我们以sar为例来介绍:

[root@zyg ~]# sar -u 1
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/15/14  _x86_64_ (16 CPU)
10:11:11	CPU	%user	%nice	%system	%iowait	%steal	%idle
10:11:12	all	10.37	0.00	29.14	0.00	0.00	60.49
10:11:13	all	9.24	0.00	26.25	0.00	0.00	64.50
10:11:14	all	6.98	0.00	21.09	0.00	0.00	71.93

这里我们可以发现sar命令在运行的时候,CPU的各项数据是随时间变化而变化的。假设,我们将时间设置为平面图的x轴,%user对应时间的数值设置在y轴,那么我们想要的坐标点不就出来了么,再通过某种方式将这些坐标点连接在一起,不就可以得到随时间变化的CPU各项性能指标了吗?

注意: sar还给我们创造了非常便利的条件,就是sar在安装之后所提供的自动化任务(参见2.3.9节),可以在系统运行时自动收集数据。使用下面的命令可以直接从中提取我们想要的数据:

[root@zyg ~]# ls /var/log/sa
sa07 sa09 sa11 sa13 sa15 sar08 sar10 sar12 sar14
sa08 sa10 sa12 sa14 sar07 sar09 sar11 sar13
[root@zyg ~]# sar -f /var/log/sa/sa09
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/09/14  _x86_64_ (16 CPU)
00:00:01	CPU	%user	%nice	%system	%iowait	%steal	%idle
00:10:01	all	0.06	0.00	0.16	0.01	0.00	99.76
00:20:01	all	0.05	0.00	0.11	0.00	0.00	99.83
00:30:01	all	0.05	0.00	0.11	0.00	0.00	99.84

安装

安装gnuplot可执行如下命令:

sudo apt install gnuplot

安装好gnuplot之后,我们可以通过两种方法操作gnuplot。

一种方法是使用gnuplot的交互模式:

[root@zyg ~]# gnuplot
    G N U P L O T
    Version 4.2 patchlevel 6
    last modified Sep 2009
    System: Linux 2.6.32-431.el6.x86_64
    Copyright (C) 1986 - 1993, 1998, 2004, 2007 - 2009
    Thomas Williams, Colin Kelley and many others
    Type `help` to access the on-line reference manual.
    The gnuplot FAQ is available from http://www.gnuplot.info/faq/
    Send bug reports and suggestions to <http://sourceforge.net/projects/gnuplot>
Terminal type set to 'x11'
gnuplot>

第二种方法是将gnuplot的指令写入到一个文件中,然后使用gnuplot执行该文件,这种方法是笔者个人比较推荐的方式,因为这样方便调试与修改。在下面的示例中采用的都是此方法。

接下来我们介绍工作中最常用到的3个示例。

示例一:线型趋势图。这种平面图能够让我们最直观地看到数据的走势。这里以sar收集到的CPU数据为例:

[root@zyg ~]# LANG=C sar -f /var/log/sa/sa10
Linux 2.6.32-71.el6.x86_64 (zyg.power.com)  10/10/14  _x86_64_ (16 CPU)
00:00:01	CPU	%user	%nice	%system	%iowait	%steal	%idle
00:10:01	all	0.07	0.00	0.16	0.01	0.00	99.77
00:20:01	all	0.05	0.00	0.11	0.00	0.00	99.83
00:30:01	all	0.05	0.00	0.12	0.00	0.00	99.82

sar文件中的数据我们并不能直接使用,需要对文件内容进行格式化。首先要将文件中的时间转换为24小时制。因为12小时制在绘图时有可能会出现问题,例如,我们使用上午08:00到下午18:00之间的数据,有可能会出现08:00在18:00之后,因为12小时制18:00为06:00。在sar命令前添加LANG=C使sar命令输出的时间为24小时制。

使用输出重定向将sar命令输出保存到文件中:

[root@zyg ~]# LANG=C sar -f /var/log/sa/sa10 > /tmp/cpu.txt

之后对/tmp/cpu.txt进行再次格式化将文件中的空行和与数据无关的字符行删除:

[root@zyg ~]# cat /tmp/cpu.txt
00:10:01	all	0.07	0.00	0.16	0.01	0.00	99.77
00:20:01	all	0.05	0.00	0.11	0.00	0.00	99.83
00:30:01	all	0.05	0.00	0.12	0.00	0.00	99.82
00:40:01	all	0.05	0.00	0.11	0.00	0.00	99.85

在此数据文件中,第一列的时间选作x轴,y轴选择了第三列(%user)、第五列(%system)、第六列(%iowait)。我们的平面图中要显示%user、%system、%iowait的变化趋势。

对数据文件格式化好之后,在/tmp下编写一个gnuplot的指令文件cpu.gnuplot。内容如下:

set xdata time	#设置x轴数据为时间
set timefmt "%H:%M:%S"	#设置时间格式为"小时:分钟:秒"
set xlabel 'TIME'	#设置x轴标签为'TIME'
set ylabel 'CPU'	#设置y轴标签为'CPU'
set termimal png size 800,600	#设置终端格式为png大小800x600
set output "/tmp/cpu.png"	#设置平面图保存位置
plot '/tmp/cpu.txt' using 1:3 title '%us' with lines , /tmp/cpu.txt' using 1:5 title '%sy' with lines, /tmp/cpu.txt'
using 1:6 title '%wa' with lines

#使用/tmp/cpu.txt中的第一列和第三列绘制坐标点并在绘制之后用线将点连接起来,指定此线的标题为“%us”。此后使用第一列和第五列绘制“%sy”,使用第一列和第六列绘制“%wa”。

编辑好指令文件之后,使用gnuplot命令来执行此文件:

[root@zyg ~]# gnuplot /tmp/cpu.gunplot

执行之后我们在/tmp目录下得到图2-34所示的平面图cpu.png。

接下来还可以对平面图进行一些优化调整,当然这不一定是必需的,看个人喜好。编辑/tmp/gnuplot文件添加下面内容:

set xdata time
set timefmt "%H:%M:%S"
set xlabel 'TIME'
set ylabel 'CPU'
set yrange [0:30]	# 设置y轴范围为0到30
set ytics 5	# 设置y轴刻度间隔为5
set xrange ["08:00:00":"18:00:00"]	# 设置x轴范围为上午8点到下午18点
set xtics "01:00:00"	# 设置x轴刻度间隔为1小时
set termimal png size 800,600
set output "/tmp/cpu.png"
plot '/tmp/cpu.txt' using 1:3 title '%us' with lines , /tmp/cpu.txt' using 1:5 title '%sy' with lines, /tmp/cpu.txt' using 1:6 title '%wa' with lines

执行此指令文件后,得到如图2-35所示的图形。

如果有需要,你还可以对gnuplot描绘出的曲线做出不同的设定:

□ 线型(linetype)。 在此类型中主要设置线条的颜色,具体对应表2-2。

□ 点型(pointtype)。 此类型用于设置点的形状,可分为14种,具体对应表2-3。

□ 线条宽度(linewidth)、点大小(pointsize)。 两者都可以设置为整数或小数。

□ 样式(style)。 gnuplot从数据文件中得到坐标值,然后以样式绘制。

□ Lines。 将相邻的点以线连接。

□ points。 将每一个点使用符号描绘。

□ linespoints。 同时具有lines和points的功能。

接下来我们对之前的曲线分别作不同的修改:

set xdata time
set timefmt "%H:%M:%S"
set xlabel 'TIME'
set ylabel 'CPU'
set yrange [0:30]
set ytics 5
set xrange ["08:00:00":"18:00:00"]
set xtics "01:00:00"
set termimal png size 800,600
set output "/tmp/cpu.png"
plot '/tmp/cpu.txt' using 1:3 title '%us' with lines lt 3 lw 2

 ,/tmp/cpu.txt' using 1:5 title '%sy' with ponits pt 1 ps 1.5
, /tmp/cpu.txt' using 1:6 title '%wa' with linespoints lt 1 lw 2 pt 2 ps 1.5


'/tmp/cpu.txt' using 1:3 title '%us' with lines lt 3 lw 2

坐标点使用线进行连接,线色为蓝色,线宽为2:

'/tmp/cpu.txt' using 1:5 title '%sy' with ponits pt 1 ps 1.5

坐标点使用+来表示,点大小为1.5:

'/tmp/cpu.txt' using 1:6 title '%wa' with linespoints lt 1 lw 2 pt 2 ps 1.5

坐标点使用线点来表示,线红色,线宽为2,点用×表示,点大小为1.5。

示例二:柱状趋势图

TODO.

示例三:多柱状趋势图

TODO.

其他

参考链接:https://blog.csdn.net/weixin_42014622/article/details/82962634

Gnome System Monitor

TODO.

KDE System Guard

TODO.

Benchmark工具

TODO.

分析性能瓶颈

识别系统瓶颈

下面的步骤可用来实现快速调整策略:
①了解你的系统。

②备份系统。

③监控和分析系统的性能。

④缩小瓶颈,并找到它的原因。

⑤通过尝试一次一个更改,找到发生瓶颈的原因。

⑥回到步骤3,直到系统的性能让你满意。

提示: 你应该记录每一步,尤其是你所做过的影响性能的改变。

什么是性能指标?

这里一定会想到“高并发”和“响应快”,这里词正对应的就是“吞吐”和“延时”。我们知道随着应用负载的体系,系统资源的使用就会提高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求处理还是不够快,无法支撑更多的请求。

性能分析就是找到应用或系统的瓶颈,并设法去避免或者缓解它们,从而高效的利用系统资源来处理更多的请求。这里包含六部:

  • 选择指标评估应用程序和系统的性能;
  • 为应用程序和系统设置性能目标;
  • 进行性能基准测试;
  • 性能分析定位瓶颈;
  • 优化系统和应用程序;
  • 性能监控和告警;

性能工具

Linux性能工具图谱

更多性能工具图谱,请参考这里

posted @ 2020-05-12 06:50  多弗朗强哥  阅读(934)  评论(0编辑  收藏  举报