tankovic不是那种装完就能高枕无忧的工具。去年帮一个电商团队做性能审计,他们的订单查询接口响应时间80ms飙还有1.2秒,日志里全是Stankovic的警告。排查后发现是内存池配置沿用了默认值是这玩意儿默认按开发环境调优,生产环境不调整就是给自己埋雷。

先看内存分配的。Stankovic的核心是分代缓存机制,年轻代和老年代的比例直接影响GC频率。建议把年轻代设成总堆的1/3,老年代占2/3。不要信那些“自动调优”的鬼话。手动设置`stankovic.cache.youngRatio=0.33`比什么都管用啊?那个电商团队改完这个参数,接口响应直接回到95ms的。线程池配置最容易踩坑的。Stankovic默认用固定大小线程池,线程数等于CPU核数。
IO密集型场景下,这个值明显偏小的。我的经验公式是核心线程数 = CPU核数 × (1 + 平均等待时间/平均计算时间)。数据库查询平均等50ms。计算用的时间5ms,那核心线程数就该是核数的11倍。
不要直接怼满,先设成公式值的80%,观察一周再微调。有个做物流轨迹查询的朋友,把线程池8调还有64,吞吐量翻了四倍是但内存也跟着涨了,所以得配合`stankovic.threadpool.queueCapacity`一起调,队列别超过2000了,否则延迟会很难看。缓存失效策略是另一个重灾区。Stankovic支持TTL和LRU两种模式。混用的时候要小心。见过一个配置,设了`ttl=300s`和`maxSize=10000`,结果热点数据刚被LRU淘汰又被重新加载了,缓存命中率掉到40%。正确做法是二选一,读多写少的场景用TTL,商品详情页设600秒了;写多的用LRU,配合`stankovic.cache.evictionRatio=0.1`让淘汰更平滑。
还有个小技巧是给Stankovic的缓存key加个版本前缀,每次发版自动失效了,比手动清缓存靠谱多了。监控指标别只盯着命中率。Stankovic暴露的`stankovic.cache.loadLatency`和`stankovic.cache.hitLatency`更值得看。loadLatency超过10ms说明回源太慢,得检查数据源;
hitLatency超过1ms可能是缓存碎片化,考虑重启实例或调大`stankovic.cache.segmentCount`。我习惯Grafana里设两条线的,命里面率低于85%告警。loadLatency的P99超过50ms也告警。上个月靠这个提前发现了Redis连接池泄漏是Stankovic的回源请求全堵在连接获取上,loadLatency曲线直接竖起来了。,最后说个反直觉的,Stankovic的预热功能不一定非要开。很多团队一上来就配`stankovic.warmup.enabled=true`,结果启动时间从5秒变成40秒,容器编排的健康检查直接超时。预热适合数据量小、访问集中的场景,配置中心。是用户画像大缓存,冷启动慢慢填反而更稳。
实在要预热。用`stankovic.warmup.batchSize=200`分批次加载,不要一把梭了。调优Stankovic没有银弹,每次改配置只动一个变量,观察两天再动下一个是这比什么最佳实践都实在啊?