請考慮以下情形:服務器上的進程用於處理來自網絡連接的數據。 Twisted使用spawnProcess
可以非常容易地將網絡端的協議連接到ProcessTransport
。扭曲應用程序中的內存邊界
但是,我無法確定Twisted如何處理來自網絡的數據可用速度快於進程對其標準輸入執行讀取的情況。就我所見,Twisted代碼大多使用內部緩衝區(self._buffer
或類似的)來存儲未消耗的數據。這是否意味着來自快速連接(例如通過本地千兆局域網)的併發請求可能會佔用主內存並導致大量交換,從而使情況更糟?這怎麼能被阻止?
理想情況下,內部緩衝區將有一個上限。據我瞭解,如果操作系統的緩衝區已滿,操作系統的網絡代碼會自動停止連接/開始丟棄數據包,這會降低客戶端速度。 (是的,我知道,網絡級別的DoS仍然有可能,但這是一個不同的問題)。這也是我自己實現它的方法:如果內部緩衝區已滿,則不要從套接字讀取數據。
對我而言,限制最大請求大小也不是一個選項,因爲服務應該能夠處理任意大小的文件。