从休眠状态恢复时恢复内存中/交换页面状态

i33*_*36_ 5 linux io swap hibernate high-performance

我是 Linux 休眠支持的忠实粉丝,它在我尝试过的所有(不可否认的稍旧)硬件上都运行得非常好。我非常喜欢它完全关机和开机。

不过,关于休眠的一件事让我困扰了一段时间:休眠的系统在恢复后总是缓慢且无响应。通电后不会立即活泼。旧硬件会加剧这种情况,但在较新的系统上也会发生稍微显着的程度。

这似乎是因为内核只将 [内核级] 操作所必需的页面交换回工作内存,恢复内核的基本工作状态,并让用户空间在各种进程交换他们需要的页面时只搅动一段时间。 RAM 下他们自己的蒸汽。

这在实践中效果不佳,因为系统最初运行时好像某个大型进程已强制所有内容完全交换到磁盘。屏幕上的任何内容都会很快换回,但切换到另一个进程,您将等待几秒钟,因为也会换回内存。在较旧的硬件上——我的例子是 Core 2 ThinkPad T60——“几秒钟”甚至可以结束几分钟。

我最近意识到这个问题有一个令人惊讶的简单解决方案,在考虑了一下之后:记下标记磁盘和 RAM 中哪些页面的标签,然后在恢复时恢复这个确切的状态。当然,恢复过程可能需要大约 10 秒以上,但我不在乎 - 我有一个活泼的系统。

我想知道是否有任何晦涩的内核编译选项可以启用此类功能,或者我可以设置一些近似于这种行为的配置?

注意:我不认为swapoff -a; swapon -a可行的解决方案;当挂起的用户空间被重新激活时,所有加载的进程都在尝试执行代码并努力将自己交换回 RAM,从而导致大量的磁盘 I/O。试图破坏交换区只会加剧飓风,实际上比内核在重新激活用户空间之前恢复所有RAM需要更长的时间才能完成。