使用sar+ksar监控服务器CPU/内存/IO

声明:本篇文章地址为 使用sar+ksar监控服务器日志_Rocket MAN的博客-CSDN博客 转载或复制请注明


sar的安装

sar是 sysstat 中的一个工具之一,sysstat 里面包含了很多工具,可以对系统进行详细的统计

安装sysstat

sudo apt install sysstat

github安装

参考:GitHub - sysstat/sysstat:Linux 的性能监控工具icon-default.png?t=N7T8https://github.com/sysstat/sysstat

dpkg安装

使用apt安装虽然快捷,但是不能安装指定包的版本,比如22.04中sysstat的版本是12.05.2,但是12.05.2版本无法正常写入记录到sysstat日志文件(关于这个问题,还可以参考 启动Sysstat 这一小节的解决方案),这个时候就可以dpkg就派上用场了,使用dpgk在22.04版本上安装12.2.0版本的sysstat,就可以正常使用sar了。

查看服务器架构

dpkg --print-architecture

Packages for Linux and Unix - pkgs.org 搜索sysstat,找到对应ubuntu版本的架构,比如我的是amd64,就找到Ubuntu Main amd64,点进去之后搜索Download,Binary Package是二进制包,可以直接下载使用。

我这里选择的是20.04的sysstat,版本12.2.0-2的sysstat。

wget --no-check-certificate      http://archive.ubuntu.com/ubuntu/pool/main/s/sysstat/sysstat_12.2.0-2_amd64.deb

当然如果只有rpm的二进制包,也可以使用alien将其转换成deb包:

sudo apt install alien
sudo alien -k sysstat_12.2.0-2_amd64.rpm

安装deb包

sudo dpkg -i sysstat_12.2.0-2_amd64.deb

如果报错依赖问题,apt来管理依赖

sudo apt-get -f install

sar的配置

配置sar开启收集数据

默认sar是不会自动执行的(如果上一步,你能看到结果,这一步可以跳过),这个时候需要我们手动开启,重启后才会生效(重启后面会讲)

sudo vi /etc/default/sysstat

把false修改为true 

设置sar的定时任务、保存时间、压缩天数

sar的默认定时任务cron 

先查看cron默认配置 

sudo vim  /etc/cron.d/sysstat

接下来修改默认配置,将其修改为合适的时间跨度。

# Activity reports every 10 minutes everyday
#5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1
* * * * *  root command -v debian-sa1 > /dev/null && debian-sa1 1 1

# Additional run at 23:59 to rotate the statistics file
59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2

修改sar存储时间和压缩天数

sudo vi /etc/sysstat/sysstat

sar的默认保存时间

默认保存时间7天,可以修改 HISTORY=7 为你希望的数字。解释如下

#“If value is greater than 28, then log files are kept in  multiple directories, one for each month.” //如果值大于28天,日志将会保存到多个目录,每个月一个目录

#HISTORY=7

HISTORY=180

sar压缩天数设置

默认设置时间为10天,超过十天的会压缩成压缩包,sar就无法立刻查看压缩后的数据

# Compress (using gzip or bzip2) sa and sar files older than (in days):
#COMPRESSAFTER=10

COMPRESSAFTER=28

修改默认时间为24小时制

在.profile文件中新增一行,再次打开一个新的窗口,sar就是24小时制了

sed -i '$a export LC_TIME=\"POSIX\"' .profile

在sed命令中,$a是一个命令,其作用是向文本的最后一行追加内容。具体来说,$表示匹配最后一行,而a表示追加文本。

启动sysstat 

如果显示Active: inactive (dead),那么就需要启动sysstat

sudo systemctl start sysstat

或者

sudo /etc/init.d/sysstat start

关于init.d和systemctl两种启动方式的由来,请查看Systemd 入门教程:命令篇 - 阮一峰的网络日志 (ruanyifeng.com)

启动Sysstat

执行一条写入命令,产看sar是否可用

有的版本(比如上面的22.04版本)安装sysstat后日志文件不能正常写入,其实可以使用下面的命令测试

sudo /usr/lib/sysstat/debian-sa1 1 1

再次执行sar,如果能看到记录的默认信息,就说明是正常的

