Ignite缓存第三方MySQL表loadCache性能异常排查咨询
首先看了你贴的配置,发现几个明显的疏漏,再结合性能问题给你梳理排查方向:
一、必须修正的配置错误
1. 驱逐策略MaxSize严重设置错误
你期望缓存10万条数据,但配置里的LruEvictionPolicy的maxSize设成了100:
<bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicy"> <property name="maxSize" value="100" /> </bean>
这会导致缓存刚加载几条数据就触发驱逐,进入"加载-驱逐"的死循环,完全无法有效缓存,速度自然极慢。赶紧改成:
<property name="maxSize" value="100000" />
2. Client Mode限制了加载性能
你设置了clientMode=true,客户端节点本身不存储缓存数据,所有加载请求都会转发到服务端节点,额外增加了网络开销。如果是要预加载缓存,建议在服务端节点上配置并触发加载,或者调整客户端的线程池参数(比如publicThreadPoolSize)来提升并发能力。
3. 并行加载参数未合理配置
你的parallelLoadCacheMinimumThreshold=20只是开启并行加载的阈值,但没有指定并行线程数。默认的并行线程数是Ignite的publicThreadPoolSize(通常是CPU核心数*2),对于320万级别的数据,这个并发度不够。可以在CacheJdbcPojoStoreFactory里显式设置:
<property name="parallelLoadCacheThreads" value="16" /> <!-- 根据CPU核心数调整,比如8核设16 -->
4. 数据源连接池配置缺失(推测)
你没贴datasource的配置,但如果连接池的最大连接数太小(比如默认的10),并行加载时会出现连接等待,严重拖慢速度。确保你的数据源连接池设置足够的连接数:
<!-- 以Druid为例,其他连接池类似 --> <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 其他配置略 --> <property name="maxActive" value="50" /> <property name="minIdle" value="10" /> </bean>
二、排查方向
1. 先确认数据库层面的性能瓶颈
Ignite加载数据的速度首先取决于数据库查询的速度:
- 执行
SELECT * FROM crm.CRM_SEGMENT,看数据库返回320万条数据的耗时,如果本身就超过几分钟,那问题在数据库侧。 - 确保
USER_ID(你的缓存键)有主键索引,避免全表扫描;如果加载时有过滤条件,也要给对应字段加索引。
2. 检查Ignite节点日志
查看Ignite的日志文件,重点找以下内容:
- 有没有
Waiting for JDBC connection之类的连接池等待日志 - 有没有慢SQL的记录(可以开启JDBC驱动的日志,比如MySQL的
logger=com.mysql.cj.log.Slf4JLogger) - 有没有线程阻塞、锁竞争的报错
3. 监控JVM线程状态
用jstack命令导出Ignite节点的线程栈,查看:
- 有没有大量处于
WAITING状态的线程(比如等待JDBC连接) - 并行加载相关的线程(名称包含
public-pool)是否在正常运行
4. 调整预加载方式
如果是手动调用cache.loadCache(),建议在服务端节点执行,避免客户端到服务端的网络转发开销。另外,可以考虑分段加载,比如按USER_ID分批次加载,避免一次性全表扫描的压力。
5. 验证On-Heap缓存配置
你开启了onheapCacheEnabled=true,这会在堆内额外维护一份缓存副本。如果你的堆内存不足,可能会触发频繁GC,拖慢加载速度。可以暂时关闭这个配置,或者设置heapCacheMaxSize限制堆内缓存大小,观察性能变化。
内容的提问来源于stack exchange,提问作者Neron

