使用 time 命令时如何禁用缓存?

使用 time 命令时如何禁用缓存?

当在进程/应用程序上运行时,它似乎总是缓存结果/进程,因此没有给出real进程的时间。

我试过:

sync; time process

sync -f; time process

但它似乎并没有真正禁用缓存。

通过重复运行或,time process如上面的示例,可以注意到运行时间发生了变化(我怀疑是因为缓存)。sync -f; time processsync; time process

有什么方法可以真正禁用缓存以提供实时进程吗?

答案1

time显示其子进程的资源使用情况(由内核测量);它用getrusage这样做(在 Linux 上,这是使用wait4。它测量正在测量的特定执行所使用的实时时间。

您看到的变化反映了流程执行期间发生的变化。它们有多种原因,通常涉及一种或另一种资源争用。与任何基准测试一样,time仅在预定义的场景中使用才有意义。

尝试在没有任何外部影响的情况下测量命令的执行时间是(大部分)可能的,但需要大量的设置工作。在 Linux 上,您可以提前刷新所有磁盘缓存:

echo 3 > /proc/sys/vm/drop_caches

(运行进程的效果不会缓存在其他任何地方,除了一小部分缓存在 CPU 缓存中,除非进程本身执行自己的记忆,以便再次运行时它会做更少的工作 -例如一个带有ccache.您可能知道您自己的应用程序是否这样做。)

您还可以在专用 CPU 上运行您想要测量的命令,否则内核不会使用它,因此它不会受到中断或重新调度的影响,并且受缓存刷新的影响较小。其他需要记住的因素包括 CPU 频率变化、超线程、地址空间随机化......

我的一位同事 Victor Stinner 写了一篇文章他关于基准测试主题的笔记和链接,专注于Python基准测试;提供一组很好的调整的链接是Denis Bakhvalov 在 Linux 上获得一致结果的指南

答案2

您可以尝试完全禁用脏缓存,尽管这可能会导致非常不愉快的影响,即您的写入速度可能会受到严重影响,因为它们允许内核优化写入操作,例如:

sudo sysctl vm.dirty_background_bytes=4096
sudo sysctl vm.dirty_bytes=8192

关于缓存的一篇很好的文章:https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

相关内容