Web服务器(和相关软件)是否使用机器的所有CPU核心?

我想知道,既然BASH等,不pipe什么只使用一个内核,哪种设置和软件栈会使用CPU上的所有内核?

Node.JS是否使用所有核心,或者LEMP或LLMP堆栈?

什么是编码networking和利用所有可用的系统资源的方式?

谢谢。

这是一个非常复杂的问题,快速的答案是可以有效并行计算的应用程序可以并且应该使用多个内核。

想想bash。 它执行一系列操作,每个操作都依赖于前一个的结果。 在这样的情况下,将一些计算移动到其他核心是非常困难的,通常不值得这样做,因为开始一项新任务,同步(等待其结果)超过了在多核上运行的好处。 此外,你必须做深入的依赖分析,这也是额外的工作。

一些简单的网络服务器任务,比如发送文件,可以在没有多个内核的情况下工作,因为依赖于sendfile系统调用的好的实现几乎没有任何工作,并且可以从单个线程服务很多客户端。

那么,还有其他的问题,那里有很多的积分,但是任务很容易/可以并行化。 任务之间几乎没有任何依赖关系,服务器可以独立地与每个客户端进行通信,而不需要知道与其他客户端的交互。 如果你写一个聊天机器人,每个线程可以利用一个核心(或核心的一部分)并与该客户端通信。 如果您有用于电视广播的视频流编码器,则可以为每个通道使用一个或多个内核,并创建一对编码器,直至达到整个CPU的极限。 大多数动态生成的Web站点都属于这个类别,Web服务器可以运行一个PHP / Python / Ruby“模块”的许多实例,每个服务于一个客户端。

还有一些问题,这些是最常见的问题,在任务之间有一些(但是不太多)的依赖关系,大量的计算和一些磁盘I / O。 有些应用程序使用内核,但由于很难编写好的多线程代码和代码行为的原因,所以应用程序通常使用比理论上可行的更少的并行性。 毕竟,有人必须编写代码并对其进行维护,不断添加新功能。

这取决于。

多进程或多线程的Web应用程序服务器当然有能力使用尽可能多的核心。 无论他们是否做,取决于如何构建应用程序和工作量。

每个PHP页面都是单线程的,通常在自己的进程中运行,但是,如果您可以一次运行多个页面实例,并且有足够的流量来使用所有内核(或者至少其中一些内核;充分利用听起来太忙​​了!)那就应该。

然而,它并不总是这样工作的,因为它们可能会争用公共资源,例如它们可能有会话锁,或者访问具有粗粒度锁定或其他的公共数据库,因此不会能够使用机器的全部容量。

他们也可能争夺非CPU资源,如IO。

或者可能没有足够的内存来运行足够的实例来充分使用CPU。