Linux 内核:更大的交换块

Linux 内核:更大的交换块

我对挂起到磁盘非常满意。但是随着内存越来越多,这并不像以前那样有效。

挂起 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,则它将不起作用,因此不是通用解决方案)。

相关内容