繁体   English   中英

扭曲应用程序中的内存界限

[英]Memory bounds in twisted applications

请考虑以下情形:服务器上的进程用于处理来自网络连接的数据。 Twisted使spawnProcess变得非常容易,并且您可以轻松地将ProcessTransport与网络侧的协议连接。

但是,我无法确定Twisted如何处理网络中的数据可用速度比该过程对其标准输入执行读取速度更快的情况。 据我所知,Twisted代码大部分使用内部缓冲区( self._buffer或类似缓冲区)来存储未使用的数据。 这是否意味着来自快速连接的并发请求(例如,通过本地千兆局域网)可能会填满主内存并引起大量交换,从而使情况变得更糟? 如何预防?

理想情况下,内部缓冲区应具有上限。 据我了解,如果操作系统的缓冲区已满,则操作系统的网络代码将自动停止连接/开始丢弃数据包,这将减慢客户端的速度。 (是的,我知道,仍可以在网络级别进行DoS,但这是一个不同的问题)。 这也是我自己实现的方法:如果内部缓冲区已满,请不要从套接字读取。

在我的情况下,限制最大请求大小也不是一个选择,因为该服务应该能够处理任意大小的文件。

解决方案包括两个部分。

其中一部分称为生产者 生产者是数据产生的对象。 TCP传输是生产者。 生产者有两种有用的方法: pauseProducingresumeProducing pauseProducing导致传输停止从网络读取数据。 resumeProducing使它再次开始读取。 这为您提供了一种避免在内存中建立尚未处理的无限数据量的方法。 当您开始落后时,只需暂停运输即可。 当您赶上时,恢复它。

另一部分称为消费者 消费者是数据进入的对象。 TCP传输也是消费者。 不过,对于您的情况而言,更重要的是,子流程传输也是消费者。 消费者有几种方法,其中一种对您特别有用: registerProducer 这告诉消费者来自哪个生产者数据。 使用者可以根据其处理数据的能力来调用pauseProducingresumeProducing 当传输(TCP或进程)不能像生产者要求的那样快地发送数据时,它将暂停生产者。 当它赶上时,它将再次恢复它。

您可以在Twisted文档中了解有关生产者和消费者的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM