【问题标题】:Swap memory speed in LinuxLinux中的交换内存速度
【发布时间】:2011-10-23 23:44:25
【问题描述】:

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

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

如果有任何有用的想法,我会非常感谢。

【问题讨论】:

  • 您问题的唯一实际答案是购买更多 RAM。现在 RAM 很便宜。
  • 迭代时是否修改记录?
  • @Maxim 不,我只是阅读并计算一些东西
  • @Alexandre 我不知道这是否是原因,所以在知道实际原因之前,我不会冒险购买更多 RAM。还是谢谢
  • @longbkit:除非您有一个具有超指数复杂性的算法,否则在将数据大小乘以 2 时将运行时间乘以 100 是不正常的。 2GB 大约是 20 美元。是否昂贵仅取决于您每小时获得多少报酬来解决这个问题。

标签: c++ linux


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有两种选择:

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

    【讨论】:

    • 是的,我的系统将性能放在首位,因此现在明确我应该购买更多 RAM。我只是在朋友的帮助下在 6 GB RAM 上运行它。效果很好:)
    【解决方案3】:

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

    【讨论】:

    • 谢谢。我会添加更多 RAM,因为速度是我系统中的第一要务
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        • 如果您放入 RAM 的数据可以压缩(假设比率为 3 比 1),
        • 将 2 GB RAM 中的 1 GB 分配给 $in memory* 交换,
        • 然后您就有了 4 GB 的 loo 延迟 RAM。

        我很想知道它是否可以提高您在不颠簸的情况下可以处理的记录数量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          • 2017-11-27
          • 1970-01-01
          • 2013-04-01
          相关资源
          最近更新 更多