方案:我有一个示例应用程序和我有3个不同的系统配置 -
- 2 core processor, 2 GB RAM, 60 GB HHD,
- 4 core processor, 4 GB RAM, 80 GB HHD,
- 8 core processor, 8 GB RAM, 120 GB HHD
为了有效地利用我的应用程序的H / W能力,我想配置的没有。 在应用层面的线程。 但是,我只希望以后的系统能力的深入理解,才能做到这一点。
莫不是某种方式(系统/作案/工具)来确定参考最大系统威力和MIN没有。 线程它可以优化和无效率和性能的任何损失服务。 通过这种方式,我可以配置只为我的应用程序,它会做充分的正义和实现各自的硬件配置表现最好的价值。
Edited1:可以在任何一个请就如何/设置基线特定范围H W配置任何读盘。
Edited2:为了使它更直接-希望学习/了解的任何资源/写起来,我可以阅读一般/整体水平获得关于线程的CPU管理一定的了解。
Answer 1:
要使用的线程的最佳数目取决于几个因素,但可用的处理器大多是数量和如何CPU密集型的任务。 Java并发实践提出如下正式的公式来估算最佳线程数:
N_threads = N_cpu * U_cpu * (1 + W / C)
哪里:
- N_threads是最佳线程数
- N_cpu是prcessors,它可以从获得的数量
Runtime.getRuntime().availableProcessors();
- U_cpu是目标CPU利用率(1,如果你想使用全部可用资源)
- W / C是所述等待时间的比率来计算时间(0代表CPU结合的任务,也许10或100慢I / O任务)
因此,例如,在CPU受限的情况下,您将有尽可能多的线程的CPU(一些倡导使用数字+ 1,但我从来没有见过,它取得了显著差异)。
对于缓慢的I / O处理,例如网络爬虫,W / C可以是10,如果下载网页比处理它慢10倍,在使用100个线程将是有用的这种情况下。
但是请注意,有一个上限在实践中结合(用万线一般不会加快东西,你可能会得到一个OutOfMemoryError之前,你可以用正常的内存设置启动反正他们全部)。
这可能是,如果你不知道在您的应用程序运行环境,任何你能得到的最佳估计。 在生产中剖析应用程序可让您在微调设置。
虽然不是严格相关,您可能也有兴趣在Amdahl定律 ,其目的是测量最大加速,你可以从parallelising程序期望。
Answer 2:
我的建议是用于分配按机器的线程的数目提供的配置和命令行开关。 使用基于调用Runtime.getRuntime()启发式。availableProcessors()通过其他的答案在这里指出,在用户/管理员尚未明确不同配置的应用案例。 我强烈反对独家启发式基于线程到核心猜测,有以下几个原因:
大多数现代硬件朝着越来越暧昧类型的“硬件线程”的运动:SMT机型如Intel的超线程和AMD的计算模块复杂的公式(详情如下),并在运行时查询这个信息是很困难的。
大多数现代硬件具有Turbo功能基于活动核心温度和环境温度可以扩展速度。 随着涡轮增压技术的提高,速度(千兆赫)的范围内增长。 最近的一些英特尔和AMD芯片的范围可以从2.6GHz的3.6GHz的(单/双核活动),这与SMT结合可能意味着每个线程得到有效1.6GHz的(所有活动核心) - 在原设计的2.0GHz的吞吐量。 目前还没有办法在运行时查询这些信息。
如果没有一个强有力的保证您的应用程序将在目标系统上运行的唯一进程,然后盲目地消耗所有的CPU资源可能无法取悦用户或服务器管理员(取决于如果软件是用户应用程序或服务器应用程序) 。
有知道发生了什么事情的机器在运行时,其余内,没有与自己家里轧多任务内核更换整个操作系统没有可靠的方法。 你的软件可以尝试通过查询过程,并在CPU负载和这样的偷看,但这样做是复杂的和有用仅限于特定类型的应用程序(其中你可能有资格)进行猜测,通常受益于或需要升高或特权访问级别。
现代的病毒扫描程序,现在天通过设置现代的操作系统,如提供特殊的优先级标志的工作。 他们让OS告诉他们时,“系统空闲”。 操作系统立足于它的决定不仅仅是CPU负载:它也认为,可能已设置的电影播放器的用户输入,多媒体标志等,这是罚款,主要是空闲的任务,但不实用的CPU密集型任务,如你的。
每秒一次或半秒也许 - 分布式家庭计算应用程序(BOINC,Folding @ Home的,等等),通过查询运行的进程和系统CPU负载周期性工作。 如果不属于该应用程序的多个查询连续过程中检测负载然后应用程序将暂停计算。 一旦负载对于一些数量的查询变为低电平,将恢复。 多个查询,必要的,因为CPU的负载读数是臭名昭著的短暂尖峰。 还有注意事项:1,用户仍然鼓励手动重新配置BOINC适合他们的机器的规格。 2.如果BOINC是没有管理员权限运行的话,就不会知道其他用户(包括一些服务流程)启动的进程,因此它可能不公平地与那些对CPU资源的竞争。
关于SMT(超线程,计算模块):
大多数的SMT将作为硬件核心或线程这些天,这通常不是一件好事,因为在SMT系统上跨越每个核心缩放时几个应用程序最佳性能报告。 更糟糕的是,查询核是否是共享的(SMT)或专用往往不能产生预期的效果。 在某些情况下,操作系统本身根本不知道(的Windows 7是不知道AMD推土机的共享核心设计的,例如)。 如果你能得到一个可靠的SMT计数,然后拇指法则是计算每个SMT为半个线程CPU密集型任务,并作为一个完整的线程大多是空闲的任务。 但在现实中,SMT的重量取决于什么样的计算其做的,和目标架构。 英特尔和AMD的SMT实现表现几乎彼此相对的,例如 - 英特尔的是在运行装载有整数任务和并行分支OPS强。 AMD公司是在并行运行的SIMD和内存OPS强。
对于涡轮增压特点:
大多数CPU的这些天有非常有效的内置的Turbo支持,进一步减轻了来自全国各地的系统的所有核心缩放值获得的。 更糟的是,涡轮增压功能有时基于尽可能多的,因为它是在CPU负载系统的真实温度,所以塔本身的冷却系统会影响速度不亚于CPU规格做。 在一个特定的AMD A10(推土机),例如,我观察到它上两个线程运行在3.7GHz的。 当第三线程启动,并以3.4GHz的当第四开始下降到3.5GHz的。 由于它是一款集成了GPU中,也一路下降到约3.0GHz的时候四个线程加上GPU进行工作(在A10 CPU内部优先在高负载情况下的GPU); 但还是没能鼓起3.6GHz的2个线程和GPU活跃。 由于我的应用程序使用的CPU和GPU,这是一个重要的发现。 我能够通过限制处理两个CPU限制的线程(其他两个共享内核仍然乐于助人,他们曾担任GPU服务线程以提高整体性能 - 能够唤醒和快速响应新的数据推到GPU,如所须)。
......但在同一时间,我在4级的线程应用程序可能已安装了更高质量的冷却装置进行的系统上要好得多。 这一切都那么很复杂。
结论:没有很好的答案,因为CPU SMT领域/涡轮设计总在发展,我怀疑会有一个很好的答案很快。 任何像样的启发式你今天制定很可能不会产生理想的效果的明天。 所以我的建议是:不要在这上面花太多时间。 粗糙的猜测基础上核心数量的东西,适合本地的目的不够好,使其能够通过配置/开关覆盖,并继续前进。
Answer 3:
你可以提供给这样的JVM处理器数量:
Runtime.getRuntime().availableProcessors()
从可用的处理器数量计算线程的最佳数量是不幸的是没有然而微不足道。 这取决于应用程序的特点有很多,例如与具有多个线程CPU密集型应用程序比处理器的数量没有意义,而如果应用程序主要是IO的限制,你可能需要使用多个线程。 您还需要考虑到,如果其他资源密集型进程在系统上运行。
我认为最好的策略是凭经验决定为每个硬件配置的最佳线程数,然后在你的应用程序中使用这些数据。
Answer 4:
我同意在这里其他的答案是推荐的最佳猜测的办法,并覆盖默认提供配置。
此外,如果你的程序特别CPU密集型的,你可能想寻找到“钉住”你的应用程序特定的处理器。
你不说你的主操作系统是什么,或者是否需要支持多种操作系统,但大多数都有这样的一些方法。 Linux的,例如,已经使用taskset 。
通常的做法是,以避免CPU 0(总是由OS),以及应用程序的CPU关联设置为在同一个插座一组CPU。
从CPU 0保持应用程序的线程离开(如果可能的话,从其他应用程序的距离)通常可以提高通过减少任务切换量性能。
在一个插座保持应用程序可以进一步提高通过减少缓存失效为您的应用程序的线程CPU之间进行切换的性能。
与其他事物一样,这是高度依赖于你的机器上运行的架构,以及什么其他应用程序捉迷藏。
Answer 5:
使用VisualVM的工具来监视threads.First在程序中创建线程最小并查看performance.Then增加没有线程的程序中ANS再分析其performance.May这个帮助你。
Answer 6:
我在这里使用这个Python脚本来确定核心数量(和内存等)与最佳参数和人机工程学启动我的Java应用程序。 PlatformWise在Github
它的工作原理是这样的:编写Python脚本调用getNumberOfCPUCores()
在上面的脚本来获得核心数量,并getSystemMemoryInMB()
来获取RAM。 你可以通过它通过命令行参数通知到您的程序。 然后,您的程序可以使用基于内核的线程数,适当数量。
Answer 7:
在创建应用程序级别的线程是好的,在多核处理器单独的线程是在内核上执行,以提高performance.So利用核心的处理能力是实现线程的最佳实践。
我认为:
- 一次仅1中,节目的线程将执行1个核心。
- 与2线相同的应用程序将执行在一半的时间在2个核心。
- 有4个线程同一个应用程序将执行更多更快的4核心。
所以你开发的应用程序应该有线程级<=无芯的。
线程的执行时间是由操作系统管理,是一个高度不可预测的活动。 CPU执行时间被称为时间片或量子。 如果我们创造更多的线程操作系统花费在决定哪个线程先行,从而降低了实际执行时间每个线程这个时间片的一小部分。 换句话说,如果有大量的线程排队的每个线程会做较少的工作。
阅读此得到如何实际利用CPU core's.Fantastic内容。 csharp-codesamples.com/2009/03/threading-on-multi-core-cpus/
Answer 8:
从可用的处理器数量计算线程的最佳数量是不幸的是没有然而微不足道。 这取决于应用程序的特点有很多,例如与具有多个线程CPU密集型应用程序比处理器的数量没有意义,而如果应用程序主要是IO的限制,你可能需要使用多个线程。 您还需要考虑到,如果其他资源密集型进程在系统上运行。
文章来源: Threads configuration based on no. of CPU-cores