我理解Puma相对于其他Rails web服务器的一个好处是它如何处理慢客户端。虽然美洲狮服务器接收和下载(可能比较慢)请求,但它仍然可以接收和下载其他请求,这些请求可能下载得更快,并在慢请求完成之前传递给工作人员处理。
但我找不到任何信息,如果有的话,有什么限制这一点。
可以同时下载任意数量的请求吗?如果同时收到1000个慢请求,那么第1001次请求会不会首先到达一个美洲豹工人,前提是它不是慢请求?
我想我通常感兴趣的是多个慢请求对其他请求的影响,包括彼此之间的影响--因为我正在开发一个可能涉及大量“慢请求”(通过3G从手机上传图像)的应用程序。
这篇伟大的文章 by @nate-berkopec原则上帮助解释了Puma如何帮助处理慢客户端:“那么,在集群模式下,Puma可以处理慢请求(这要感谢一个单独的主进程,其职责是下载请求并传递它们).”任何更多的光明,任何人都可以离开将是非常欢迎的。
发布于 2018-03-22 19:01:48
有许多考虑因素,例如IO轮询系统、内存和并发问题。
IO投票系统
编辑(2020年9月9日):到目前为止,Puma服务器正在nio4r上运行,不应该再受制于select系统调用的限制(其中文件描述符值限制在1023)。
据我所知,美洲狮使用select系统调用(与碘或乘客不同,后者也保护您不受慢客户端的影响,但使用kqueue或epoll)。
select系统调用在大多数系统上是有限的(通常高达1024个客户机/ maxfd)。我认为这会造成一个限制。
但是,我知道Puma正在努力用既可移植又有效的东西来替换select系统调用(比如利用nio4r gem)。
我不知道这是否已经实现了,但它将打破这一限制,并可能提高性能。
内存
慢客户机仍然消耗内存,因为它们缓慢地用头数据填充缓冲区,或者缓慢地下载已发送的缓冲数据(将缓冲区保存在内存中直到下载完成为止)。
内存限制总是会增加限制,以减缓客户端的处理。
一些限制可以提升,例如使用X发送静态文件(支持碘,以及当Puma或乘客在nginx下运行时).但这并不是你能解决的问题。
并发性
Puma在Ruby的GIL (全局指令锁)中处理慢客户端。这意味着在Puma处理慢速客户端时,其他线程/指令都无法执行。
这通常不是问题,但是足够多的慢客户端会增加上下文切换和系统调用的成本。这可能会(潜在地)大大降低服务器的速度。
乘客和碘在GIL之外执行缓慢的客户端缓冲,允许这些系统调用真正并发(当多个CPU核可用时)。
这将缓解这一问题,但不能完全解决这个问题。
结论和注意事项
最大的问题通常是IO投票系统。这方面的解决方案在Puma的路线图上(也许已经实现了,我不确定)。
其他问题(内存限制和并发限制)相对来说不太重要,但如果不使用语言扩展(碘服务器用C编写,客运用C++编写),就不能减轻这些问题。
由于Puma (目前)不需要任何语言扩展(除了它在C和Java中集成的HTTP解析器),这些问题仍然存在。
我应该指出,我是碘HTTP/Websocket服务器的作者,所以我有点偏颇。
https://stackoverflow.com/questions/49395334
复制相似问题