Linux sar收集、报告或保存系统活动信息

sar命令可以从文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等方面进行报告。
sar命令是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。

yum -y install sysstat

sysstat工具与负载历史回放

很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来自sysstat工具包,可以记录系统的CPU负载、I/O状况和内存使用记录,便于历史数据的回放。
  Ubuntu系统上,sysstat的配置文件在/etc/default/sysstat,sysstat默认关闭,通过将该文件中的ENABLED改为"true"启用;历史日志的存放位置为/var/log/sysstat
  Red Hat系统上,sysstat的配置文件在/etc/sysconfig/sysstat文件,历史日志的存放位置为/var/log/sa
  两种系统上,统计信息都是每10分钟记录一次,每天的23:59会分割统计文件,这些操作的频率都在/etc/cron.d/sysstat文件配置。
sar命令查看CPU、内存和磁盘记录
  默认情况下,sar命令显示当天的统计信息,不带参数显示CPU统计信息,参数-r显示收集的内存记录,-b显示磁盘I/O

语法

sar(选项)(参数)

sar [options] [-A] [-o file] [ <interval> [ <count> ] ]

其中:
options 为命令行选项,t为采样间隔,n为采样次数,默认值是1; -o file表示将命令结果以二进制格式存放在文件中,file 是文件名。

选项

-A: 显示所有的报告信息;
-b: 显示I/O速率;
-B: 报告分页统计信息
-c: 显示进程创建活动;
-d: 显示每个块设备的状态;
-e: 设置显示报告的结束时间;
-f: 从指定文件提取报告;
-i: 设状态信息刷新的间隔时间;
-n: 报告网络统计信息。
-P: 报告指定CPU的每个处理器统计信息。指定ALL关键字报告每个单独处CPU的统计数据,以及全局所有处理器的统计数据。注意,处理器0是第一个处理器。
-R: 显示内存状态;
-u: 显示CPU利用率;
-v: 显示索引节点,文件和其他内核表的状态;
-w: 显示交换分区状态;
-x: 显示给定进程的状态。
-r: 输出内存利用率和交换空间的统计信息
-o: 输出选项,指定要显示的列。例如,`-o mrk,prt,cvg` 将显示 CPU 使用率、进程标识符、磁盘使用率 和 网络流量。  
-t: 时间戳选项当从每日数据文件中读取数据时,指示sar应该显示数据文件中心的原始本地时间的时间戳。如果没有这个选项,sar命令将以用户的地区时间显示
-s: 统计选项,指定要显示的统计数据的类型。例如,`-s us,ms` 将显示 CPU 使用率的 us 和 ms 时间段的平均值。  
-c: 选项用于指定要发送的命令。例如,`-c ls` 将显示当前目录中的文件和子目录列表。
-y: 终端设备活动情况
-q: 报告队列长度和平均负载

参数

间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。

参考示例

1、CPU资源监控

[root@zabbix ~]# sar -u -o test_sar 5 3						每5s采样一次,连续采样3次,观察cpu使用情况,并将采样结果以二进制形式存入test_sar中(查看二进制文件test中的内容,sar命令:sar -u -f test_sar) 

CPU			all表示统计信息为所有 CPU的平均值。
%user		显示在用户级别(application)运行使用 CPU总时间的百分比。
%nice		显示在用户级别,用于nice操作,所占用 CPU总时间的百分比。
%system		在核心级别(kernel)运行所使用 CPU总时间的百分比。
%iowait		显示用于等待I/O操作占用 CPU总时间的百分比。
%steal		管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU 的百分比。
%idle		显示 CPU空闲时间占用 CPU总时间的百分比。
1.若 %iowait的值过高,表示硬盘存在I/O瓶颈
2.若 %idle的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量
3.若 %idle的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是 CPU。

2、inode、文件和其他内核表监控:

[root@zabbix ~]# sar -v 5 10			每5秒采样一次,连续采样10次,观察核心表的状态
dentunusd		目录高速缓存中未被使用的条目数量
file-nr			文件句柄(filehandle)的使用数量
inode-nr		索引节点句柄(inodehandle)的使用数量
pty-nr			使用的pty数量

这里面的索引和文件句柄值不是ulimit -a查看到的值,而是sysctl.conf里面定义的和内核相关的值, max-file表示系统级别的能够打开的文件句柄的数量, 而ulimit -n控制进程级别能够打开的文件句柄的数量,可以使用sysctl -a | grep inode和sysctl -a | grep file查看,具体含义如下:
file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level)。 (The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate)。当收到"Too many open files in system"这样的错误消息时, 就应该增加这个值了。

# cat /proc/sys/fs/file-max
4096
# echo 100000 > /proc/sys/fs/file-max
或者
echo ""fs.file-max=65535" >> /etc/sysctl.conf
sysctl -p

