对于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来锁定内存,阻止内存换出

发表评论

邮箱地址不会被公开。 必填项已用*标注