考虑以下场景:服务器上的一个进程用于处理来自网络连接的数据。Twisted 使这非常容易,spawnProcess
您可以轻松地ProcessTransport
在网络端使用您的协议连接。
但是,我无法确定 Twisted 如何处理来自网络的数据的可用速度快于进程对其标准输入执行读取的情况。据我所知,Twisted 代码主要使用内部缓冲区(self._buffer
或类似的)来存储未使用的数据。这是否意味着来自快速连接(例如,通过本地千兆 LAN)的并发请求可能会填满主内存并导致大量交换,从而使情况变得更糟?如何防止这种情况?
理想情况下,内部缓冲区将具有上限。据我了解,如果操作系统的缓冲区已满,操作系统的网络代码会自动停止连接/开始丢弃数据包,这会降低客户端的速度。(是的,我知道,网络级别的 DoS 仍然是可能的,但这是一个不同的问题)。如果我自己实现它,这也是我将采取的方法:如果内部缓冲区已满,则不要从套接字读取。
在我的情况下,限制最大请求大小也不是一个选项,因为该服务应该能够处理任意大小的文件。