1

我们的数据处理代码(用 C 编写)具有非常大的输入数据和非常大的输出数据(都超过了内存的大小)。要进行处理,我们只需要读入一部分输入数据,然后处理后,只输出一部分输出数据。我们的设计允许我们在内存的一部分中保存一段输入数据,并计算输出数据的第一部分(几乎填满内存),然后将输出(使用 write 或 fwrite)写入本地磁盘当前节点。然后代码将计算输出数据的下一部分,将其写出等,直到内存中输入数据的所有可能输出都已计算并输出。

我们在许多独立的集群上工作,在大多数情况下,单个输出需要几秒钟才能完成。但是,在我们遇到的两个系统上,对本地磁盘(无论是缓冲区还是磁盘)的写入都没有开始/完成??所以代码停顿了。他们会坐上几分钟甚至几个小时,什么也不做。这只会在某些节点上发生,仅在某些时间发生,并且写入延迟不同(几分钟到几小时)。如果离开,其他节点可能会开始出现同样的问题,而确实有问题的节点会突然停止出现问题。

我们发现了一个非常奇怪的解决方法:我们设置了一个后台循环来定期将一个相对较大的文件(1 Gb)复制到本地磁盘。当外部复制开始时,C 代码中的写入立即开始(我们看到 IOSTAT 上的 I/O 突然消失)。这仅在我们复制的文件足够大时才有效,这当然意味着我们正在显着降低处理效率。

我们遇到这个问题的两个集群是由完全不同的组设置的,使用不同的硬件、网络等,我们没有遇到这个问题的集群与这两个集群有相似之处。我们没有看到任何明显的罪魁祸首为什么这个非常基本的写入停止。在存在问题的两个集群上,一些节点比其他节点更频繁地出现问题,但有时还可以。当我们运行时,没有其他东西在运行。

任何帮助或建议表示赞赏。

4

0 回答 0