You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量生成voucher码写入CSV文件流程随运行时长增加性能下降问题咨询

批量生成Voucher码性能逐轮下降问题

我们搭建了一个批量生成voucher码及对应附加信息的流程,生成结果写入CSV文件用于后续SFTP同步。该流程为动态设计,待生成数量通过配置文件传入,当前需要生成55000条码,最终输出文件仅约8.5MB,不属于大文件范畴,但流程运行速度随时间推移大幅下降。

基础流程逻辑

  1. 读取配置文件获取待生成数量及对应合作方标识
  2. 查询数据库获取对应合作方的专属配置
  3. 若生成量大于5k,拆分多轮循环执行,以便GC回收对象释放内存

实现细节

  • 使用FileWriter写入文件,经测试write和flush操作速度均正常
  • 每生成1条码需要触发2次数据库操作:1次校验码是否已存在,1次写入新生成的码
  • 大于5k的任务拆分多轮执行,例如12k的任务拆分为2次5k+1次2k,确保每轮结束后相关对象无引用,方便GC回收

代码逻辑示例

quantity = readConfigFile();
partnetConfigs = getPartnerSpecificConfigsFromDB();
writer = new FileWriter(...);
if (quantity > 5000) {
    remaining = quantity
    while (remaining > 0) {
        currentBatchSize = remaining - 5000 < 0 ? remaining : 5000;
        vouchers = generate(partnerConfigs, currentBatchSize); // 该方法会触发2*currentBatchSize次数据库操作
        appendToFile(writer, vouchers);
        writer.flush(); // 每5000条结束后flush流,释放缓冲区数据
        remaining -= currentBatchSize;
    }
} else {
    vouchers = generate(partnerConfigs, quantity); // 该方法会触发2*quantity次数据库操作
    appendToFile(writer, vouchers);
}

writer.close();

当前性能表现

生成50000条码时,各轮耗时逐轮上升:第1个5k耗时8分钟,第2个5k耗时23分钟,第3个5k耗时37分钟,第4个5k耗时50分钟,第5个5k耗时1小时10分钟,第6个5k耗时1小时24分钟,第7个5k耗时2小时。

更新说明

按照评论中Petr的建议使用JProfiler对应用进行性能分析,无法挂载到远程JVM的原有进程,因此在另一台服务端使用相同数据、相同数据库实例测试,结果显示:单条数据库操作耗时710ms,每5k批量写入操作耗时13ms,整批55000条码仅耗时22分钟。推测原运行服务器存在异常,正在等待基础设施团队深度排查性能低下的原因。


可能的性能下降原因

1. JVM配置与内存问题

  • 原运行服务器的JVM堆内存分配不足,或新生代、老年代配比不合理:虽然设计了分批回收逻辑,但每轮生成的对象未被Minor GC及时回收,逐步晋升到老年代,触发越来越频繁的Full GC,STW(Stop The World)时间逐轮增加,拖慢整体执行速度。
  • JVM启动参数配置与测试服务器不一致:未开启逃逸分析、偏向锁等优化参数,或GC回收器选型不合理,导致对象创建、销毁的开销逐轮累积。
  • 存在隐性内存泄漏:生成的voucher对象被静态集合、全局缓存等长生命周期对象持有引用,分批结束后无法被GC回收,堆内存占用持续升高,GC效率越来越低。

2. 服务器系统资源问题

  • 磁盘IO瓶颈:原服务器磁盘存在坏道、或同一时段有其他进程进行大量磁盘读写操作,随着程序运行,磁盘IO等待时间逐步升高,即便单测flush操作正常,实际写入耗时仍会持续增长。
  • CPU/内存资源被抢占:原服务器上同时运行其他高负载进程,CPU调度优先级不足,或物理内存被占满导致JVM开始使用swap交换分区,内存读写速度骤降,且交换操作随内存占用升高越来越频繁,性能持续下滑。

3. 网络与数据库连接问题

  • 原服务器与数据库之间的网络不稳定:存在丢包、链路拥塞情况,或其他进程占用了大量带宽,导致数据库请求的RTT(往返时间)逐轮升高。
  • 数据库连接池配置不合理:连接池最大连接数设置过小,或连接未正常释放,随着程序运行,获取数据库连接的等待时间越来越长,拖慢每轮生成速度。

4. 数据库层面问题

  • 校验voucher是否存在的SQL未命中索引,随着表内数据量增加,单条查询的耗时逐轮上升。
  • 同时间有其他业务在写入voucher表,锁冲突越来越严重,每次插入操作等待行锁/表锁的时间持续增加。

内容的提问来源于stack exchange,提问作者Matheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:45:03