考虑以下场景:具有 2 GiB 的主机运行一些使用 KVM 的来宾。每个客人通常不需要太多内存;他们每人获得 256 MiB,并且运行的服务大部分都是闲置的。然而,有时客人需要更多的内存。现在,每个来宾只有很少的 RAM,但有自己的交换空间。我注意到使用了一小部分交换空间。我从来没有遇到过该配置的问题,但只是出于好奇:
最优的掉期分配策略是什么?
- 从各自的磁盘为每个来宾分配自己的交换空间,并从主机只为来宾分配很少的内存。 (这就是我现在正在做的事情。)
- 为主机分配较大的交换空间,不为客户机分配更多交换空间,并为客户机分配更多内存。
内存膨胀有助于提高内存性能吗?
答案1
“有时客人需要更多内存”听起来像是一个很好的应用过度使用内存。这个想法是你为每个客人分配大量的内存(超过你实际可以分配的内存),因为他们通常不使用它。然后,您进行数学计算,以确保有足够的交换空间,以便来宾实际上可以在最坏的情况下交换到磁盘,在最坏的情况下,它们实际上都在做使用所有内存。
交换空间继续主持人机器,它需要服从
主机交换空间 = 所有客户机内存的总和 + 建议的主机交换空间
为了保证它的安全。
因此,如果您有 10 个访客和 2 GiB RAM,您可以尝试类似的方法
- 每个访客 512 MiB RAM(512 * 10 = 总共 5120 MiB)
- 主机上的 2 GiB 交换
这意味着您的主机交换空间应至少为 512 * 10 + 2048 = 7168 MiB 才能安全地处理此问题,假设您可以将 2 GiB 交换空间专用于主机(对于那么小的主机内存,建议这样做)。
始终首先测试这些类型的设置,以确保您的机器可以处理它们。对它们进行基准测试就更好了,并且可以让您尝试不同的负载并选择最有效的一种。
答案2
@ndt 有一个很好的程序。我的场景不同,所以我采用不同的方法。
我的服务器有很多客人,他们都运行一个应用程序,通常是网络/邮件/文件服务器。里面的数据非常重要,所以经常做备份和快照。所以磁盘镜像越小越简单越好。所以我实际上不创建交换分区,而是创建交换文件。由于我没有具有高处理甚至内存需求的客人,因此他们的磁盘存储和内存都较小。交换文件位于 rootfs 内部。
这种设置节省了大量空间并简化了维护。正如我所说,这与其他情况不同。
答案3
接受的答案是错误的:
您还应该在虚拟机上启用交换空间,以便它知道 RAM 正在交换,并避免将其用于磁盘缓存和 IO 缓冲区。
如果您只在主机上启用交换,虚拟机将认为它有可用的实际 RAM 并使用它,而它将在主机上交换,从而产生不必要的瓶颈和冻结。这是你可能犯的最大错误。
您还应该使用不同的虚拟驱动器作为交换磁盘,因为您不想将其与其他数据驱动器一起进行快照/备份。
由于交换空间可能不稳定,因此您还可以使用cache=unsafe 或使用zram/zswap 以获得更好的性能。
还要记住,交换是好的,因为它可以释放不活动的 RAM,这些 RAM 稍后可以重新用于磁盘缓存和 IO 缓冲区。