在Linux中交换内存速度

时间:2011-08-10 10:50:53

标签: c++ linux

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

我的电脑有2GB的RAM和3 GB的交换内存。显然,部分数据将被放入交换内存中。问题是我不知道为什么遍历所有这些记录真的需要太长时间。我有一个循环遍历每个记录并执行一些操作的函数。它适用于大约500,000条记录,该功能只需要几分钟即可完成。但是,如果有两倍的记录,即1,000,000条记录,则需要数小时才能完成相同的功能。我在Linux中使用top命令来检查cpu负载,并看到它大约是90%wa(等待I / O的时间)。我想这可能会导致问题,但实际上不知道为什么会发生。

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

有两种选择:

  1. 该过程按顺序处理记录。地球上最愚蠢的事情就是将它们全部记忆起来。
    1. 如果您可以修复该过程,请将其修复为一次只加载一点。
    2. 如果您无法修复此过程,则必须购买更多内存。
  2. 该过程以随机顺序或多次(或不能以其他方式)对记录进行处理。好吧,你必须购买更多的内存。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

通常在操作系统中,Windows将其称为pagefile.sys,Linux称之为交换分区,交换的硬件是系统中的硬盘驱动器之一,因此它比数据量慢几个数量级。 RAM。

答案 5 :(得分:0)

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

  • 如果您放入RAM的数据可以压缩(比如说比例为3比1),
  • 将1 GB的2 GB RAM分配给$ memory in memory * swap,
  • 然后你有一个4 GB的厕所延迟RAM。

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