服务器程序单线程性能,1.3.5 通过多线程按比例提升服务器程序的性能

2023-05-16

1.3.5 通过多线程按比例提升服务器程序的性能

背景

HTTP运行于TCP之上,由TCP使用流控,确保发送者产生数据的速度不快于慢的接收者,或者确保拥塞的网络能够缓存和处理数据[Ste93]。对于处理重的Web流量负载,要达到高效的端对端服务质量(QoS)非常重要[PQ00]。因此,Web服务器的性能必须能够随着客户端数目的增长按比例有效增长。

问题

由于Web服务器CPU的每个时间片(time-slice)都耗费很多时间阻塞等待I/O操作的完成,所以在单线程的进程中被动地处理所有HTTP GET请求,其性能并不能有效地按比例增长。类似地,为了对所有已连接的客户端都提高QoS,当等待连接的流控减弱时,整个Web服务器程序进程必须不能阻塞,以使它将文件发送给客户端。

解决方案

使用Half-Sync/Half-Async模式,在多个线程中并发处理不同的HTTP请求,从而按比例提升服务器程序的性能。该架构模式定义了两个服务处理层,即同步服务处理和异步服务处理,以及一个排队层,使服务能够在两层之间进行消息交换。该模式使HTTP协议处理等同步服务能够并发运行,使同步服务之间和同步服务与异步服务之间相关联,比如事件分离。

该解决方案带来了两项好处。

线程可以映射到单独的CPU,从而通过多处理器处理按比例提升服务器程序的性能。

每个线程的阻塞是独立的,这样就避免了某个连接的流控降低其他客户端接收的QoS。

在JAWS中的应用

JAWS可以使用Half-Sync/Half-Async模式,在单独的控制线程中同步但并发地处理来自多个客户端的HTTP GET请求:

cd4982f42a7edf2821df819bb0ad51f6.png

在JAWS的"异步"层中,服务由Reactor的HTTP_Handlers组成。尽管Reactor并不是真正异步的,但是它与异步服务具有相同的关键属性。例如,Reactor分派的HTTP_Handler不能长时间阻塞,否则会导致其他客户端饿死。因此,在该设计中,HTTP_Handler只是读取进入的HTTP GET请求,将其插入到请求队列中,由工作线程池服务该请求队列。

工作线程将请求从请求队列中移除,同步进行HTTP协议的处理,然后将文件传输回客户端。如果在该客户端连接上有流控发生,那么该线程可以进行阻塞,并不会降低线程池中其他工作线程服务的客户端感受到的QoS。

【责任编辑:book TEL:(010)68476606】

点赞 0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器程序单线程性能,1.3.5 通过多线程按比例提升服务器程序的性能 的相关文章

随机推荐