记一个压测写入数据问题

105 阅读1分钟

经常有小伙伴在压测过程中出现线程池队列爆满,最终服务被内存无情OOM的悲惨结局。 我这里项目上线前也出现了这样的问题,还原场景如下:在insert记录任务中,常常把几百条数据合成一条大sql插入到数据库,数据库本身已经做好了分库分表,这种大sql的任务丢到线程池中,该如何配置线程池呢? 主要问题在线程队列中,假设队列长度1w,每一批数据500条,队列里最大值将有500w条数据,内存大约要占用2个G(视情况而定,估计值),而你配置的堆大小要注意了,如果是2个G随时挂掉,如果是4个G,那么注意你的堆的方式,复制算法的话也有oom的风险,这种时候要考虑以下几点:

  适配你的数据库写入能力 与 线程池队列内存大小 与 线程的工作能力

数据库写入能力一般和机器内存+cpu正相关,应该可以获取到这一数值。 线程池队列大小要根据单条任务的内存量来,当达到 预警值 时打日志或者介入其他工具来完成报警。 线程的工作能力和cpu能力直线相关,线程是java中比较宝贵的资源,合理调整个项目的线程资源,观察系统中线程随着项目各模块状态要进行调整,最好可以将这些资源放到配置文件中进行适时拉取,滚动更新。