为缓存和缓冲区保留 RAM

Sto*_*one 7 memory linux swap

我通常在桌面上运行许多程序和虚拟机。CPU不是瓶颈,而是内存。(购买更多内存不是解决方案,因为它不是我自己的电脑。)

我开始尝试使用compcache,它在压缩内存方面效果很好。我可以通过swappiness 100来增加它的使用。但是当真正的(未压缩)内存开始填满然后Linux开始在大量交换之前清空缓存和缓冲区对我不利的东西因为程序之间的切换变得非常缓慢。

我找不到为缓冲区和缓存保留内存的方法,所以我开始寻找替代方法并找到了 cgroup。

在 cgroups 中,您无法为根资源设置内存限制,因此我尝试将所有进程移动到内存有限的组中,但不知何故它似乎不起作用。

请帮助我如何为缓冲区和缓存保留内存并在早期开始交换到 compcache。

Mic*_*ega 6

如果要为缓存和缓冲区保留内存:当 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
Run Code Online (Sandbox Code Playgroud)

这些值来自我的手机和我的笔记本电脑,它运行非常稳定,而且运行速度非常快。我的手机内存有限,但这种调整很有帮助。我的手机也启用了 cgroups,我会推荐 4k Wonderpatch,因为这会为用户从终端(不是桌面)运行的每个应用程序添加自定义 cgroups,但我不知道如何使用 cgroups 限制内存。


Dav*_*ett 1

您不能直接为缓冲区和缓存保留内存。为此,内核将使用未用于任何其他用途的内存,有时会交换非常旧的未使用页面以腾出更多空间,因此为缓存/缓冲区保留内存的方法是限制 RAM 应用程序的数量(包括虚拟内存)机)正在使用。

一个常见问题是为虚拟机分配的内存超出了需要,以便虚拟机中的操作系统有磁盘缓存空间。您可以通过打开虚拟磁盘的缓存支持来消除执行此操作的需要(如何执行此操作取决于您的虚拟化解决方案,您没有说明),从而让主机决定全局用于缓存的内存量。这样,您就可以减少分配给每个虚拟机的内存量,同时 I/O 性能下降也比其他方式更少。不过,请注意:如果您的主机出现不正常的关闭(例如由断电引起),这样做确实会使您面临虚拟磁盘上文件系统损坏的额外危险。