场景:我有一个示例应用程序,并且有 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
为了有效地利用我的应用程序的硬件功能,我希望配置 no。应用程序级别的线程数。然而,我希望只有在彻底了解系统功能之后才能做到这一点。
是否有某种方法(系统/模式/工具)来参考最大和最小数量来确定系统能力。它可以提供最佳服务的线程数,并且不会损失效率和性能。通过这种方式,我可以仅为我的应用程序配置那些能够完全公正并为相应硬件配置实现最佳性能的值。
编辑1:任何人都可以建议有关如何为特定硬件配置设置基线的任何阅读。
编辑2:为了使其更直接 - 希望学习/了解我可以阅读的任何资源/文章,以便在一般/整体层面上对线程的 CPU 管理有一些了解。
使用的最佳线程数取决于多个因素,但主要取决于可用处理器的数量以及任务的 CPU 密集程度。Java 并发实践提出以下正式公式来估计最佳线程数:
N_threads = N_cpu * U_cpu * (1 + W / C)
Where:
- N_threads 是最佳线程数
- N_cpu是处理器的数量,可以从
Runtime.getRuntime().availableProcessors();
- U_cpu 是目标 CPU 利用率(如果要使用全部可用资源,则为 1)
- W / C 是等待时间与计算时间的比率(对于 CPU 密集型任务为 0,对于慢速 I/O 任务可能为 10 或 100)
例如,在受 CPU 限制的场景中,您将拥有与 CPU 一样多的线程(有些人主张使用该数字 + 1,但我从未发现它会产生显着差异)。
对于缓慢的 I/O 进程(例如网络爬虫),如果下载页面的速度比处理页面的速度慢 10 倍,则 W/C 可能为 10,在这种情况下,使用 100 个线程会很有用。
但请注意,在实践中存在上限(使用 10,000 个线程通常不会加快速度,并且在使用正常内存设置启动所有线程之前,您可能会收到 OutOfMemoryError 错误)。
如果您对应用程序运行的环境一无所知,这可能是您可以获得的最佳估计。在生产中分析应用程序可能使您能够微调设置。
虽然不严格相关,但您可能也感兴趣阿姆达尔定律,其目的是测量并行程序所期望的最大加速。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)