系统/ OS缓存与应用程序缓存

时间:2012-10-26 17:15:47

标签: performance caching memory-management operating-system

开发使用压缩磁盘索引或磁盘文件的应用程序时,重复访问索引或文件的某些部分(为了论证,让我们说类似于Zipfian发行版),我想知道什么时候是它足以/更好地依赖于OS级别的缓存(例如,在Debian系统上的内存映射),以及什么时候在应用程序层上实现某些东西更好(例如,像FileChannel缓冲或Memcached或者Java代码中的自定义LRU缓存。)

例如,one article(参考Solr)主张为OS缓存留出内存:

  

操作系统的缓存非常有用,它大大减少了回答查询所需的时间(即使在完全重启服务器之后!),所以请记住为操作系统保留一些内存。

这让我想知道我的应用程序级缓存是否填充内存与弱映射到LRU Java对象的弊大于利,尤其是。由于Java在内存开销方面非常贪婪...而不是使用该内存来缓存一些最终结果对象,操作系统是否可以更好地使用该空间来缓存大量原始压缩数据?另一方面,应用程序层缓存更适合平台独立性,无论运行代码的操作系统是什么,都允许缓存。

所以我意识到除了运行几个特定的​​基准之外,我不知道如何以原则的方式回答这个问题。这让我想问......

关于是为应用程序级缓存分配可用内存还是将该内存留给操作系统级缓存,有哪些一般指导原则?

特别是,我希望能够更好地识别编写应用程序级缓存是浪费时间,甚至是对性能有害。

1 个答案:

答案 0 :(得分:3)

最终答案始终是先测量,进行分析,然后进行优化。在有和没有缓存的分析器下运行您的应用程序,看看有什么不同。直接观察根本没有替代品。

话虽如此,有一种原则性的方式来思考你的问题。想想缓存可以为您做什么:

  • 记忆的交易时间。所涉及的时间可能是I / O时间,也可能是CPU时间。
  • 交换工作集内存的峰值,以减少更长期的工作记忆。

因此,根据您的具体情况,您需要提出以下问题。

  • 没有缓存,您的应用程序I / O是否绑定?如果你花费98%的时间来咀嚼数据而只花费2%的时间来寻找数据,那么无论多么高效,缓存都无济于事。 (在这种情况下,完全有效的缓存只会使您的性能提高约2%。)
  • 缓存命中可以避免多少工作?如果缓存命中避免单个fread()调用,那么缓存可能不会为您做很多事情。但是,如果缓存命中避免随机遍历几百个非常大的文件块,那么也许它可以为您节省大量时间。它还可以为操作系统的磁盘缓存节省大量空间,使该内存可用于其他操作系统操作。
  • 缓存命中率是多少?
  • 你有多大的时间让缓存获得良好的命中率(通常高于75%)?如果答案是数百兆字节,那么您可以让操作系统的磁盘缓存为您完成工作。

使应用程序的这些方面可配置(无论是否使用缓存,为缓存预留多少内存等等)以及使用设置进行播放以查看最佳效果是非常有用的。对于给定的场景。

目前最有趣的发展之一是固态硬盘的可用性。这些驱动器的吞吐量不如更好的主轴上的速度快,但随机访问通常很出色。这肯定会改变一切。

同样,对您的代码进行分析无可替代。