使用 nginx 代理程式的 Apache+mod_wsgi 上的 Python Django 網站:效能波動很大

使用 nginx 代理程式的 Apache+mod_wsgi 上的 Python Django 網站:效能波動很大

我有一個 Ubuntu 10.04 機器,使用 mod_wsgi (嵌入模式;更快模式,如果配置正確)。性能波動很大。有時很快,有時延遲幾秒鐘。冒煙的圖表到處都是。

最近,我還為靜態內容添加了一個 nginx 代理,希望能夠解決效能波動較大的問題。但是,儘管它顯著減少了 Apache 必須處理的請求數量,但它對解決主要問題沒有幫助。

當執行 htop 時點擊網站時,可以看到有時請求幾乎是即時的,而有時會導致 Apache 在幾秒鐘內消耗 100% CPU。我實在不明白這種波動從何而來。

我已經為 Apache 配置了 mpm_worker,如下所示:

StartServers          1
MinSpareThreads      50
MaxSpareThreads      50
ThreadLimit          64
ThreadsPerChild      50
MaxClients           50
ServerLimit          1
MaxRequestsPerChild  0
MaxMemFree           2048

1 個伺服器,具有 50 個線程,最多 50 個客戶端。 Munin 和apache2ctl -t兩者都顯示出工人的一致存在;它們並不是一直被銷毀和創建的。然而,它的行為卻是這樣的。

告訴我,一旦創建了子解釋器,它應該保留在記憶體中,但似乎網站必須一直重新載入。

我還有一個nginx+gunicorn盒子,性能相當不錯。我真的很想知道為什麼 Apache 如此隨機。

這是虛擬主機配置:

<VirtualHost *:81>
    ServerAdmin [email protected]
    ServerName example.com

    DocumentRoot /srv/http/site/bla

    Alias /static/ /srv/http/site/static
    Alias /media/ /srv/http/site/media
    WSGIScriptAlias / /srv/http/site/passenger_wsgi.py

    <Directory />
            AllowOverride None
    </Directory>

    <Directory /srv/http/site>
            Options -Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

  • 烏班圖10.04
  • 阿帕契2.2.14
  • mod_wsgi 2.8
  • nginx 0.7.65

編輯:我在網站的 settings.py 檔案中放入了一些程式碼,該檔案在載入時將日期寫入 tmp 檔案。我現在可以看到該網站並不是一直隨機重新載入的,因此 Apache 必須將其保留在記憶體中。所以,這很好,但它並沒有讓我更接近答案...

編輯:我剛剛發現一個可能也與此相關的錯誤:

  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)

  File "/usr/lib/python2.6/subprocess.py", line 1049, in _execute_child
    self.pid = os.fork()

OSError: [Errno 12] Cannot allocate memory

伺服器有 600 個 2000 MB 的可用空間,應該足夠了。 Apache 或 WSGI 是否在某處設定了限制?

答案1

您是否嘗試過使用 New Relic 來確定這是否是您的 Web 應用程式中的問題?提供免費套餐以及初始完整試用。概述它可以為您提供什麼:

如果所使用的後端服務的 Web 應用程式的特定問題並不突出,那麼 WSGI 伺服器容量分析報告可能會顯示一些內容,並告訴您是否耗盡了容量。它還可以告訴您是否過度配置和浪費資源,實際上這種情況很常見。

順便說一句,一般來說,我建議不要在一個進程中使用 50 個請求執行緒。最好使用大約 5 個執行緒和多個進程。確切地說,什麼是最好的實際上取決於特定的應用程序,它是否正在執行大量 CPU 密集型工作,以及它必須處理多少長時間運行的請求。是否透過相同的 Apache 提供大量靜態檔案也會對其產生影響,mod_wsgi 的守護進程模式甚至可能是更好的整體解決方案。

您還使用一個非常舊的 mod_wsgi 版本,儘管不認為這會導致問題。

最後,為了避免 Python 的某些第三方 C 擴充模組出現問題,如果這是該伺服器上唯一的 WSGI 應用程序,請設定:

WSGIApplicationGroup %{GLOBAL}

答案2

我修好了它。我將所有生產站點轉換為在守護程序模式下使用它們自己的進程(所有開發站點也都在一個進程中)。 Smokeping 圖表現在好多了。業績穩定。

這仍然讓我不明白為什麼嵌入式模式會出現這些問題,因為據我所知,我沒有進程創建/銷毀,但至少我有一個更好的運行伺服器。

編輯:

作為 apache 網站配置的範例:

WSGIDaemonProcess mysite12 processes=1 threads=10 display-name=%{GROUP}
WSGIProcessGroup mysite12

然後對於低優先級站點,我將其放入wsgi.conf

WSGIDaemonProcess developmentsites processes=1 threads=15 display-name=%{GROUP}

然後在 apache conf 中:

WSGIProcessGroup developmentsites

看看區別(也是因為nginx代理):

在此輸入影像描述

相關內容