棧:nginx,uwsgi,django爲什麼uwsgi工人閒置,但nginx顯示了很多超時?
uwsgitop和top都顯示uwsgi worker是空閒的,而nginx錯誤日誌則表示上行超時。
我以爲有些請求需要大量的資源,比如等待數據庫或緩存,而其他的則不需要。在檢查超時請求後,他們中的大多數人並不貪婪。任何類型的請求都已超時。
那麼爲什麼如果其他人真的很忙,nginx不會將請求放到閒置的請求中?爲什麼uwsgi大師只是讓人忙,其他人閒着?
棧:nginx,uwsgi,django爲什麼uwsgi工人閒置,但nginx顯示了很多超時?
uwsgitop和top都顯示uwsgi worker是空閒的,而nginx錯誤日誌則表示上行超時。
我以爲有些請求需要大量的資源,比如等待數據庫或緩存,而其他的則不需要。在檢查超時請求後,他們中的大多數人並不貪婪。任何類型的請求都已超時。
那麼爲什麼如果其他人真的很忙,nginx不會將請求放到閒置的請求中?爲什麼uwsgi大師只是讓人忙,其他人閒着?
我想回答我自己的問題。
改變內核參數:net.ipv4.ip_conntrack_max從65560到6556000
我對我們如何找到了答案一個完整的故事:
用戶說慢,慢,慢
nginx的與淹沒「上游連接超時」
我檢查uwsgi日誌,發現了一些錯誤,固定它;發現更多,修復更多,而這個循環持續了好幾天。直到昨天,我認爲與uwsgi,memcached,db,redis或任何後端沒有任何關係,因爲uwsgi空閒,所以我認爲nginx肯定有問題,重新加載,重新啓動,檢查連接,worker,proxy_read_timeout等沒有運氣。
選中了ulimit -n,其中報告了1024個默認值。我有8個nginx工作者,所以連接應該達到1024 * 8,我認爲這可能是好的,因爲nginx從來沒有說太多打開的文件。無論如何,我將它改爲4096.沒有運氣。
檢查連接數量和狀態,則出現問題。上游連接全部處於syn_sent狀態,然後超時發生。 300個連接中只有2個或3個處於建立狀態。我們想知道爲什麼。我的一個朋友告訴我使用tcpdump,這是我從來不敢嘗試一次的魔法工具。
然後我們去到系統日誌,發現下面的錯誤,最後我們解決了這個問題
在我的經驗nginx的WSGI實現表現不佳,特別是如果應用程序往往會阻止幾毫秒。 –
他們是一直在做這個還是隻在負載很高時才這樣做?你的網站有很多IO嗎? – RickyA
@PauloScardine uwsgi實際上在同步或異步方式下工作得非常好,儘管我不敢使用異步模式。我用芹菜代替。我認爲uwsig也是阻塞的,但其他工作人員閒置,所以它不能阻止問題。 – samuel