2

我正在使用使用 QEMU 的 Marss 周期精确模拟器。它是一个完整的系统模拟器,提供用户和内核统计信息。但是,即使我只使用用户统计数据,不同运行之间的统计数据也会有很大差异。我在火星网站上问过这个问题,但没有得到好的答案。我想知道它是否与qemu有关。或者任何可以使模拟具有确定性的 qemu 选项/变体。我尝试使用 -icount auto ,但仍然存在一些变化。对于简单标量 eio 文件,我从未观察到任何变化。我将不胜感激。

4

2 回答 2

3

我没有使用 MARSS/QEMU,但我熟悉这个问题,通常使用模拟器和 SimpleScalar。

使完整的系统模拟器具有一般确定性是非常困难的。例如,如果您的程序打印一天中的时间,并且一天中的时间发生变化,则将遵循不同的代码路径。更一般地说,如果你正在做一个完整的系统模拟,并且时间 ls,那么操作系统和用户代码的确切交错将根据磁盘头的位置、磁盘缓存中有多少数据等而有所不同。更不用说什么系统上正在运行其他进程。

SimpleScalar eio(和工业模拟器)通过记录外部 I/O 事件的跟踪来提供确定性,以便以与以前运行完全相同的指令数应用于模拟。基本上,您只在录制时进行完整的系统模拟

您需要为 MARSS/QEMU 寻找类似的选项。不幸的是,我还没有找到这样的。

缺少这些...

但是我可以听到你说“我的程序不读取一天中的时间。它不应该每次都以完全相同的方式运行吗?” 也许是这样......但是(1)许多Linux图书馆在道德上相当于阅读时间。并且 (2) 还有其他进程在运行用户代码。

所以你需要控制运行。不要一直启动您的虚拟机(不是硬件虚拟机,我的意思是您在模拟器上运行的操作系统)。停止单用户。编辑 /etc/rc 以停止尽可能多的进程运行。完整的系统模拟与在真机上进行基准测试没有什么不同。在真实机器上,我们甚至可以在每次运行基准测试时重新启动机器。禁用(虚拟)网络。等等。

如果可以,不要在真正的操作系统上运行,而是在最小的监视器上运行。

但是,最好找到 I/O 跟踪重放工具。有时这些隐藏在调试器选项下。


这是 2008 年关于 qemu 中 I/O 重放补丁的参考。

http://wiki.qemu.org/Features/FaultTolerance - I/O 重放以提高可靠性/容错性。

QEMU 用户空间仿真可能更具重现性。我不知道它是否与 MARSS 一起使用


顺便说一句:再现性问题不仅仅与模拟器有关。它也与可靠性和调试有关。

您可能会找到一个通用的 Linux 重放工具,您可以使用它来使您的系统在 QEMU/MARSS 之上更具可重现性。


在 MARSS 中,您可以使用 ptlcall 检查点工具在您的基准测试(假设您正在运行 SPEC 等)完成大量初始 I/O 的点之后和下一个 IO 之前获取一个检查点。基准测试会执行大量初始 I/O,然后在用户代码中运行一段时间,然后执行一些最终 I/O。通过使用这些检查点,您可以避免随时间变化的系统调用。

同样的 Simpoints,http://www.marss86.org/~marss86/index.php/Simpoints


顺便说一句,我刚刚想起另一种方式程序可能是非确定性的(除了意外地依赖于时间或多处理器交互):它们可能显式地和内在地依赖于时间。

例如,Livermore Loops 基准测试的 langer98 版本乘以循环花费的时间,如果花费的时间不足,则增加循环计数。您可以在此处记录外部交互,例如时间和系统调用,并且该程序可能会变得可重现 - 但您不会准确测量它将在您的更新、更快的计算机上执行的操作。

相反:假设你有一个编译器优化开关,形式为“应用这个非常昂贵的优化不超过 2 小时,然后停止......”

于 2012-05-02T01:50:09.523 回答
0

QEMU 内置确定性记录和回放

QEMU 2.9.0 现在通过保存外部输入具有确定性记录和重放,但它暂时被破坏:如何使用 QEMU 的确定性记录和重放功能进行 Linux 内核启动?

主要文件有:

于 2017-10-29T02:25:56.230 回答