对于Swap升高的时候,如何定位和分析,就是本次的重点
我们需要使用sysstat工具
我们先使用free工具,查看Swap的情况
如果
Swap中是0,说明没有开启Swap
这就需要开启Swap
开启Swap,Linux支持Swap文件和Swap分区
对于文件,则可以如下开启
# 创建Swap文件
$ fallocate -l 4G /mnt/swapfile # 修改权限只有根用户可以访问 $ chmod 600 /mnt/swapfile # 配置Swap文件 $ mkswap /mnt/swapfile # 开启Swap $ swapon /mnt/swapfile |
开启后如下
然后我们模拟dd 大文件的读取
# 写入空设备,实际上只有磁盘的读请求
$ dd if=/dev/sda1 of=/dev/null bs=1G count=2048
利用sar来查看内存的数值变化
# 间隔1秒输出一组数据
# -r表示显示内存使用情况,-S表示显示Swap使用情况 $ sar -r -S 1 04:39:56 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 04:39:57 6249676 6839824 1919632 23.50 740512 67316 1691736 10.22 815156 841868 4 04:39:56 kbswpfree kbswpused %swpused kbswpcad %swpcad 04:39:57 8388604 0 0.00 0 0.00 04:39:57 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 04:39:58 6184472 6807064 1984836 24.30 772768 67380 1691736 10.22 847932 874224 20 04:39:57 kbswpfree kbswpused %swpused kbswpcad %swpcad 04:39:58 8388604 0 0.00 0 0.00 … 04:44:06 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 04:44:07 152780 6525716 8016528 98.13 6530440 51316 1691736 10.22 867124 6869332 0 04:44:06 kbswpfree kbswpused %swpused kbswpcad %swpcad 04:44:07 8384508 4096 0.05 52 1.27 |
sar输出了两个表格,一个是内存的使用情况,一个是Swap的使用情况,前面的kb,表明了单位是KB
大部分的指标都好认,就是kbcommit,表示当前系统负载需要的内存,kbactive,表示活跃内存,kbinact表示非活跃内存
可以看出在dd过程中,我们的内存使用率在不断上升,这是由于buffer的缓冲导致
然后Swap的使用增大
这符合我们的预期猜想
那么,具体的进程缓存的情况,我们可以利用cachetop来进行查看
cachetop输出如下
$ cachetop 5
12:28:28 Buffers MB: 6349 / Cached MB: 87 / Sort: HITS / Order: ascending PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT% 18280 root python 22 0 0 100.0% 0.0% 18279 root dd 41088 41022 0 50.0% 50.0 |
利用cachetop,看出dd的读写请求只有50%的命中率,未命中的缓存页数是41022个,这说明是dd导致了缓冲区的使用升高
那么Swap是怎么回事,我们看一下/proc/zoneinfo
观察剩余内存,内存阈值,匿名页 文件页的活跃情况
# -d 表示高亮变化的字段
# -A 表示仅显示Normal行以及之后的15行输出 $ watch -d grep -A 15 ‘Normal’ /proc/zoneinfo Node 0, zone Normal pages free 21328 min 14896 low 18620 high 22344 spanned 1835008 present 1835008 managed 1796710 protection: (0, 0, 0, 0, 0) nr_free_pages 21328 nr_zone_inactive_anon 79776 nr_zone_active_anon 206854 nr_zone_inactive_file 918561 nr_zone_active_file 496695 nr_zone_unevictable 2251 nr_zone_write_pending 0 |
利用watch查看变化
发现剩余内存在不断的波动,会在低于low的时候突然增大到high的值
这正是内存回收和缓存占用的循环往复
当剩余内存小于low,会回收一些缓存和匿名内存,使得内存增大,其中缓存回收导致sar减少
但是dd会继续请求分配内存,导致剩余内存减少
但是有时候回收的是文件页有时候是匿名页
对于这个,是依赖不同的内存回收倾向的设置
就是swappiness
基本设置的是50-60之间
那么这个Swap是影响了哪些应用程序呢?
这样我们可以利用proc系统中的status中VmSwap来进行查看虚拟内存大小
基本命令如下
for file in /proc/*/status ; do awk ‘/VmSwap|Name|^Pid/{printf $2 ” ” $3}END{ print “”}’ $file; done | sort -k 3 -n -r | head
最后我们关闭Swap
swapoff -a
最后说一下,关闭Swap再打开,也是一种Swap空间的清理方式
一般来说,Swap都是不符合系统的整体性能使用的
我们通常要降低Swap的使用
1.禁止Swap
2.降低swappiness的值
3.使用库函数 mlock或者mlockall来锁定内存,阻止内存换出