我有几个 ECS 服务器运行各种应用程序。在经历了几次神秘的中断后,我注意到实例交换频繁,消耗了其 IO 突发平衡,导致实例变得毫无用处。
事实:
- 这些机器
t2
和t3
实例具有 2GB 或 4GB RAM - 实例上有足够的实际 RAM 供应用程序运行
vm.swappiness
设置为1
或5
- 根据我的监控,实例上的内存使用率一直在 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_memory
是0
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
/ t3
ATM 一起使用。
目前,我的机器在关闭 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。