file -nr 可以查看系统中当前打开的文件句柄的数量。 他里面包括3个数字: 第一个表示已经分配了的文件描述符数量, 第二个表示空闲的文件句柄数量, 第三个表示能够打开文件句柄的最大值(跟file-max一致)。 内核会动态的分配文件句柄, 但是不会再次释放他们(这个可能不适应最新的内核了, 在我的file-nr中看到第二列一直为0, 第一列有增有减)
man bash, 找到说明ulimit的那一节:提供对shell及其启动的进程的可用资源(包括文件句柄, 进程数量, core文件大小等)的控制。 这是进程级别的, 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符, 能fork出多少个子进程等… 当达到上限时, 会报错"Too many open files"或者遇上Socket/File: Can’t open so many files等

3、内存和交换空间监控

[root@zabbix ~]# sar -r 5 10				每5s采样一次,连续采样10次,监控内存分页

kbmemfree 			 这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused			 这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused			 这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached  这两个值就是free命令中的buffer和cache.
kbcommit			 保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit				 这个值是kbcommit与内存总量(包括swap)的一个百分比.

4、内存分页监控

[root@zhz sa]# sar -B 10 3				每10s采样一次,连续采样3次,监控内存分页
Linux 3.10.0-1160.45.1.el7.x86_64 (zhz) 	2023年05月19日 	_x86_64_	(16 CPU)
14时16分39秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
14时16分49秒      0.00    201.40   4914.80      0.00   3593.90      0.00      0.00      0.00      0.00
14时16分59秒      0.00    129.00   5997.40      0.00   4219.50      0.00      0.00      0.00      0.00
14时17分09秒      0.00    165.80   3223.90      0.00   3333.20      0.00      0.00      0.00      0.00
平均时间:      0.00    165.40   4712.03      0.00   3715.53      0.00      0.00      0.00      0.00
pgpgin/s		表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s		表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s		 	每秒钟系统产生的缺页数,即主缺页与次缺页之和(major +minor)
majflt/s		每秒钟产生的主缺页数.
pgfree/s		每秒被放入空闲队列中的页个数
pgscank/s		每秒被kswapd扫描的页个数
pgscand/s		每秒直接被扫描的页个数
pgsteal/s		每秒钟从cache中被清除来满足内存需要的页个数
%vmeff			每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

5、I/O和传送速率监控

[root@zhz sa]# sar -b 5 10				每5s采样一次,连续采样10次,报告缓冲区的使用情况
Linux 3.10.0-1160.45.1.el7.x86_64 (zhz) 	2023年05月19日 	_x86_64_	(16 CPU)
14时21分48秒       tps      rtps      wtps   bread/s   bwrtn/s
14时21分53秒     25.40      0.00     25.40      0.00    320.40
14时21分58秒     21.40      0.00     21.40      0.00    242.80
14时22分03秒     24.80      0.00     24.80      0.00    445.20
14时22分08秒     27.00      0.00     27.00      0.00    266.80
14时22分13秒     29.60      0.00     29.60      0.00    331.80
14时22分18秒     34.20      0.00     34.20      0.00    622.60
14时22分23秒     21.80      0.00     21.80      0.00    328.60
14时22分28秒     25.20      0.00     25.20      0.00    270.20
14时22分33秒     30.20      0.00     30.20      0.00    446.60
14时22分38秒     22.60      0.00     22.60      0.00    242.40
平均时间:     26.22      0.00     26.22      0.00    351.74
tps			每秒钟物理设备的 I/O传输总量
rtps		每秒钟从物理设备读入的数据总量
wtps		每秒钟向物理设备写入的数据总量
bread/s		每秒钟从物理设备读入的数据量,单位为块/s
bwrtn/s		每秒钟向物理设备写入的数据量,单位为块/s

6、进程队列长度和平均负载状态监控

[root@zhz sa]# sar -q 5 10				每5s采样一次,连续采样10次,监控进程队列长度和平均负载状态
Linux 3.10.0-1160.45.1.el7.x86_64 (zhz) 	2023年05月19日 	_x86_64_	(16 CPU)
14时28分24秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
14时28分29秒         1      1906      5.05      2.22      1.54         2
14时28分34秒        13      1946      4.80      2.21      1.54         1
14时28分39秒         0      1969      4.58      2.21      1.54         1
14时28分44秒         1      1973      4.53      2.24      1.55         1
runq-sz		运行队列的长度(等待运行的进程数)
plist-sz	进程列表中进程(processes)和线程(threads)的数量
ldavg-1		最后1分钟的系统平均负载(Systemload average)
ldavg-5		过去5分钟的系统平均负载
ldavg-15	过去15分钟的系统平均负载

7、系统交换活动信息监控

[root@zhz sa]#  sar -W 5 10				每5s采样一次,连续采样10次,监控系统交换活动信息
Linux 3.10.0-1160.45.1.el7.x86_64 (zhz) 	2023年05月19日 	_x86_64_	(16 CPU)
14时39分29秒  pswpin/s pswpout/s
14时39分34秒      0.00      0.00
14时39分39秒      0.00      0.00
14时39分44秒      0.00      0.00
14时39分49秒      0.00      0.00
pswpin/s			每秒系统换入的交换页面(swap page)数量
pswpout/s			每秒系统换出的交换页面(swap page)数量

8、统计网络信息

