【问题标题】:Linux using swap instead of RAM with large image processingLinux 使用交换而不是 RAM 来处理大型图像
【发布时间】:2015-11-18 22:06:27
【问题描述】:

我正在使用 R 编程语言在 Linux 服务器上处理大图像,因此我希望大部分 RAM 将用于图像处理和文件写入过程。

但是,服务器在似乎需要之前很久就使用了交换内存,从而显着减慢了处理时间。见下图:

这表明我将大约 50% 的 RAM 用于图像处理,大约 50% 似乎保留用于磁盘缓存(黄色),但正在使用 10Gb 的交换空间!

我看到交换被吃掉了,但当 RAM 的使用率比这张图片中显示的高时,它并没有发生。在将处理过的数据写入 GeoTiff 文件期间,交换似乎被吃掉了。

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

这听起来合理吗?当 RAM 显然可用时,是否还有其他使用交换的原因?

【问题讨论】:

  • 您的用户是否有系统资源配额?虽然 AFAIK 可以限制总地址空间,但如果超过它,您将不会获得任何 额外 交换。
  • 不,我的用户没有内存限制配额。我过去在不使用交换的情况下使用了高达 64Gb 的内存。它似乎只发生在这种情况下。

标签: linux r memory


【解决方案1】:

相信你可能会受到swappiness内核参数的影响:

当应用程序需要内存并且所有 RAM 都被完全占用时,内核有两种方法可以释放一些内存供其使用:它可以通过消除最旧的数据来减少 RAM 中的磁盘缓存,或者它可以交换更少的内存使用的程序部分(页面)输出到磁盘上的交换分区。很难预测哪种方法会更有效。内核根据最近的活动历史,通过在给定时刻粗略猜测两种方法的有效性来做出选择。

Swappiness 取一个 0 到 100 之间的值来改变交换应用程序和释放缓存之间的平衡。在 100 时,内核将始终更喜欢查找非活动页面并将它们换出。值 0 给出了接近旧行为的东西,即需要内存的应用程序可以将缓存缩小到 RAM 的一小部分。

如果您想强制内核尽可能避免交换,并将设备缓冲区和磁盘缓存中的 RAM 分配给您的应用程序,您可以将 swappiness 设置为零:

echo 0 > /proc/sys/vm/swappiness

请注意,使用此设置实际上可能会降低性能,因为您的磁盘缓存可能会缩小到现在的一小部分,从而使磁盘访问速度变慢。

【讨论】:

  • 很有趣,谢谢你的帖子。似乎在这种情况下,swappiness 可能会优先考虑磁盘缓存,因为它认为它将被需要。因此,考虑到我的应用程序正在编写的大文件,这很可能是正确的做法。
  • 我很想知道如果您将交换性降低到一个相当小的值(即 20-30),性能会发生什么变化。
  • 我本来打算这样做,我会告诉你,不幸的是我需要服务器目前正在运行作业,这会混淆 RAM 的使用。但是我会尽快做到这一点。
  • @SingleEntity:似乎这取决于您是否打算在写入这些文件后将它们读回。如果你在写后忘记了,那么缓存就没用了。
  • @DmitryGrigoryev:是的,如果您使用的是具有延迟块分配的文件系统,例如 ext4 或 btrfs。不过,您不需要千兆字节的文件缓存。
猜你喜欢
  • 1970-01-01
  • 2022-06-13
  • 2020-07-09
  • 1970-01-01
  • 2021-12-07
  • 2015-12-26
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多