Linux中交换内存的速度

3
我在Linux 64位(Redhat Enterprise)上运行一个进程,将一百万条记录存入内存,每条记录为4KB,因此总内存消耗约为4GB。
我的计算机有2GB的RAM和3GB的交换空间。所以显然部分数据将被放入交换空间。问题是我不知道为什么遍历所有这些记录需要太长时间。我有一个循环遍历每个记录并执行一些操作的函数。它可以处理大约500,000条记录,该函数只需要几分钟就能完成。但是,如果是双倍数量的记录,即1,000,000条记录,则需要数小时才能完成相同的功能。我使用Linux中的top命令检查CPU负载,并看到它约为90%wa(等待I / O的时间)。我猜想这可能是问题的原因,但真的不知道为什么会发生这种情况。
非常感谢您提供任何有用的想法。

4
回答你问题的唯一实际方法是购买更多的内存条。如今内存条价格便宜。 - Alexandre C.
@Alexandre 我不知道是否是这个原因,所以在了解实际原因之前,我不会冒险购买更多的内存。无论如何,还是谢谢您。 - longbkit
是否有其他进程正在运行或定期唤醒,被交换进和出? - Fred Foo
1
@longbkit:除非你有一个超指数复杂度的算法,否则当数据大小乘以2时,将运行时间乘以100并不正常。2GB大约是20美元。它是否昂贵取决于你每小时解决这个问题赚多少钱。 - Alexandre C.
@lars 我关闭了不相关的进程。 - longbkit
显示剩余6条评论
6个回答

4

交换区是磁盘。磁盘带宽比内存带宽低两到三个数量级。


3
有两个选择:
  1. 该过程按顺序逐个处理记录。将它们全部卷入内存是最愚蠢的做法。
    1. 如果您能修复该过程,请将其修复为一次只加载一点。
    2. 如果您无法修复该过程,则必须购买更多内存。
  2. 该过程以随机顺序或多次处理记录(无法使用其他方式)。好吧,你得买更多的内存。

是的,我的系统将性能放在首要位置,所以现在清楚我应该购买更多的RAM。我只是有朋友帮忙在6GB RAM上运行它。它运行得非常好 :) - longbkit

1
如果您想有效地使用交换空间,应确保按顺序遍历连续的内存块中的数据。即几兆字节的块。这样,当从交换空间加载新块到RAM时,该块也将包含接下来的几个记录。

谢谢。我会选择增加更多的内存,因为速度是我系统的首要任务。 - longbkit

1
听起来可能是缓存或交换空间抖动的问题。检查 vmstat 进行验证。如果您只加载适合内存的数据量,处理它们,加载另一个块,以此类推,就可以解决交换空间抖动的问题。这样,您就不必强制执行处理顺序(随机或顺序并不重要)。或者,我们需要更多关于您的算法/程序架构的详细信息才能发表评论。

1

你的交换内存速度取决于交换所在硬件的速度。

通常在操作系统中,Windows 称其为 pagefile.sys,Linux 称其为交换分区(s),交换的硬件是系统中的一个硬盘,因此比 RAM 慢几个数量级。


0

在购买更多RAM之前,您可以尝试将部分RAM用作压缩交换空间。我听说过compcache,但我自己没有使用过它。思路如下:

  • 如果您放入RAM的数据可以压缩(假设比率为3比1),
  • 将您2GB RAM的1GB分配给内存中的swap,
  • 然后您就拥有了低延迟的4GB RAM。

我很想知道它是否可以提高您处理记录的数量而不会导致过度交换。


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