虚拟化环境下大规模应用程序调试
1. 引言
随着拥有数十万个处理器的千万亿次级机器的出现,调试并行应用程序正成为一项日益严峻的挑战。调试此类大规模应用程序不仅需要复杂的调试技术,而且通常很难获得足够长的时间来使用这些机器。一些现有的并行调试器能够处理这些机器,但它们仍然需要分配整个机器。
调试并行应用程序需要经过多个迭代步骤。最初,应用程序在少量处理器上的简单基准测试中进行测试,此时可以捕获并行场景中进程间通信交换导致的许多错误。在生产运行期间,应用程序将使用更大的输入数据集,并在更大的配置上部署。很多时候,应用程序的行为可能不符合预期,并异常终止。此时,程序员需要在问题出现的规模上寻找问题,可能涉及数千个处理器。如果幸运的话,程序员可能能够在较小规模上重现问题并在本地集群上进行调试,但这并非总是可行。
例如,当错误位于某个算法中,且该算法依赖于输入数据在处理器之间的划分方式时,可能无法在较小规模上重现该错误。减少问题规模可能是缩小问题规模的一种解决方案,但问题的内在物理特性可能不允许这样做。另一个例子是当物理模拟输出不正确时,问题可能源于只有大数据集才会暴露的罕见条件。同样,问题规模可能无法缩小,因为否则错误会消失。在所有这些情况下,程序员唯一的选择是使用整个机器,并在可能涉及数千个处理器的完整问题规模上进行调试。
大型并行机器上的交互式会话通常仅限于小的分配。对于大型分配,通常需要批处理调度。为了调试应用程序,程序员必须通过调度器启动作业,并在作业开始时守在终端前。除非预先请求了特定的分配槽,否则这可能会在不可预测、不方便的时间发生。此外,调试的性质决定了可能需要多次执行代码来跟踪错误并尝试不同的潜在解决方案,这加剧了问题,并导致调试效率极低。