performance - 系统/操作系统缓存与应用程序缓存

标签 performance caching memory-management operating-system

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

例如,one article (引用 Solr)主张为操作系统缓存留出内存:

The OS’s cache is really useful, it decreases significantly the time required to answer a query (even after completely restarting the server!), so always remember to keep some memory free for the OS.



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

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

对于是为应用程序级缓存分配可用内存,还是让该内存可用于操作系统级缓存,存在哪些通用准则?

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

最佳答案

最终答案始终是 先测量 ,分析,然后优化。在带缓存和不带缓存的分析器下运行您的应用程序,看看有什么区别。直接观察是无可替代的。

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

  • 用时间换内存。所涉及的时间可能是 I/O 时间,也可能是 CPU 时间。
  • 用工作集内存的峰值来换取更小、更长期的工作内存增长。

  • 因此,针对您的具体情况,您需要提出以下问题。
  • 如果没有缓存,您的应用程序 I/O 是否受限?如果您将 98% 的时间花在处理数据上,而只有 2% 的时间在寻找它,那么无论缓存多么有效,它都不会对您有多大帮助。 (在这种情况下,完美高效的缓存只会将您的性能提高约 2%。)
  • 缓存命中避免了多少工作?如果缓存命中避免了单个 fread()调用,那么缓存可能对您没有太大作用。但是,如果缓存命中避免随机遍历数百个非常大的文件块,那么它可能会为您节省大量时间。它还可以在操作系统的磁盘缓存中为您节省大量空间,使该内存可用于其他操作系统操作。
  • 缓存命中率是多少?
  • 需要多大的缓存才能获得良好的命中率(通常在 75% 以上)?如果答案是数百兆字节,那么您不妨让操作系统的磁盘缓存为您完成工作。

  • 使您的应用程序的这些方面可配置(是否使用缓存,为缓存留出多少内存等)通常非常有帮助,并使用设置来查看什么最适合给定设想。

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

    同样,没有什么可以替代分析您的代码。

    关于performance - 系统/操作系统缓存与应用程序缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13091453/

    相关文章:

    php - 负载均衡器后面的 SilverStripe

    c - memcpy 性能与字节移位

    c - Next Fit 内存分配问题

    ios - iOS-有什么方法可以在静态库中收到内存不足警告?

    sql - 从 SQL Server 中的 VARCHAR 中删除非数字字符的最快方法

    python - Numpy 双重求和

    django - 已使用不同的查询集进行查找

    c# - 在winform中创建一个本地数据库并在后台从服务器获取数据

    html - 在网站上,加载图像更快还是 css 代码?

    python - 加速 Python 脚本的 for 循环