我有一个 Debian 盒子,我正在其中使用 ddrescue 在 sata ssd 上进行一些数据恢复。该进程已经运行了 24 小时,而且无论如何还剩 24 小时(至少),PC 拥有 16GB 内存和 10GB 交换空间。由于某种原因,使用了 8GB 交换空间,并使用了 2GB RAM。这似乎是对资源的低效利用。我希望将来避免这种行为。为什么要以这种方式使用存储设备?
今后如何避免此类操作呢?
我有一个 Debian 盒子,我正在其中使用 ddrescue 在 sata ssd 上进行一些数据恢复。该进程已经运行了 24 小时,而且无论如何还剩 24 小时(至少),PC 拥有 16GB 内存和 10GB 交换空间。由于某种原因,使用了 8GB 交换空间,并使用了 2GB RAM。这似乎是对资源的低效利用。我希望将来避免这种行为。为什么要以这种方式使用存储设备?
今后如何避免此类操作呢?
正在使用交换而不是 ram,因为推送到交换的内存处于非活动状态,没有被使用,并且可能您的 ddrescue 正在拉入大量数据,这些数据填满了 ram 中的缓存。
这实际上并不是一个效率问题,它应该能够在需要时相当快地将数据从交换中取出。它处于交换状态,因为系统认为增加缓存可以更好地利用内存。一般来说这是正确的,但 ddrescue 可能只会使用这些磁盘块一次。
这是一种基本上无害的情况,但如果它确实困扰您,您可以创建一个 cgroup,将 ddrescue 移入其中,然后更新
memory.max
该 cgroup 的参数以限制 ddrescue 可以使用的内存量。请注意,如果 ddrescue 多次重新读取块,则可能会使其速度慢得多。如果不是,更改此参数不会使系统的其余部分明显更快,就像换出的页面正在使用一样,它们不会被换出。
当程序分配所有实际内存并需要更多内存时,可以使用交换空间来控制发生的情况。当所有可释放的缓存(某些缓存块“正在使用”,无法释放)被释放后,系统进入 Out-Of-Memory 状态。在内存不足的情况下,通过交换,某些任务的内存会被写入磁盘,释放以供重用,然后在任务运行时返回到内存(换入)。如果没有交换,系统可能会冻结,可怕的 OOM-Killer(一个伪进程,硬编码在内核中)运行,并选择一个进程来杀死,以释放内存。OOM-Killer 以不方便的选择而闻名。