如果此时没有看到输出,需要确保sysstat是否开启数据收集

执行以下命令

sudo systemctl enable sysstat

这个时候再次执行写入命令,应该就可以看到了。

如果执行debian-sa1后执行sar命令仍然看不到记录,可以将debian-sa1命令更换为以下命令

sudo /usr/lib/sysstat/sa1 1 1

除了上面的问题,可能另一个问题,就是定时任务每分钟写入似乎不生效,此时可以修改定时任务如下:

sudo vim /etc/cron.d/sysstat

将原来的内容替换成如下内容 

* * * * * root /usr/lib/sysstat/sa1 1 1

 再次重启sysstat

sudo systemctl start sysstat

或者

sudo /etc/init.d/sysstat start

再次执行 sar -u 就可以看到数据了

Sysstat数据保存的位置

重启后,会根据保存到 /var/log/sysstat 目录下,以sa<nn>命名,其中nn为每月的日期。例如sa08为8日的sa日志,这是一个二进制文件,不能直接查看

$ tree /var/log/sysstat/
/var/log/sysstat/
├── 202110
│?? └── sa08
└── sa08 -> 202110/sa08

sar常用命令

sar [options] [-A] [-o file] t [n]

参数说明

  • options
-A:所有报告的总和
-B:报告内存分页
-b:显示I/O和传送速率的统计信息
-d:输出每一个块设备的活动信息,和-p搭配,可以看到磁盘名称
-f filename,查看某天的数据 
-o filename 表示将命令结果以二进制格式存放在文件中,file 是文件名
-P [num|ALL] 表示查看某个CPU核心或所有CPU核心运行情况
-q:输出cpu平均负载
-r:输出内存和交换空间的统计信息
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-W:输出系统交换活动信息
-num 查看前num天的数据 
  • t 为采样间隔
  • n为采样次数,默认值是1

怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看

怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看

怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

输出cpu、内存、I/O,可用 sar -urbq

CPU综合

sar -u 1 3 –human

Linux 4.15.0-122-generic (ubuntu)    07/04/2022   _x86_64_ (64 CPU)



05:27:49 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle

05:27:50 PM     all      1.5%      0.0%      0.6%      2.7%      0.0%     95.2%

05:27:51 PM     all      1.5%      0.0%      0.7%      2.5%      0.0%     95.3%

05:27:52 PM     all      1.6%      0.0%      0.7%      2.4%      0.0%     95.4%

Average:        all      1.5%      0.0%      0.7%      2.5%      0.0%     95.3%

将文件系统磁盘使用率保持在 80% 以下,以避免过度碎片。当磁盘碎片过多时,I/O 时间将增加。

参数说明:

一般而言,us+ni+id 约等于100% us+sy+ni+id+wa+hi+si+st=100%

User

CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shells、数据库、web服务器

Nice

nice值为负的进程所占用的CPU时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间百分比。

nice是 CPU 调度优先级,较高的 值 (+19) 表示较低的优先级,较低的值 (-20) 表示较高的优先级

当两个捆绑CPU的进程同时在一个CPU上并发运行的时候,每个进程分到的CPU时间是20-p,这个p就是进程的优先级数值。这样一个nic数值是+15的进程就会得到普通优先级进程的分配的25%的CPU时间:(20-15)/(20-0)=0.25

如果CPU的nice百分比较高,这通常意味着系统中有很多低优先级的进程正在运行,此时如果出现较高优先级的任务,CPU资源会被重新分配给这些任务,因为它们的优先级更高。这意味着,nice值较高的低优先级任务将获得更少的CPU时间,因此在CPU使用报告中,nice进程的占比百分比会降低

System

运行内核进程的时间

I/O Waiting

在计算机中,读写磁盘的操作远比CPU运行的速度要慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存(可参考:JAVA IO 以及 NIO 理解 - 大熊猫同学 - 博客园 (cnblogs.com)),从而导致CPU 在等待的这一段时间内无事可做。CPU处于这种等待状态的时间由Wait参数来衡量。

较长的等待时间表示 CPU 由于该设备上的 I/O 操作而处于“搁浅”状态。

