2013-07-06 30 views
23

我的應用程序是一個uwsgi + django設置。我使用gevent來執行性能測試並同時運行1200個請求。在這一點上,uwsgi將拋出一個IO錯誤有以下日誌消息:uwsgi拋出由uwsgi_response_write_body_do損壞導致的IO錯誤

uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 260] 
IOError: write error 

的Django 1.4.0
uwsgi:1.9.13
蟒蛇:2.6
TCP監聽隊列:1000

這個破損管道錯誤的原因是什麼?

回答

0

此錯誤表示客戶端在uWSGI/Django發送響應之前已關閉連接。它通常是由於瀏覽器或Web服務器前端超時造成的。

要修復它,您需要驗證您的設置是否正確。看看你的應用程序的所有部分(包括數據庫適配器)都是gevent友好的。如果他們不這樣做,你會在gevent中沒有優勢,甚至會導致性能下降。

除此之外,您需要確保您的數據庫服務器能夠管理1200個併發連接。否則,可能會忽略連接嘗試。

+0

不,我的應用程序沒有使用gevent,我只是使用gevent進行測試。 – linbo

32

當NGINX向uWSGI發起請求但uWSGI花了很長時間迴應時,可能會發生這種情況,那麼NGINX會關閉與uWSGI的連接。當uWSGI最終完成時,它會嘗試將它的響應返回給NGINX,但NGINX先前關閉了連接,因此uWSGI會拋出I/O錯誤。

因此,這可能意味着您的uWSGI過程耗時過長。

更新:

uWSGI的切腹模式可能是有用的,如果你想自動終止這種長期服用流程: https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode 你可能不希望這樣做,因爲一個進程可能會整理一些長的查詢或一些東西,是必要的。

+2

我也收到類似的錯誤。星期六5月31日01:29:36 - uwsgi_response_write_body_do():在POST/some/url /(IP)期間通過peer [core/writer.c line 410]重置連接 IOError:寫入錯誤 - 您是否解決了此問題? –

+0

我在/var/logs/nginx/error.log中發現nginx正在嘗試創建臨時文件,並且由於權限被拒絕而失敗。我遵循http://derekneely.com/2009/06/nginx-failed-13-permission-denied-while-reading-upstream/來修復權限問題。 –

+0

@VijayendraBapte該鏈接不起作用了。解決方案是什麼? – raacer

1

現在,我不建議您不考慮您的情況。但您可以將uwsgi_ignore_client_abort設置爲「開」。啓用此功能後,nginx將保持中止的連接處於打開狀態,直到uwsgi返回。爲什麼我不完全推薦這是因爲這意味着一個nginx連接現在將被綁定直到請求結束。但是真的uwsgi線程沒有被中止,所以儘早中止nginx連接在我看來並沒有真正獲益。

相關問題