簡體   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