当从磁盘中读/写文件,或者代码中存在向文件中写或读的时候,将会明显升高I/O Waiting。

如果该值大于10,那么就需要认真对待。

 

解决I/O Waiting的方法

  1. 减少网络I/O的操作量
    1. 减少数据库查询的次数和数据量
    2. 减少对外部应用程序的调用次数和返回的数据量
  2. 减少磁盘的I/O操作量
    1. 减少写入/读取磁盘的文件数量数和据量
    2. 确有必要的日志才写入磁盘
  3. 确保内存是足够的,如果缺少内存,将会导致使用磁盘的swap内存,这将增加磁盘I/O
  4. 磁盘使用率应该在80%以下,过渡碎片化导致磁盘I/0
  5. 磁盘切换成SSD/NVMe/SAN存储

Idle

如果idle值过高,这通常意味着CPU有更多的空闲时间

 

Steal

该值仅适用于虚拟机。

同一台实体服务器上,可以运行多台虚拟机,这些虚拟机共享了相同的物理资源。

在CPU性能监控中,steal 时间(有时也称为 stolen time)代表虚拟CPU等待实际CPU的时间百分比,而在此期间,hypervisor(虚拟机管理程序)正在服务另一个虚拟处理器

参考:

关于CPU的User、Nice、System、Wait、Idle各个参数的解释 - 大熊猫同学 - 博客园 (cnblogs.com)

了解 Linux CPU 统计信息|侦察兵 APM 博客 (scoutapm.com)

linux - 在 CPU 利用率图表上,“nice”是什么意思?- 服务器故障 (serverfault.com)

I/O 等待 CPU 时间 – 顶部的“wa” - DZone 性能

使用nice调整进程优先级 · Cloud Atlas (gitbooks.io)
 

CPU单核

查看所有cpu核心运行情况

sar -P ALL

查看某个cpu核心运行情况,这里的n是核心的数字

sar -P n

进程队列长度和平均负荷

sar -q 1 3

Linux 4.15.0-122-generic (ubuntu) 	07/04/2022 	_x86_64_	(64 CPU)

05:35:12 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
05:35:13 PM         1      1207     27.30     23.08     18.19        12
05:35:14 PM         1      1207     26.16     22.91     18.17        12
05:35:15 PM         3      1207     26.16     22.91     18.17        10
Average:            2      1207     26.54     22.97     18.18        11

关于平均负载,它是关于cpu处理的进程(process)与当前cpu处理能力的一个比值。比如一分钟内cpu最多处理100个进程,如果当前正好有100个进程,那么这个值就是1.0,如果当前有200个进程,那么cpu在处理100个进程,剩下的100个进程就需要排队,此时cpu负荷是2.0。

关于上面的数值,一般只看ldavg-15,它表示15分钟内的平均负载,把系统负荷除以总的核心数,如果该值不超过1,就说明正常工作。

更详细的信息请查看:理解Linux系统负荷 - 阮一峰的网络日志 (ruanyifeng.com)

参数说明

参数

含义

runq-sz

运行队列的长度(正在运行的进程数)

plist-sz

进程列表中进程(processes)和线程(threads)的数量

ldavg-1

最后1分钟的系统平均负载(System load average)

ldavg-5

过去5分钟的系统平均负载

ldavg-15

过去15分钟的系统平均负载

blocked

内存与交换空间

sar -r 1 3 --human

Linux 4.15.0-122-generic (ubuntu) 	07/04/2022 	_x86_64_	(64 CPU)

05:23:50 PM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
05:23:51 PM     31.3G    118.6G     94.1G     75.1%     10.6G     59.0G      9.6G      7.6%     31.1G     42.7G     13.7M
05:23:52 PM     31.3G    118.6G     94.1G     75.1%     10.6G     59.0G      9.6G      7.6%     31.1G     42.7G     16.0M
05:23:53 PM     31.2G    118.6G     94.1G     75.1%     10.6G     59.0G      9.7G      7.7%     31.1G     42.7G     13.7M
Average:        31.3G    118.6G     94.1G     75.1%     10.6G     59.0G      9.6G      7.6%     31.1G     42.7G     14.5M

 参数说明

参数

释义

kbmemfreee

这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

kbmemused

这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

%memused

这个值是kbmemused和内存总量(不包括swap)的一个百分比.

kbbuffers

free命令中的buffer.

kbcached

free命令中的cache.

kbcommit

保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

%commit

这个值是kbcommit与内存总量(包括swap)的一个百分比.

内存分页

sar -B 1 3 --human

Linux 4.15.0-122-generic (ubuntu) 	07/04/2022 	_x86_64_	(64 CPU)

05:33:48 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
05:33:49 PM   8492.00  70184.00 1677457.00      2.00 1235928.00  36220.00      0.00  36218.00     99.99
05:33:50 PM   7992.00  32280.00 1824296.00      7.00 1321764.00  34156.00      0.00  34152.00     99.99
05:33:51 PM   6308.00  56372.00 1064346.00      2.00 756244.00  42515.00      0.00  42497.00     99.96
Average:      7597.33  52945.33 1522033.00      3.67 1104645.33  37630.33      0.00  37622.33     99.98

参数说明

参数

释义

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)的百分比

查看swap交换内存信息

sar –S 1 3

参数说明【待补充】

系统交换页面信息

sar -W 1 3 –human

参数说明

参数

释义

pswpin/s

每秒系统换入的交换页面(swap page)数量

pswpout/s

每秒系统换出的交换页面(swap page)数量

I/O

sar -b 1 3 –human

Linux 4.15.0-122-generic (ubuntu) 	07/04/2022 	_x86_64_	(64 CPU)

05:29:24 PM       tps      rtps      wtps   bread/s   bwrtn/s
05:29:25 PM   1330.00   1330.00      0.00  43272.00      0.00
05:29:26 PM   2239.00   2239.00      0.00  44520.00      0.00
05:29:27 PM   2428.00   2412.00     16.00  37520.00   5176.00
Average:      1999.00   1993.67      5.33  41770.67   1725.33

参数说明

参数

释义

tps

每秒钟物理设备的 I/O 传输总量

rtps

每秒钟从物理设备读入的数据总量

wtps

每秒钟向物理设备写入的数据总量

bread/s

每秒钟从物理设备读入的数据量,单位为 块/s

bwrtn/s

每秒钟向物理设备写入的数据量,单位为 块/s

设备使用情况监控

参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0.

sar -d 1 1 –p
Linux 4.15.0-122-generic (ubuntu) 	07/04/2022 	_x86_64_	(64 CPU)

06:33:03 PM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
06:33:04 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:33:04 PM     loop1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:33:04 PM     loop2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:33:04 PM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
06:33:04 PM ubuntu--vg-ubuntu--lv      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

如果由于磁盘名称太长导致文件排列不整齐,加上column -t

如果想查看某个特定磁盘,使用grep 

参数说明

参数

释义

DEV

磁盘名称

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的百分比,比率越大,说明越饱和.

ksar的用法

ksar是用来查看sar统计出来的数据的,简单说就是将数据图形化。如果你的系统是可以安装图形界面的话,可以在该机上安装该工具,否则,还是在你的windows电脑上安装该工具吧

使用ksar的前提是该机安装了java,如果没安装,请自行安装

windows下载ksar

https://nchc.dl.sourceforge.net/project/ksar/ksar/5.0.6/kSar-5.0.6.zip

windows下执行命令启动ksar

java -jar xxx\...\xxx\kSar.jar

ubuntu中保存数据到txt

上面我们生成过sa<xx>的文件,但这个文件无法直接为ksar所用,要想生成可用的数据,我们需要导出sar为txt

其中

  • -A 表示导出所有数据,包括CPU、内存、IO、网络等等所有数据
LC_ALL=C sar -A  > /tmp/sar.IP.202XXXXX.data.txt

 将多个日期的整合为一个

ls /var/log/sysstat

上面的格式只能导出当天的数据,如果我们要查看指定时间间隔的数据怎么看呢

ls -tr /var/log/sysstat/sa[0-9][0-9] | while read safile   ; do LC_TIME=en_UK.utf8 sar -r -f "$safile"  ;done  | sudo tee  "$(date +'%Y-%m-%d')"_"$(hostname -I)_"
ls -tr /var/log/sysstat/sa202[1-9][0-1][0-9][0-3][0-9] | while read safile   ; do LC_TIME=en_UK.utf8 sar -r -f "$safile"  ;done  | sudo tee  "$(date +'%Y-%m-%d')"_"$(hostname -I)_"

