在Linux中交换内存速度

我在Linux 64位(Redhat Enterprise)中有一个进程,它将100万条logging注册到内存中,每条logging是4KB,因此总内存消耗约为4千兆字节。

我的电脑有2GB的RAM和3GB的交换内存。 所以显然部分数据将被放入交换内存。 问题是,我不知道为什么要花很长时间来遍历所有这些logging。 我有一个循环每个logging的function,做一些东西的东西。 它可以处理大约50万条logging,function只需要几分钟即可完成。 但是,如果有两倍的logging,即1,000,000条logging,则需要数小时来完成相同的function。 我在Linux中使用了top命令来检查cpu负载,看到它大概90%(等待I / O的时间)。 我想这可能会导致问题,但真的不知道为什么会发生。

我非常感谢你的任何有用的想法。

有两个选项:

  1. 该过程按顺序在记录上工作。 比起地球上最愚蠢的事情,把它们全部记录下来。
    1. 如果你可以修复这个过程,修复它只能一次加载一点。
    2. 如果你不能修复这个过程,你将不得不购买更多的内存。
  2. 该过程以随机顺序或多次对记录进行操作(否则无法执行)。 那么,你将不得不购买更多的内存。

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

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

听起来像缓存或交换颠簸正在发生。 检查vmstat进行验证。 如果您只加载尽可能多的数据,您可以修复交换抖动,您可以装入内存,处理它们,加载另一个块,等等。 这样你就不必强加处理顺序(随机或顺序无关紧要)。 或者,我们必须有更多关于您的算法/程序架构的细节来评论。

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

通常在操作系统中,Windows把它称为pagefile.sys,Linux把它称为交换分区,swap的硬件是系统中的硬盘之一,所以它比RAM要慢几个数量级。

在购买更多内存之前,您可以尝试将部分内存用作压缩交换。 我听说compcache ,但我没有使用它自己。 这个想法如下:

  • 如果你放入RAM的数据可以被压缩(比如3比1),
  • 将1 GB的2 GB RAM分配给$ in内存*交换,
  • 然后你有一个4 GB的loo延迟RAM。

我会很好奇,知道它是否可以提高您可以处理的记录数量而不会发生颠簸。