【问题标题】:Potential problems with a multithreaded, computation intensive application多线程、计算密集型应用程序的潜在问题
【发布时间】:2011-03-20 13:39:09
【问题描述】:

我一直在从事一个可以概括为“计算密集型分析工具”的项目,我选择编写代码,以便使用多个线程并行处理多个单独的计算。

由于缺乏多线程项目编程经验而出现一系列问题后,看来我终于设法让它按我的预期工作了。从队列中逐一挑选计算,并同时进行处理。在a particular advice(关于适当的线程数)之后,我得到了对a previous question的回应,我已经设置了一个线程填充进程队列,而池中的其余线程从队列中获取进程演替。在我的 8 核 i7 机器上,我使用了 1 个生产者 + 8 个消费者 = 9 个线程。

现在我的问题如下:

当一切都按预期工作时,机器的 CPU 使用率达到顶峰也就不足为奇了。我一直在通过 Gnome System Monitor 跟踪 CPU 使用情况,在软件的分析阶段,内核似乎处于 90-100% 的负载。除了减慢同时运行的其他程序(例如浏览器、邮件、pdf 阅读器等)之外,还有其他我应该注意的潜在问题吗?例如,高负载会在 JVM 中创建任何工件吗?

考虑到我的软件旨在作为科学分析工具而不是常规桌面应用程序运行,我愿意接受减慢其他程序的速度,但我想知道是否还有其他问题我应该注意.非常欢迎任何实际示例或以前的经验。

提前致谢,

【问题讨论】:

    标签: java multithreading cpu-usage


    【解决方案1】:

    如果这是一项计算密集型任务,那么我发现以后台优先级运行此类任务很有用。除非任务是内存密集型并导致大量分页,否则这应该允许其他进程在很大程度上不受阻碍地运行,同时仍然允许计算进程获得实际可用 CPU 的最大份额。如果您在 Windows 上运行,则有时 GUI 会变得无响应,并且很难终止进程或完成其他工作。 (Unix/Linux 在这方面更好,但它仍然会让人恼火。)

    您确实希望确保您不会使用太多内存,以至于您的机器开始疯狂地交换。

    【讨论】:

    • 这种内存消耗在 Java 中是可能的吗?内存池的大小在启动时不是固定的吗?
    • 可悲的是,这也是一个占用大量内存的过程(大量的集合到处乱飞)。我确信我可以尝试在一定程度上优化内存使用,但我认为我不能低于几百兆。至于运行其他程序,我认为问题不大;我现在正在运行一个大型测试,单个程序(如 firefox)和系统本身似乎都非常敏感。我还没有机会彻底分析软件,但是一旦我这样做了,我就可以尝试看看内存消耗在运行时是如何变化的。
    • 在java中内存大小是在启动时指定的,但是你可以将它设置为一个非常大的数字。
    • 在java中内存大小是在启动时指定的,但是你可以将它设置为一个非常大的数字。
    • 小更新:软件最多吃掉1.5G左右内存,全程执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多