什么可能导致在大型集群上删除缓存极其缓慢?

什么可能导致在大型集群上删除缓存极其缓慢?

我正在尝试对磁盘上的文件 I/O 进行计时。为了确保所有 I/O 发生在硬盘驱动器上,而不是在 RAM 上,在计时任何读取之前,我运行了删除缓存命令。具体来说,我调用fprintf一个 C 程序将 3 写入/proc/sys/vm/drop_caches.这是来源:

FILE *f = fopen("/proc/sys/vm/drop_caches", "w");

  if (!f)
  {
    perror("Opening of /proc/sys/vm/drop_caches failed");
    return 1;
  }

fprintf(f, "3");

fclose(f);

该代码实际上在一个大型集群中的许多机器上运行,并且其中大多数都遇到了奇怪的问题。运行上面的代码有时需要几个小时。这里的工作流程是读取→删除缓存→重复。我的读取只需要大约 5 分钟,因此在这么短的时间内应该不会再缓存太多内容。

这些机器的软件和硬件几乎相同,但大约 20 台机器中只有一台似乎从来不会在删除缓存方面遇到问题。

有什么理由需要这么长时间吗?在某些情况下,我认为程序完全冻结了。有关如何解决此问题的任何提示?

编辑:================================================== =========

我对此做了一些故障排除,我只是想将我能找到的内容编录下来,以防其他人将来遇到这个问题。总而言之,我们认为这与 Hadoop 和 HDFS 有关。

1)当命令的另一个实例挂起时,我能够在机器上手动运行我的 C 程序,并且在某些情况下它会在挂起的程序之前返回。也就是说,实际的缓存删除可能不会花费那么长时间,因为程序的另一个实例能够删除缓存并返回

2) 其中一台机器没有出现问题的原因是 hadoop 或其他程序在该节点上崩溃,导致它无法被 hadoop 使用。这就是为什么我们认为它与HDFS有关。

相关内容