我通常在台式机上运行许多程序和虚拟机。瓶颈不是 CPU,而是内存。(购买更多内存不是解决办法,因为这不是我自己的电脑。)
我开始尝试压缩缓存它在压缩内存方面工作得很好。我可以通过 swappiness 100 来增加它的使用率。但是当使用真实(未压缩)时,内存开始填满,然后 Linux 开始在进行大量交换之前清空缓存和缓冲区,这对我来说很糟糕,因为在程序之间切换会变得非常慢。
我找不到为缓冲区和缓存保留内存的方法,因此我开始寻找其他方法并找到了 cgroups。
在 cgroups 中,您无法为根资源设置内存限制,因此我尝试将所有进程移到内存有限的组中,但不知何故似乎不起作用。
请帮助我如何为缓冲区和缓存保留内存并在早期开始交换到 compcache。
答案1
如果您想为缓存和缓冲区保留内存:当默认值为 100 时,请 echo 10 > /proc/sys/vm/vfs_cache_pressure。然后,您可以限制每个应用程序使用的最大内存:echo 8192 > /proc/sys/vm/max_map_count。我建议 swapiness=30 和较高的 /proc/sys/vm/dirty_writeback_centisecs 和 /proc/sys/vm/dirty_expire_centisecs 值(均为:1250)。它还可以帮助调整文件系统:
echo 8192 > /sys/block/mmcblk0/queue/max_sectors_kb
echo 8192 > /sys/block/mmcblk1/queue/max_sectors_kb
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle
echo 0 > /sys/block/mmcblk1/queue/iosched/slice_idle
echo 160 > /sys/block/mmcblk0/queue/iosched/quantum
echo 160 > /sys/block/mmcblk1/queue/iosched/quantum
echo 800 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
echo 800 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
echo 180 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
echo 180 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty
echo 1 > /sys/block/mmcblk1/queue/iosched/back_seek_penalty
这些值来自我的手机和笔记本电脑,它们运行非常稳定,运行速度也很快。我的手机内存有限,但这些调整很有帮助。我的手机也启用了 cgroups,我推荐 4k wonderpatch,因为它会为用户从终端(而不是桌面)运行的每个应用程序添加自定义 cgroups,但我不知道如何使用 cgroups 限制内存。
答案2
您不能直接为缓冲区和缓存保留内存。内核将使用未用于其他用途的内存来执行此操作,有时会交换非常旧的未使用页面以腾出更多空间,因此为缓存/缓冲区保留内存的方法是限制应用程序(包括虚拟机)使用的 RAM 量。
一个常见问题是为虚拟机分配比所需更多的内存,以便虚拟机中的操作系统有空间用于磁盘缓存。您可以通过打开虚拟磁盘的缓存支持来消除这样做的需要(如何做到这一点取决于您的虚拟化解决方案,您没有说明),从而让主机决定全局用于缓存的内存量。这样,您可以减少分配给每个虚拟机的内存量,而 I/O 性能下降的程度要小于其他情况。但需要注意的是:如果您的主机非正常关机(例如由断电引起),这样做会使您面临虚拟磁盘上文件系统损坏的额外危险。
答案3
如果内存有限,请不要尝试将内存使用量指示给内核。内核可能已经做得比您使用 cgroups 或 compcache 做得更好了。
如果无法增加内存,那么唯一真正的解决方案就是限制 RAM 的使用。增加交换空间可能会“解决”问题,但会导致进程之间的交换时间过长。减少 VM 的 RAM 使用量可以改善这种情况。
查看文章减少 Linux 内存占用虽然是2007年的事了,但还是有帮助的。
你也可以编译自己的内核,关闭所有不需要的服务和选项。例如,请参阅这篇文章:内核大小调整指南。
您可能转而使用小内存版本的 Linux,如本文所述:8 个最佳微型 Linux 发行版。
但我重申,没有神奇的解决方案可以让你在内存不足的计算机上使用大量内存,至少在不进行大量缓慢交换的情况下是如此。你必须优化你的使用模式。优化内核可能会有所帮助,但也有其局限性。
答案4
进入终端,然后进入根模式,然后执行:nano /etc/sysctl.conf 并在底部复制它。
vm.swappiness = 60
vm.overcommit_ratio = 100
vm.min_free_kbytes = 1000000
这是我当前正在使用的配置,底部的 2 行相当于 1gb,因为我的 12gb RAM 限制为 10gb,所以它为我保留了 10%,并根据需要进行调整。