我希望能够控制应用程序对另一个进程的时间感知。这意味着我希望能够快进时钟。无论是加速还是步进,都可以接受(尽管步进会更安全、更容易)。
我知道有faketime
,但这不适合我的需求,因为它无法处理诸如调用sleep(10)
或 之类的场景epoll_wait(,,,10000)
,然后在阻塞时将时钟提前 15 秒。在这种情况下,调用仍需要 10 秒才能完成。这是有道理的,因为这些是系统调用,因此内核正在跟踪经过的时间。
最终我想做的是通过应用程序重放记录的网络流量。在处理每个记录的事件时,应用程序需要查看该事件,就好像自上一个事件以来实际已经过去的时间量一样。这意味着如果日志在 处有一个事件,00:01:00
在 处有另一个事件00:01:07
,则在重播时应用程序需要认为已经过去了 7 秒(绝对时间并不重要,只是相对时间)。由于此流量可能已记录数小时,因此我不想花那么长时间来执行重播。因此,我们的想法是在每个空闲周期内快进时钟,就好像该时间已经自然过去一样。这些“空闲期”可能只有几毫秒长(一个可能的例子是大约 80 毫秒),但它们的数量有数千到数百万。
我怀疑我可能不得不求助于在虚拟机内运行应用程序,然后从虚拟机外部控制虚拟机的时钟。这很好,但我无法确定是否有任何虚拟机管理程序能够做到这一点。
我尝试过简单地调整 Linux 内核的时钟,但这不能处理sleep(10)
上述情况(即使时钟跳过预定的结束时间,它仍然会休眠 10 秒)。