2012-10-26 205 views
1

在开发可以重复使用索引或文件的部分索引或文件的压缩磁盘索引或磁盘文件的应用程序时(出于参数的原因,让我们假设类似于Zipfian发行版),我想知道什么时候足够/更好地依赖OS级缓存(例如,在Debian系统上进行内存映射),以及何时在应用层上实现某些内容更好(例如,类似于FileChannel缓冲或Memcached或Java代码中的自定义LRU缓存)。系统/操作系统缓存与应用程序缓存

例如,one article(参考SOLR)是主张保留可用内存为OS-缓存:

操作系统的缓存是非常有用的,它显著降低应答查询所需要的时间(即使完全重启服务器!),所以一定要记住为操作系统保留一些内存空间。

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

因此,我意识到我不知道如何以原则的方式回答这个问题,除了运行几个特定的​​基准测试。这导致我问...

有什么一般指导原则存在是为应用程序级缓存分配可用内存还是为OS级缓存留下该内存?

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

回答

1

最终答案总是先测量,分析,然后优化。在有和没有缓存的情况下在分析器下运行您的应用程序,并查看差异。根本无法替代直接观察。

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

  • 记忆的交易时间。涉及的时间可能是I/O时间,也可能是CPU时间。
  • 为工作记忆的更小,更长期的增加而在工作集记忆中交易峰值。

因此,针对您的情况,您需要提出以下问题。

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

使应用程序的这些方面可配置(无论是否使用缓存,为缓存留出多少内存等)以及使用设置播放来查看内容通常非常有帮助对于给定的场景最适合。

这些天最有趣的开发之一是固态硬盘的可用性。这些驱动器的吞吐量并不像在更好的主轴上那么快,但随机访问通常是非常优秀的。这绝对会改变一切。

再一次,没有替代分析您的代码。

+0

还有一些工具可以帮助您衡量代码的性能和效率。 Traceview http://developer.android.com/tools/help/traceview.html和ARO http://developer.att.com/aro在帮助查看可以改善应用性能的位置方面非常有用。 –