性能测试分析案例-如何定位SWAP问题

本文详细解释了SWAP的工作原理,包括其在内存不足时的换出和换入过程。通过实例演示如何配置Swap文件,监控内存使用情况,以及Swap在大文件读取时的动态调整。特别关注了内存回收、缓冲区和匿名内存对Swap的影响。
摘要由CSDN通过智能技术生成

SWAP原理

Swap 说白了就是把一块磁盘空间或者一个本地文件,当成内存来使用。它包括换出和换入两个过程。
所谓换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
而换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。
回收的内存既包括了文件页,又包括了匿名页。
Swap 其实是把系统的可用内存变大了。这样,即使服务器的内存不足,也可以运行大内存的应用程序。
什么时候会用到SWAP呢?有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内存(比如前面提到的缓存),进而尽可能地满足新内存请求。这个过程通常被称为直接内存回收。
除了直接内存回收,还有一个专门的内核线程用来定期回收内存,也就是 kswapd0。为了衡量内存的使用情况,kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是页最小阈值(pages_min)、页低阈值(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示。
在这里插入图片描述
可以通过内存域在 proc 文件系统中的接口 /proc/zoneinfo 来查看

cat /proc/zoneinfo
Node 0, zone      DMA
  pages free     3716
        min      72
        low      90
        high     108
        scanned  0
        spanned  4095
        present  3998
        managed  3977
    nr_free_pages 3716
    nr_alloc_batch 18
    nr_inactive_anon 1
    nr_active_anon 4

环境准备

预先安装 sysstat 等工具,如 apt install sysstat

操作和分析

终端中运行 free 命令,查看 Swap 的使用情况。

free
 total        used        free      shared  buff/cache   available
Mem:        3733352      264172     2075612         540     1393568     3239600
Swap:             0           0           0

Swap 的大小是 0,这说明我的机器没有配置 Swap
Swap 文件为例,在第一个终端中运行下面的命令开启 Swap,我这里配置 Swap 文件的大小为 8GB:

# 创建Swap文件
fallocate -l 8G /mnt/swapfile
# 修改权限只有根用户可以访问
chmod 600 /mnt/swapfile
# 配置Swap文件
mkswap /mnt/swapfile
# 开启Swap
swapon /mnt/swapfile

执行 free 命令,确认 Swap 配置

free
 total        used        free      shared  buff/cache   available
Mem:        3733352      271412     2063420         540     1398520     3232336
Swap:       8388604           0     8388604

free 输出中,Swap 空间以及剩余空间都从 0 变成了 8GB
在第一个终端中,运行下面的 dd 命令,模拟大文件的读取:

# 写入空设备,实际上只有磁盘的读请求
dd if=/dev/vda1 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.0004: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

总的内存使用率(%memused)在不断增长,从开始的 23% 一直长到了 98%,并且主要内存都被缓冲区(kbbuffers)占用,具体来说:
刚开始,剩余内存(kbmemfree)不断减少,而缓冲区(kbbuffers)则不断增大,由此可知,剩余内存不断分配给了缓冲区。
一段时间后,剩余内存已经很小,而缓冲区占用了大部分内存。这时候,Swap 的使用开始逐渐增大,缓冲区和剩余内存则只在小范围内波动。
当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致 sar 中的缓冲区减小,而匿名内存的回收导致了 Swap 的使用增大。紧接着,由于 dd 还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bala5569

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值