Linux在处理大型图像时使用交换空间而不是RAM

4

我正在使用R编程语言在Linux服务器上处理大型图像,因此我预计在图像处理和文件写入过程中会使用大量RAM。

然而,服务器在似乎不需要之前就开始使用交换内存,从而显著降低了处理时间。请参见以下图片:

enter image description here

这表明我大约使用了50%的RAM进行图像处理,约有50%似乎是为磁盘缓存(黄色)保留的,但仍然使用了10GB的swap!

当我观察交换空间被占用时,它并没有在RAM的使用率高于此图像所示时发生。交换出现问题似乎是在将处理后的数据写入GeoTiff文件时发生。

我的工作理论是,磁盘写入过程正在使用大量磁盘缓存区域(黄色区域),因此黄色实际上对服务器不可用(通常认为是磁盘缓存RAM)?

这听起来合理吗?还有其他原因导致RAM可用而使用交换空间吗?


您的用户在系统资源方面有配额吗?尽管据我所知,您可能会受到总地址空间的限制,但如果超过该限制,您将不会获得任何额外的交换。 - Dmitry Grigoryev
不,我的用户没有内存限制配额。我过去曾经使用了高达64GB的内存而没有使用交换空间。这似乎只发生在这种情况下。 - Single Entity
1个回答

2
我相信你可能受到了 swappiness 内核参数的影响:
当一个应用程序需要内存而所有的 RAM 都被占满时,内核有两种方法可以释放一些内存:它可以通过消除最老的数据来减少 RAM 中的磁盘缓存,或者将一些不太常用的程序部分(页面)交换到磁盘上的交换分区中。很难预测哪种方法更有效。内核通过根据最近的活动历史大致猜测两种方法在给定时刻的效果来做出选择。
Swappiness 取值介于 0 和 100 之间,以改变交换应用程序和释放缓存之间的平衡。在 100 的情况下,内核将始终优先查找不活动的页面并将其交换出去。值为 0 时,会得到接近旧行为的结果,即希望获取内存的应用程序可以将缓存缩小到 RAM 的一小部分。
如果你想强制内核尽可能避免交换,并将设备缓冲区和磁盘缓存的 RAM 分配给你的应用程序,你可以将 swappiness 设置为零。
echo 0 > /proc/sys/vm/swappiness

请注意,使用这个设置可能会使性能变得更糟,因为您的磁盘缓存可能会缩小到现在的一小部分,从而使磁盘访问变慢。

非常有趣,感谢您的帖子。在这种情况下,交换空间可能会优先考虑磁盘缓存,因为它认为它将会被需要。因此,鉴于我的应用程序正在写入大文件,这可能是正确的做法。 - Single Entity
如果您将swappiness减少到一个相当小的值(即20-30),我会很感兴趣了解性能会发生什么变化。 - Dmitry Grigoryev
1
我本来就打算这样做,我会让你知道的。不幸的是,目前服务器需要运行作业,这会使RAM使用情况混乱。但是,我会尽快完成这个任务。 - Single Entity
@SingleEntity:看起来这取决于您是否计划在写入这些文件后读取它们。如果您只是写入并忘记,那么缓存就没有用了。 - Zan Lynx
@ZanLynx 在“写入并忘记”的情况下,一定程度的缓存仍然是有用的。将写操作分组将使块分配器的生活更加轻松。 - Dmitry Grigoryev
1
@DmitryGrigoryev:如果你使用的是像ext4或btrfs这样具有延迟块分配的文件系统,那么就是真的。但是,你不需要几个GB的文件缓存。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接