我有一個 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代理):