在多个核心中处理一个HTTP请求

Handle one HTTP request in multiple cores

本文关键字:一个 HTTP 请求 处理 核心      更新时间:2023-10-16

我正在努力解决CPU核心流动的问题。

我在我的应用程序中有一些硬图数据收集逻辑,它基于许多相互关联的数据,目前是基于PHP 构建的

所以问题是基本上我的机器有多个CPU核心,但一个http请求在任何php模式下只占用一个CPU核心快速CGI、CGI。。。

所以我想知道在以下任何一种语言中是否有一些变通方法

PHP,NODEJS,JAVA,C++

这样您的一次执行将使用/涉及多个CPU核心

您需要使用多线程。例如,在PHP中,您需要从PECL:安装pthreads

> /<php-install-dir>/bin/pecl install pthreads

然后通过在php.ini.中添加.so扩展名来启用它

然后你可以运行这样的线程:

<?php
class MyThread extends Thread {
public function run() {
/* Your code here */
}
}
$thread1 = new MyThread();
$thread2 = new MyThread();
$thread1->start();
$thread2->start();
?>

它在所有编程语言中都非常相似。

基本上,单个传入请求将由大多数web框架上的单个线程管理

大多数web框架中的多线程支持

大多数框架将通过同时处理多个请求来利用机器的多个核心。如果您同时处理来自100个用户的100个请求,每个请求都将使用一个线程。。。如果你有4个核心,大约每个核心将使用你的硬件功能有效地管理25个线程。

在大多数情况下,让一个请求由多个线程处理是不必要的。

如果您的请求速度慢且CPU使用率高

当然,你可以使用多个线程来处理一个请求,但你必须确保这是值得的。通常,使用多线程算法会带来开销,这意味着你的网络服务器的全局吞吐量会降低。

这是在使一个占用大量CPU的慢速请求更快和总体吞吐量之间进行权衡。

web框架级别在多线程中绝对没有好处,因为基本上框架只关心接收和发送数据流,与给定的CPU速度相比,这是一个非常慢的操作。

如果您的实际算法确实受益于并行性,那么作为开发人员,您有责任实现该算法的多线程版本。

这会让你的程序变得更加复杂,更难推理。如果你的请求还不是很慢,比如几秒钟或更长时间,而且延迟主要来自计算,而不是等待DB或其他web服务,那么这可能是不值得的。

所以,在开始做一些过于复杂的事情之前,一定要确保你真的需要它

现代web框架采用相反的方法

事实上,相反的趋势恰恰相反。大多数http请求只是在等待外部资源,无论是来自DB的响应、另一个服务的响应还是将响应发送到网络接口。

因此,像javascript中的Node.js或java中的Vertex这样的现代框架采取了相反的方法。

给定的线程不会等待给定的请求完成。每当程序等待外部资源(DB、外部服务…(时,线程就会被释放,并处理其他操作,如管理其他请求。稍后,当响应可用时,将恢复请求处理。

事实证明,这可以提高Web服务器的总体吞吐量,至少在每次请求的CPU使用率不高但大部分时间都花在等待上的所有情况下是这样。