sar -n选项使用6个不同的开关:DEV,EDEV,NFS,NFSD,SOCK,IP,EIP,ICMP,EICMP,TCP,ETCP,UDP,SOCK6,IP6,EIP6,ICMP6,EICMP6和UDP6 。
DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。

8.1、sar -n DEV 1 3

# 每间隔1秒统计一次,总计统计3次,下面的average是在多次统计后的平均值
IFACE 		本地网卡接口的名称
rxpck/s 	每秒钟接受的数据包
txpck/s 	每秒钟发送的数据库
rxKB/S 		每秒钟接受的数据包大小,单位为KB
txKB/S 		每秒钟发送的数据包大小,单位为KB
rxcmp/s 	每秒钟接受的压缩数据包
txcmp/s 	每秒钟发送的压缩包
rxmcst/s 	每秒钟接收的多播数据包

8.2、sar -n EDEV 1 1

# 统计网络设备通信失败信息
IFACE 		网卡名称
rxerr/s 	每秒钟接收到的损坏的数据包
txerr/s 	每秒钟发送的数据包错误数
coll/s 		当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
rxdrop/s 	当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
txdrop/s 	当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
txcarr/s  	当发送数据包的时候,每秒钟载波错误发生的次数
rxfram   	在接收数据包的时候,每秒钟发生的帧对其错误的次数
rxfifo    	在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
txfifo    	在发生数据包的时候,每秒钟缓冲区溢出的错误发生的次数

8.3、sar -n SOCK 1 1

# 统计socket连接信息
totsck		当前被使用的socket总数
tcpsck 		当前正在被使用的TCP的socket总数
udpsck  	当前正在被使用的UDP的socket总数
rawsck 		当前正在被使用于RAW的skcket总数
if-frag  	当前的IP分片的数目
tcp-tw 		TCP套接字中处于TIME-WAIT状态的连接数量
如果你使用FULL关键字,相当于上述DEV、EDEV和SOCK三者的综合

8.4、sar -n TCP 1 3

# TCP连接的统计
active/s 	新的主动连接
passive/s 	新的被动连接
iseg/s 		接受的段
oseg/s 		输出的段

8.5、sar -n 使用总结

-n DEV 		网络接口统计信息
-n EDEV  	网络接口错误
-n IP 		IP数据报统计信息
-n EIP 		IP错误统计信息
-n TCP 		TCP统计信息
-n ETCP 	TCP错误统计信息
-n SOCK 	套接字使用

9、设备使用情况监控

[root@zabbix ~]# sar -d 5 10 -p			每5s采样一次,连续采样10次,报告设备使用情况
-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
输出项说明:
tps			每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s	每秒读扇区的次数.
wr_sec/s	每秒写扇区的次数.
avgrq-sz	平均每次设备I/O操作的数据大小(扇区).
avgqu-sz	磁盘请求队列的平均长度.
await		从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1=1000毫秒).
svctm		系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util		I/O请求占CPU的百分比,比率越大,说明越饱和.
1.avgqu-sz的值较低时,设备的利用率较高。
2.当%util的值接近 1%时,表示设备带宽已经占满

总结:

要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
怀疑CPU存在瓶颈, 可用 sar -u和 sar -q 等来查看
怀疑内存存在瓶颈, 可用 sar -B、sar -r和 sar -W 等来查看
怀疑I/O存在瓶颈, 可用 sar -b、sar -u 和 sar -d等来查看

因版本和平台不同,有部分命令可能没有或显示结果不一致:
默认监控: sar 5 5 // CPU和IOWAIT统计状态

(1) sar -b 5 5        // IO传送速率
(2) sar -B 5 5        // 页交换速率
(3) sar -c 5 5        // 进程创建的速率
(4) sar -d 5 5        // 块设备的活跃信息
(5) sar -n DEV 5 5    // 网路设备的状态信息
(6) sar -n SOCK 5 5   // SOCK的使用情况
(7) sar -n ALL 5 5    // 所有的网络状态信息
(8) sar -P ALL 5 5    // 每颗CPU的使用状态信息和IOWAIT统计状态 
(9) sar -q 5 5        // 队列的长度(等待运行的进程数)和负载的状态
(10) sar -r 5 5       // 内存和swap空间使用情况
(11) sar -R 5 5       // 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
(12) sar -u 5 5       // CPU的使用情况和IOWAIT信息(同默认监控)
(13) sar -v 5 5       // inode, file and other kernel tablesd的状态信息
(14) sar -w 5 5       // 每秒上下文交换的数目
(15) sar -W 5 5       // SWAP交换的统计信息(监控状态同iostat 的si so)
(16) sar -x 2906 5 5  // 显示指定进程(2906)的统计信息,信息包括:进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上
(17) sar -y 5 5       // TTY设备的活动状态
(18) 将输出到文件(-o)和读取记录信息(-f)

sar也可以监控非实时数据,通过cron周期的运行到指定目录下
例如:我们想查看本月27日,从0点到24点的内存资源.
sa27就是本月27日,指定具体的时间可以通过-s(start)和-e(end)来指定.

sar -f /var/log/sa/sa1 -s 00:00:00 -e 23:59:59 -r

As long as a person knows where to go, the world will give him concessions.

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/130779601