我对挂起到磁盘非常满意。但是随着内存越来越多,这并不像以前那样有效。
挂起 TO 磁盘效果很好:需要一两分钟,考虑到我的磁盘性能,这是我所期望的。
问题是起来挂起后:磁盘需要永远进行寻道,并且只读取单个页面,导致页面调入速率低于 1 MB/s。
有什么方法可以让内核读取下一个(例如 10 MB)并机会性地交换它 - 而不是仅仅读取单个页面?
如果很快就需要这 10 MB 中的一页,那么就不会浪费。即使 10 MB 中的大部分都不需要,这些页面仍然是干净的,并且可以简单地回收为空闲页面 - 交换的副本不会受到影响。
例子
这会占用 6.5G RAM,主动使用该内存并以 100% 的速度使用整个核心:
perl -e 'while(1){for(1..25000000){$t{$_}++}}'
挂起到磁盘之前:
total used free shared buffers cached
Mem: 8074280 7876864 197416 93460 169524 625912
-/+ buffers/cache: 7081428 992852
Swap: 8282108 8 8282100
挂起到磁盘需要:7 分 10 秒
该磁盘的原始性能为 50 MB/s。
从磁盘恢复到显示器启动并运行需要:0 分 32 秒
但在系统对按键做出反应之前,它必须额外切换:2m02s
此时内存使用情况如下所示:
total used free shared buffers cached
Mem: 8074280 2846392 5227888 74232 8312 157588
-/+ buffers/cache: 2680492 5393788
Swap: 8282108 5103264 3178844
请注意,perl 程序使用的完整 6.5G 空间并未换入。它还需要 4-5 GB。
vmstat 1
报告系统正在以 600 KB/s 的速率交换:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
0 2 3506124 1525652 27732 274036 632 0 632 0 228 740 6 1 50 44 0
iostats
报告磁盘 I/O 利用率为 100%(可能是由于一直在寻找)。
该perl
程序使用了大约 0.3% 的 CPU,因为它每次执行任何操作都会导致页面错误。
它继续交换另一个:1h15m12s
最后perl
程序完全换入并可以再次以 100% 运行。
所以我想要的是交换需要很多更短。实现这一目标的方法之一是通过一次交换 10 MB 而不仅仅是单个页帧来提高 600 K/s。
但也许还有其他调整参数,这将使交换发生得更快。
(swapoff -a
在我的例子中,这是一个选项 - 它以 10 MB/s 的速度换入,但如果换出的数据超过 8 GB,则它将不起作用,因此不是通用解决方案)。