我正在 Proxmox 上使用 ZFS,并注意到 swappiness 似乎从未启动。swappiness 值当前设置为 50,但除非我达到 100% 的 RAM 使用率,否则永远不会交换,就好像 swappiness 设置为 0 一样。
我如何手动强制运行 swappiness?目前我能做到这一点的唯一方法是安装类似https://github.com/julman99/eatmemory消耗系统内存超过 100%
猫/proc/meminfo
MemTotal: 528099208 kB
MemFree: 33819676 kB
MemAvailable: 30995036 kB
Buffers: 65056 kB
Cached: 368868 kB
SwapCached: 4978016 kB
Active: 383870632 kB
Inactive: 71255296 kB
Active(anon): 383654260 kB
Inactive(anon): 71140760 kB
Active(file): 216372 kB
Inactive(file): 114536 kB
Unevictable: 160824 kB
Mlocked: 160824 kB
SwapTotal: 1875374420 kB
SwapFree: 1576041808 kB
Dirty: 128 kB
Writeback: 0 kB
AnonPages: 450155280 kB
Mapped: 185764 kB
Shmem: 92400 kB
KReclaimable: 1316628 kB
Slab: 7796824 kB
SReclaimable: 1316628 kB
SUnreclaim: 6480196 kB
KernelStack: 49616 kB
PageTables: 1746424 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2139350296 kB
Committed_AS: 1255929500 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 6192420 kB
VmallocChunk: 0 kB
Percpu: 1302144 kB
HardwareCorrupted: 0 kB
AnonHugePages: 176281600 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 72
HugePages_Free: 72
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 147456 kB
DirectMap4k: 49376056 kB
DirectMap2M: 406616064 kB
DirectMap1G: 81788928 kB
答案1
swappiness 不会强制使用交换空间。也不会解决内存不足的问题。
较高的值交换性鼓励回收匿名页面,而不仅仅是页面缓存。但这对 Linux 上的 ZFS 没什么帮助,因为不使用 Linux 的页面缓存。
我基本上希望总是有一定数量的可用 RAM。... 另外,我的系统当前使用 230/256GB 的 RAM,尚未使用交换。... 如果我在 RAM 为 99% 时创建另一个虚拟机,它将无法启动。
进行一些容量规划以避免内存超额认购。不要使用魔法命令来告诉虚拟机管理程序保留可用内存,而要严格遵守不要启动超出资源容量的客户机的规定。
您的 230/256GB 已使用 90%,如果使用率过高,可能会造成内存压力,不利于性能。这可能需要限制客户机内存,即 56 x 4 GB 客户机,以凑足一些数字。剩下的几十 GB 是否足以运行虚拟机管理程序内核并且仍有一些储备,您可以在测试中发现。
编辑:从 meminfo 来看,您的 500 GB 主机面临一些内存压力并且正在进行交换。
- MemAvailable 占总量的 5.8%,比较低。在 500 GB 的主机上使用 29 GB 并不是很多。
- SwapTotal 减去 SwapFree 显示交换空间使用量为 285 GB。总交换空间为 1788 GB 意味着它不会很快用完。请记住,大多数持久性存储比 DRAM 慢几个数量级。
- 0.4 GB 的缓存绝对值相当低。这与 Linux 上的 ZFS 使用一致,后者不使用通常的 Linux VFS 页面缓存。因此,swappiness 可调参数在此环境中几乎不起作用。如果您手动删除缓存,请不要这样做,这可能会损害性能。
交换是在需要时一次一组页面进行的。当客户机内存需求较低时,主机不会突然释放整个 100 GB 客户机。那将非常昂贵。
我对内存超额认购持怀疑态度,尤其是内存膨胀,并且不推荐这样做。鼓励使用低内存可能会对性能造成风险,因为在最坏的情况下,回收会导致延迟,并可能激怒 OOM 杀手。看看你尝试以高利用率启动客户机,超过某个点,内核就不会授予内存分配。
在启动 100 GB 的客户机之前,确认主机有 > 100 GB 的可用 RAM(不包括交换空间)。在减少客户机的内存大小之前,请先关闭客户机。不超额订购会导致内存成本更高,但性能更稳定,并且更易于维护。