【k8s中pod服务cpu高,结合deepseek快速定位Caffeine使用不当为元凶】
·
排查过程
使用arthas 抓取问题线程,curl -O https://arthas.aliyun.com/arthas-boot.jar; java -jar arthas-boot.jar ,
启动arthas后输入命令dashboard,
将整个显示内容粘贴到deepseek
线程分析结论
线程noBeanNameSet-0-C-1是导致CPU高占用的核心原因,其CPU使用率达15.26%,远高于其他线程。该线程为Caffeine缓存库的后台维护线程,负责执行缓存清理、淘汰等任务。
不合理配置示例
以下配置会导致频繁哈希表扩容,引发CPU资源消耗:
Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.DAYS)
.initialCapacity(100)
.maximumSize(10000)
.build();
配置缺陷
initialCapacity(100)与maximumSize(10000)差距过大,导致频繁扩容- 长过期时间(1天)使缓存条目长期存活,增加维护负担
- 固定大小限制引发频繁淘汰计算
优化方案
@Bean
public Cache<String, Object> caffeineCache() {
return Caffeine.newBuilder()
.expireAfterWrite(4, TimeUnit.HOURS) // 缩短过期时间
.initialCapacity(10000) // 预分配足够空间
.recordStats() // 开启监控
.build();
}
优化要点
- 移除
maximumSize避免淘汰计算开销 - 初始容量设置为预期最大容量
- 缩短过期时间至业务合理范围
- 添加监控便于后续调优
验证方法
- 通过Arthas的
dashboard命令观察优化后CPU占用 - 使用
vmtool命令检查缓存实例状态 - 监控缓存命中率等指标
更多推荐


所有评论(0)