我正在使用来自番石榴库的CacheBuilder和LocalCache,但在getAllPresent的300-400毫秒左右存在一些性能问题p99.9延迟。
在p99和p99.9之间,请求的延迟几乎翻了一番(p99约为150毫秒)

使用以下配置:
refreshAfterWrite的时间为120秒,maxsize设置为2e6,有效期为24小时,初始容量为1e6。没有使用removeListener,也没有expireAfterWrite。 ConcurrencyLevel 256(尝试不同的值)。机器有12个核心。
使用缓存时,它具有8e5至1.2e6之间的条目。
使用模式是getAllPresent,用于p99.9上的约3k键和约100 qps。

键是hashCode的复杂对象,那里提供的所有字段都使用Objects.hash方法。我尝试使用其他哈希函数来确保分布均匀(murmur3显示相似的结果)。因此,问题不在冲突中。

关于如何调整它以提高性能的任何指示?

最佳答案

我要说的是,在Java中,将99%的tile翻倍为90%tile,将99.9%的tile翻倍为99%tile是有效的。如果您看到这种模式,则需要从整体上降低操作成本,以减少延迟,即,不太可能会有一些快速的胜利对您有所帮助。

注意:当您有一个较大的缓存并对其进行扫描时,可以预期每个条目至少涉及一个或两个L3缓存未命中。这将是昂贵的。对于适合您的CPU缓存的小型缓存,它将快很多倍。

我将使用探查器来减少此操作的CPU和内存分配,或者更改调用缓存的方式以执行所需的操作,这也将降低99.9%的平铺率。

08-28 05:01