使用多线程/多核进程防止Thrashing



我正在运行程序链,其中许多程序喜欢自己决定要使用多少内核或线程,我可以控制数据的分区方式。

我希望这将是一场火灾,忘记的情况。。。就像在操作系统中一样,只会暂停线程和进程的生成,直到释放出足够的资源。。。但遗憾的是,随之而来的是大量的资源竞争。

  1. 是否有任何操作系统或操作系统设置(尤其是Linux(可以处理进程/线程的爆炸并避免混乱?

  2. 对于如何在多个步骤和多个级别上令人尴尬地并行工作流程,有什么指导方针吗?有没有任何工具可以帮助设计基于调度模式的策略?

是否有任何操作系统或操作系统设置(尤其是Linux(可以处理进程/线程的爆炸并避免混乱?

线程/进程是操作系统资源,与几乎所有的操作系统资源一样,它们非常昂贵。对于进程来说尤其如此,因为从一个进程到另一个进程的上下文切换有相当大的开销(例如TLB刷新,可能还有直接/延迟的缓存刷新(,而且它们通常在内存的不同部分运行。

在一个进程中使用多个线程通常不是什么大问题,只要它们不是都准备好同时进行调度即可。如果是这样的话,调度器需要将它们映射到可用的内核上,而这种调度是非常昂贵的。事实上,尽管在实践中使用了启发式方法,但调度问题通常是NP完全的。调度器需要考虑许多参数,如IO、锁/等待、位置性、亲和性、公平性、优先级等。此外,每个线程都有自己的堆栈(通常只有几个MiB(,因此线程数量不需要太大,也不需要占用太多内存。上下文从一个线程切换到另一个线程仍然会导致一些缓存问题,因为堆栈位于内存中的不同位置,并且它们可以快速刷新。如果线程在不同的数据集上操作,而不是在同一个问题上操作,则破坏往往会发生得更频繁,并且通过同步从共享内存中获益的成本也可能很高,因此需要仔细调整粒度

请注意,您可以在Linux上调整调度程序(通常是IO调度程序(,但对于您的目标应用程序,有些调度程序可能比其他调度程序表现得更好,但没有一个是完美的。应用程序级调度在实践中往往更有效。

对于如何在多个步骤和多个级别上令人尴尬地并行的工作流,有什么指导方针吗?有没有任何工具可以帮助设计基于调度模式的策略?

如果没有更多信息,这很难帮助您,但您可以自己在工作线程池(通常是物理或逻辑核心的数量(上安排工作。您可以使用绿色线程(如光纤(或任务。任务调度很好,原因有很多:您可以指定任务之间的依赖项,从一个任务切换到另一个任务通常比光纤上下文切换便宜,堆栈可以重复用于许多任务(并保存在缓存中(,您可以根据目标应用程序调整任务的调度。也就是说,只有当任务不相互等待时,任务调度才是好的:在这种情况下,它们需要被拆分为多个任务(即连续(。这并不总是可能的,也不简单(例如调用外部库(。在这种特殊情况下,纤维更好(但它们也有一些问题(。

最新更新