【问题标题】:how to flush cpu cache from bash?如何从bash刷新cpu缓存?
【发布时间】:2016-04-27 11:16:48
【问题描述】:

我想知道是否有办法从 bash 中刷新 cpu 缓存?我注意到here 上有一个解决方案,但我不明白他的 ruby​​ 代码以及这是否是刷新缓存的正确方法。

【问题讨论】:

  • 为什么要刷新 CPU 缓存?您可能无法在任何多任务操作系统上完全实现它,因为可能会有一个上下文切换,它会更改您将在返回时获得的 CPU 缓存的哪一位,或者使您开始刷新的内容无效.
  • @RowlandShaw 我正在对文本语料库中的程序(训练模型)进行计时。该程序以较低的建模复杂性开始,并逐渐增加复杂性。我通过设置一个参数来增加复杂性,该参数放在一个 bash 脚本中的 for 循环中,复杂性从低到高。问题是每个复杂性级别报告的时间必须好像缓存中没有任何内容[以便在不同复杂性之间进行公平比较]。
  • 您不需要了解 Ruby 代码。该代码只会生成大量 NOP 和无用的 XOR。您可以通过 while 循环和几乎什么都不做 200000 次来模拟相同的效果。
  • @manzur 我明白了,但为什么这应该有效?更清楚地说,为什么这可以保证整个缓存内容都充满了新的东西?
  • @user3639557 该代码不能保证缓存将被刷新。刷新取决于您的 CPU 及其驱逐策略。但是,有用于 x86 的 CFLUSH 指令。此外,这篇文章看起来与您的相关:stackoverflow.com/questions/1756825/…

标签: bash caching cpu-cache


【解决方案1】:

你可以试试这个命令:

sync && echo 1 > /proc/sys/vm/drop_caches

来自the documentation on kernel.org

drop_caches

写入这将导致内核删除干净的缓存,以及 可回收的slab对象,例如dentries和inode。一旦掉落,他们的 内存变得空闲。

释放页面缓存:echo 1 > /proc/sys/vm/drop_caches

释放可回收的slab对象(包括dentries和inode): 回声 2 > /proc/sys/vm/drop_caches

释放slab对象和页面缓存: 回声 3 > /proc/sys/vm/drop_caches

这是非破坏性操作,不会释放任何脏对象。 要增加此操作释放的对象数量,用户可以运行 写入 /proc/sys/vm/drop_caches 之前的“同步”。这将最小化 系统上脏对象的数量并创建更多候选对象 掉了。

此文件不是控制各种内核缓存增长的手段 (inode、dentries、pagecache 等...)这些对象是自动 当系统的其他地方需要内存时由内核回收。

使用此文件可能会导致性能问题。因为它丢弃了缓存 对象,它可能会花费大量的 I/O 和 CPU 来重新创建 掉落的物体,尤其是在大量使用时。因为这, 不建议在测试或调试环境之外使用。

【讨论】:

  • 这不是CPU缓存,而是页面缓存和VM缓存。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多