如何调整应用程序服务器中的缓存

时间:2009-01-17 19:20:38

标签: performance language-agnostic caching

我们的客户每个应用服务器有数百个项目。

每个项目都有自己的元数据描述符(内存大约1MB,从DB加载大约1秒)。 元数据用于在各个方面(权限,有效字段,字段值等)验证对服务器的每个请求。我们严重依赖于此元数据。

为了节省查询数据库的时间,我们决定实施缓存机制(使用EHCache)来存储项目的元数据。我们想要正确调整缓存。

我想知道,调整缓存属性的技巧是什么(总大小,对象数量,疏散策略......)

例如,是否应释放一段时间未访问过的对象以节省内存?如何选择驱逐策略(例如LRU,MRU)?

我们确实拥有一个经验丰富的负载测试团队和来自客户的大量数据(项目数量,平均元数据大小等等),因此构建负载测试环境应该不是问题。我只是不确定我到底应该寻找什么?

请分享您的缓存调优体验。

由于

2 个答案:

答案 0 :(得分:4)

关于缓存的关键数据非常简单......缓存未命中率。你想要计算某人询问缓存的次数,以及缓存中没有“某些东西”的次数,后者除以前者的是你的未命中率。

这就是它。找到一种可靠的方法来衡量您的应用程序,其他一切只是运行测试。每次调整时,在实际情况下加载测试以检查未命中率的变化。可用参数过于依赖于您问题的具体细节。

我通常会从LRU开始,增加大小,直到我开始看到未命中率的收益递减,然后尝试相同大小的LFU以查看它的比较。当然,除非你碰巧知道你的病例是LRU病态的。

答案 1 :(得分:1)

最佳驱逐策略可能在很大程度上取决于具体数据及其使用方式。

以下是一些通用示例:

新闻内容 - 文章每天都会添加,很少会被修改 - 缓存用于减少对数据库服务器的需求。驱逐策略应该围绕许多读取而定制,但几乎没有写入。

论坛主题(可能不是最好的例子) - 驱逐策略应围绕许多读取而定制,但也应围绕频繁写入。

虽然可以使用最近最少使用(LRU)逐出策略来最佳地配置新闻内容,但是该示例中的论坛线程可以使用最少使用(LFU)逐出策略来更优化地配置。当添加新消息时,论坛线程的缓存无论如何都需要经常被替换,但是,LFU策略会将最活跃的线程保留在缓存中。