其中 

  • sa[0-9][0-9]表示 sa00至sa99所有文件
  •  LC_TIME=en_UK.utf8意思是以24小时格式输出,没有它将会存在PM/AM

当然我们也可通过find 和grep找到相关文件

例如:我们希望找到最近28天内的数据并整合为一个文件

ls -tr $(find -type f -mtime -28) | grep -E 'sa[0-9]{8}$' | while read safile   ; do LC_TIME=en_UK.utf8 sar -r -f "$safile"  ;done  | sudo tee  "$(date +'%Y-%m-%d')"_"$(hostname -I)_"

其中 

  • ls -tr $(find -type f -mtime -28) | grep -E 'sa[0-9]{8}$', 是查询最近28天内的所有文件,例如今天是2022年3月28日,那么将会查询sa20220228 至20220328的文件
  • find -mtime -n  代表查询今天往前减n天(包含n天前)后所有的文件,例如:今天日期为2022年3月28日,n为1,则查询2022年3月27日后创建(包含27日)的到当前时间的所有文件;find -mtime n 代表查询今天往前n+1天当天的所有文件,如上条件,则查询2022年3月26日当天的所有文件;find -mtime +n代表今天往前n+1天前的所有文件(不包含n+1天),如山条件,则查询2022年3月26前(不包含26日)之前日期的所有文件
  • grep -E regex 是grep的延伸型正規表示法,grep分为进阶选项延伸正规表示法,如果使用简单的筛选规则,进阶选项可以满足,如果要用正则表达式请用延伸正规表示法

经过上面的步骤,会生成一个‘日期_IP_‘格式的文件,将改文件传输到本地,后面可以放到本地电脑的软件中生成图形样式:

sudo sz "$(date +'%Y-%m-%d')"_"$(hostname -I)_"

Getting sar report for past one month (unix.com)

Sudo Permission Denied with Redirect or Pipe [Solutions] (linoxide.com)

time - How to get sar command value in 24 hour format (from 00:00:00 to 23:59:59) in Linux? - Stack Overflow

How To Find And Delete Files Older Than X Days In Linux - OSTechNix

 批量处理sa<xx>文件

当然也可以把所有文件批量处理,只不过这样会产生n个文件,不能连续查看一个星期活一个月的数据,所以不推荐这样做

for day in $(seq 08 09) $(seq -f %02g 8 9); do LC_ALL=C sar -r -f /var/log/sysstat/sa$day | sudo tee sa$day.ALL.$(hostname);  done;

其中08 09 指的是导出sa08-sa09的数据 

linux - how to query sar(sysstat) for more than one day data points - Stack Overflow

sar -A表示导出所有数据,既可以看cpu,也可以看内存。一开始我一直在寻找能够记录cpu/内存长时间跨度的方法,我以为需要自己编写守护进程来保存数据,其实这是不需要的,通过上面的命令,我们就可以获取到sar开启后所记录的CPU/内存以及其他信息等所有的日志。

将上面的文件下载到windows电脑上

sz /tmp/sar.IP.202xxxxx.data.txt

ksar导入文件

Data->Load from text file....,选择文件,等待一会儿,就会看到响应的数据

比如,想看cpu占比

 

比如,想看内存使用情况

使用sar命令时出现Please check if data collecting is enabled的解决方法 - yongfengnice - 博客园 (cnblogs.com)系统运维|使用 sar 和 kSar 来发现 Linux 性能瓶颈

sysstat的卸载

要仅卸载软件包,我们可以使用以下命令:sysstat

sudo apt-get remove sysstat

卸载 sysstat 及其依赖项

sudo apt-get -y autoremove sysstat

删除 sysstat 配置和数据

sudo apt-get -y purge sysstat

删除 sysstat 配置、数据及其所有依赖项

我们可以使用以下命令来删除配置、数据及其所有依赖项,我们可以使用以下命令:sysstat

sudo apt-get -y autoremove --purge sysstat

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值