AWS EC2 Amazon Linux 正在使用交换,即使它不应该

AWS EC2 Amazon Linux 正在使用交换,即使它不应该

我有几个 ECS 服务器运行各种应用程序。在经历了几次神秘的中断后,我注意到实例交换频繁,消耗了其 IO 突发平衡,导致实例变得毫无用处。

事实:

  • 这些机器t2t3实例具有 2GB 或 4GB RAM
  • 实例上有足够的实际 RAM 供应用程序运行
  • vm.swappiness设置为15
  • 根据我的监控,实例上的内存使用率一直在 60% 到 68% 之间(这是使用率没有缓冲区/缓存,剩余的“空闲”内存总是被缓冲区/缓存使用)
  • SWAP 使用率始终约为 30-40%(配置了 1-1.5GB SWAP);并且vmstat报告了一些si类似so
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 434948  83616  73468 818316  580    0   580     0  883 1453  5  1 93  1  0
 2  0 429060  65308  73468 818320 17760    0 17760    76 5927 6318 15 21 52 12  1
 0  3 440660  81180  73464 817208 4352 12880  4352 12880 5791 2672  8 39  0 52  0
 1  1 443164  78080  73452 816304 10104 3272 10104  3272 3850 3807  7 34  0 58  1
 1  1 438456  63944  73460 816356 13168  156 13216   212 3673 3686 12 34 21 32  0
 1  1 449472  72748  73460 815872 1600 11016  1600 11016 3815 1445  1 23  0 74  1
 0  4 453592  59728  73460 815964 3324 8748  4080  8752 4891 2881 10 34  1 54  0
 1  2 462724  68380  73456 815152 1704 10412  1704 10412 5381 2195  7 35  1 55  0
 0  2 473444  81148  73456 815108 1024 10976  1024 10976 4637 1608  2 34  2 63  1
 0  1 483124  87432  73444 818604 2352 9684  6136  9684 4526 1800  8 28  8 54  1
 0  1 480308  66860  73452 824476 13656    0 19536    36 3982 4103 11 27 39 22  0
 0  3 483744  75016  73448 825132 5016 7532  5860  7532 5645 4748 14 33  6 47  0
 2  2 493140  80348  73448 825068 1888 10164  1888 10164 4128 1993  2 34  0 62  0
 1  0 497544  78488  73440 824976 6248 6452  6364  6452 4192 2916  3 39 16 41  1
 0  1 494216  65096  73440 825068 12488    0 12616     0 4070 4620  7 26 42 24  1
 0  2 503856  69436  73452 824760 1968 10152  1968 10192 4885 1821  4 28  2 65  0
 1  0 514264  88532  73440 824188 1332 10668  1332 10672 4749 1622  2 25  1 71  0
 0  1 512984  76628  73440 824120 12844    0 12844     0 3653 3517  6 26 48 20  0
 1  3 479192  65220  73440 824556 12484    0 12832     0 3729 4821  6 29 34 31  0
 0  5 462680  78612  73440 824824 6120 6784  6532  6784 4111 3582  5 45  0 49  1
 0  2 433376  99148  73448 824992 5884 7560  6024  7596 3954 3407  3 33  1 62  0
  • 磁盘是与交换文件共享的约 20GB EBS gp2 卷,因此整体 IO 容量有限
  • vm.overcommit_memory0

cat /proc/meminfo两个相同的(一个有 SWAP,另一个没有 SWAP)的输出是

禁用 SWAP 后:

MemTotal:        2004488 kB
MemFree:          178976 kB
MemAvailable:     489360 kB
Buffers:          136892 kB
Cached:           290396 kB
SwapCached:            0 kB
Active:          1063520 kB
Inactive:         612900 kB
Active(anon):     817380 kB
Inactive(anon):   436892 kB
Active(file):     246140 kB
Inactive(file):   176008 kB
Unevictable:       17620 kB
Mlocked:           17620 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:       1262220 kB
Mapped:           140336 kB
Shmem:               252 kB
Slab:              73448 kB
SReclaimable:      39612 kB
SUnreclaim:        33836 kB
KernelStack:        6944 kB
PageTables:        15300 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1002244 kB
Committed_AS:    3076324 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      182248 kB
DirectMap2M:     1875968 kB
DirectMap1G:           0 kB

启用 SWAP 后:

MemTotal:        2004488 kB
MemFree:          116220 kB
MemAvailable:     925764 kB
Buffers:           73472 kB
Cached:           827312 kB
SwapCached:       136268 kB
Active:           653736 kB
Inactive:        1041616 kB
Active(anon):     375736 kB
Inactive(anon):   424652 kB
Active(file):     278000 kB
Inactive(file):   616964 kB
Unevictable:       17620 kB
Mlocked:           17620 kB
SwapTotal:       1499132 kB
SwapFree:        1061032 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        749004 kB
Mapped:           180880 kB
Shmem:               252 kB
Slab:             118940 kB
SReclaimable:      92304 kB
SUnreclaim:        26636 kB
KernelStack:        6784 kB
PageTables:        14212 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2501376 kB
Committed_AS:    2881136 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      110568 kB
DirectMap2M:     1947648 kB
DirectMap1G:           0 kB

我尝试过的:

  • 我尝试了各种vm.swappiness值,但它们似乎没有任何作用
  • 我甚至尝试重新启动并在更改swapoff -a && swapon -a后执行vm.swappiness

我期望发生的事:

  • 在我的想象中,按照我的设置,SWAP 应该一直保持空闲,除非发生某些不幸事件,即总内存使用量超出可用内存

为什么会发生这种情况?我遗漏了什么?我应该做些什么不同的事情?不幸的是,据我所知,无法将实例存储(并将 SWAP 放在该卷上)与t2/ t3ATM 一起使用。

目前,我的机器在关闭 SWAP 的情况下运行,它们对此很满意;只有我有点担心。(编辑:) 我的主要目标是让系统只在万不得已的情况下才使用 SWAP。

我的其他简单的 EC2 Ubuntu 机器运行正常。

答案1

在我的想象中,按照我的设置,SWAP 应该一直保持空闲,除非发生某些不幸事件,即总内存使用量超出可用内存

内存不足的情况已经太迟了。通过页面调出进行回收非常慢,Linux VMM 试图避免出现 OOM。

相反,将不活跃页面缓慢地转移到交换空间,可以充分利用可用的空间和 I/O。如果分页空间不用,那为什么要有它呢?更高的 swappiness 可调参数只会更快地达到相同的分页空间使用率。

有关算法的文档,请查看 MM wiki、LWN 文章以及 UNIX Stack Exchange 上的一些参考资料:Linux 内核中操作系统文件缓存使用什么页面替换算法?


在您的主机上,总分配(Committed_AS)约为 3 GB,而MemTotal为 2 GB。150% 不一定是坏的,其中一些是非活动或未使用的。但 Linux 会尽可能地调出页面,因为在保守的最坏情况下,所有内容都无法装入 RAM。安全的内存大小将小于Committed_AS,但要量化到底少多少有点棘手。

在您的环境中,IOPS 非常昂贵,因为它们计入永久存储的配额。禁用分页空间并监视 OOM。

相关内容