【问题标题】:How to make a Java Application faster?如何让 Java 应用程序更快?
【发布时间】:2013-05-04 18:10:03
【问题描述】:

我有一个计费守护程序,它必须以非常快速的方式处理数十万条数据。我为并行处理实现了ExecutorSerivce。它确实提高了速度,但不是很多。处理 1,00,000 条记录大约需要 2.5-3 小时。我怎样才能让它更快,比如在半小时内处理这些数据?

我写了以下执行设置:

-Xms2048M -Xmx2048M -XX:MaxPermSize=256m

我尝试实现一个生产者消费者模型,其中包含 1 个生产者和 4 个消费者。每个列表可以包含 10,000 条记录。

ArrayBlockingQueue<BillableList> list =new ArrayBlockingQueue<BillableList>(10);

ExecutorService threadPool = Executors.newFixedThreadPool(5);
threadPool.execute(new Consumer("pool1", list)); 
threadPool.execute(new Consumer("pool2", list));
threadPool.execute(new Consumer("pool3", list));
threadPool.execute(new Consumer("pool4", list));
Future producerStatus = threadPool.submit(new Producer("Producer", list)); 
producerStatus.get(); 
threadPool.shutdown(); 

在将记录更新到数据库时,我还会收到很多“超出数据库锁定等待超时”异常。是不是因为不同的消费者同时尝试为同一个用户?如何让不同的消费者从ArrayBlockingQueue的列表中获取不同的数据?

【问题讨论】:

  • 第 1 步:找出运行缓慢的原因。记录高级操作的执行时间,使用分析器,进行 GC 日志记录以查看您是否正在浪费内存...
  • 为数据库获取一个非常快速的 SSD 阵列。
  • 还有~purrrrformance~~~~

标签: java multithreading


【解决方案1】:

对此唯一可能的答案是“使用分析器并找出它为什么很慢”。当你不知道问题出在哪里时,你就无能为力。你打算做什么,选择一个随机函数并对其进行微优化?探查器数据或什么都不会发生。

【讨论】:

  • 唯一可能的答案?真的吗?
  • @Gray:您的回答主要是猜测。猜测是你所能做的,这表明我所说的是正确的。
  • 推测是这样,但“运行分析器”是一个简单的答案——尤其是当 OP 谈到数据库争用时。
  • 这也是准确的答案。
【解决方案2】:

我怎样才能让它更快,比如在半小时内处理这些数据?

如果添加线程没有帮助,那么您可能受到的限制不是我的 CPU,而是其他一些因素。很可能是磁盘或网络 IO。如前所述,分析您的代码应该向您展示罪魁祸首。

在将记录更新到数据库时,我还会收到很多“超出数据库锁定等待超时”异常。

还有你的大线索。不管有多少线程在处理一项工作,如果它们都在等待数据库,那么添加线程并不会使其更快。

这里有一些想法:

  • 提高数据库盒的物理速度。 SSD 可以为 IO 密集型操作提供惊人的改进。由于磁盘缓存,增加内存也可以带来很大的好处。
  • 考虑将数据分片并写入多个数据库实例。鉴于您的架构,这可能是不可能的。
  • 考虑在每约 100 次左右的操作后关闭自动提交和手动提交。
  • 注意索引。如果您正在执行某种批量加载,通常如果您关闭索引,您的插入将运行得更快。在最后添加索引需要一段时间,但仍然是一个胜利。
  • 此外,如果您正在执行查询,请确保在需要的地方有良好的索引。检查您的数据库日志,看看哪些查询花费的时间太长,以查看您是否在关键位置缺少某些索引。

【讨论】:

  • @Gray.. 系统在 Amazon EC2 上,mysql 数据库在 RDS 上。查询需要 10 秒才能检索 10,000 条记录!我会试试探查器,看看里面发生了什么!谢谢.. !!
  • 分析器是个好主意,但我不确定这是否会有很大帮助。您将看到它在 JDBC 中花费时间,这意味着等待数据库连接。祝你好运@MadanMadan。
  • @Gray - 是的,这是一个扣篮。如果它是一个联网的数据库,或者托管在一个微调器上,那么你就是 stuff。
  • @Gray.. 你刚刚击中了正确的目标!!我该如何改进它?任何建议! JDBC 部分!!
  • 我会发布另一个问题@MadanMadan,专门围绕提高 RDS 的性能。先做你的研究。它们可能是您可以改进的地方。但是,如果您要检索大量 10k 记录结果集,则可能需要更改架构。
猜你喜欢
  • 2017-08-17
  • 2011-02-13
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多