如果我确切地知道我的代码在一个线程中针对单个请求运行的速度有多快,那么他们有什么方法可以估计它将在多个线程中运行的速度有多快?
不,您应该根据经验确定它。
如果有的话,其他线程的存在会影响其他线程的执行速度吗?
计算密集型任务可能会很好地扩展,并且大部分独立于其他线程。有趣的是,一些 CPU 制造商实现了一些功能,可以增加一个繁忙的 CPU 内核的时钟来补偿所有空闲的内核。这种功能可能会混淆您对缩放的测量和期望。
缓存/内存/磁盘绑定任务将开始相互竞争,除非存在资源分区。
我知道这将取决于许多因素
绝对地!因此,我建议您对其进行原型制作并进行测量。然后找出为什么它没有像你希望的那样扩展并尝试不同的算法。迭代。
但肯定有某种方法可以确定您的代码是否可以扩展
是的,但不幸的是,它需要对代码实现的算法进行详细描述。您的结果将在很大程度上取决于您的代码活动在这些一般区域中的比率,以及您的目标对这些区域的能力:
我的情况:我的应用程序在一个应用服务器中运行,该服务器为每个用户请求分配一个线程。如果我的应用程序在 2 秒内为 1 个用户执行,我不能假设如果说 100 个用户同时运行相同的操作,它总是需要 2 秒,对吗?
如果您的应用服务器pi
为每个用户请求计算到 100 位,那么它可能会很好地扩展,直到您遇到目标的核心限制。
如果您的应用服务器对每个用户请求进行数据库查询,它可能只会扩展,并且目标硬件可以承受必要的负载。
编辑给出的细节:
我遍历内存中最坏情况大小为 100 万个节点的图。它只是一次访问 100 万个内存地址 1。
你的问题听起来是内存+缓存绑定的。您应该研究目标 CPU/mem 部署的详细信息,或者如果您正在设计它,请选择高内存吞吐量。
- NUMA 系统(内存的“资源分区”)可能会最大化您的整体并发内存吞吐量。请注意,由于您的问题似乎要求同时访问相同的内存页面,NUMA 系统会惩罚执行远程内存访问的进程。在这种情况下,请考虑在初始化时创建数据的多个副本。
- 根据遍历的模式,TLB 压力可能是一个因素。考虑尝试使用巨大的(又名“大”)页面。
- 缓存争用也可能是扩展的一个因素。
- 您的特定算法很容易最终支配任何特定的系统效果,具体取决于最佳情况和最坏情况之间的距离。
对计算机硬件架构以及多线程如何在后台工作的经验有限。
使用 CPU 性能计数器和 Intel 的 VTuneperf
或oprofile
. 它可以告诉您在代码中执行昂贵操作的位置。使用此信息,您可以优化查询以使其表现良好(单独和总体)。