2011-06-21 38 views
2

我有1.3版本的django奇怪的緩存問題。我可能有配置錯誤的東西,但不知道是什麼。Django1.3多個gunicorn工作緩存問題

一個很好的例子是django-avatar,它使用緩存,許多人使用它。即使我沒有定義緩存後端,該頭像似乎被緩存,本身也可以,但它會在緩存的最後一個值之間來回切換。例如:我上傳了一個新的頭像,現在約有50%的請求會顯示新頭像,50%是舊頭像。如果我刪除舊的,我仍然可以在50%的時間內在網站上獲得它。修復它的唯一方法是通過將頭像設置爲一秒來禁用頭像的緩存。

首先,我認爲這是因爲我使用了django.core.cache.backends.locmem.LocMemCache,這是我以前從未使用過的,但它甚至發生在我根本不配置緩存後端時。

我發現了一個類似的錯誤: Django caching bug .. even if caching is disabled

但我的網頁渲染就好了,它引起我的Setup中的問題templatetags(現在)。

我使用Django 1.3,Postgres的,Nginx的,gunicorn 0.12.0,greenlet == 0.3.1,eventlet == 0.9.16

我只是做了一些更多的測試,並意識到它,只有當我開始發生gunicorn使用配置文件。如果我用./manage.py run_gunicorn啓動它,一切都很好。運行「gunicorn_django -c deploy/gunicorn.conf.py」會導致問題。

我能想到的唯一解釋是每個工人都有自己的緩存(我想知道爲什麼,因爲我沒有定義緩存)。

更新:運行./manage.py run_gunicorn -w 4也會導致相同的問題。因此,我幾乎可以肯定的是,多名工人正在造成問題,每名工人分別緩存價值。

我的配置:

import os 
import socket 
import sys 

PORT = 8000 
PROC_NAME = 'myapp_gunicorn' 
LOGFILE_NAME = 'gunicorn.log' 
TIMEOUT = 3600 
IP = '127.0.0.1' 
DEPLOYMENT_ROOT = os.path.dirname(os.path.abspath(__file__)) 
SITE_ROOT = os.path.abspath(os.path.sep.join([DEPLOYMENT_ROOT, '..'])) 
CPU_CORES = os.sysconf("SC_NPROCESSORS_ONLN") 
sys.path.insert(0, os.path.join(SITE_ROOT, "apps")) 
bind = '%s:%s' % (IP, PORT) 
logfile = os.path.sep.join([DEPLOYMENT_ROOT, 'logs', LOGFILE_NAME]) 
proc_name = PROC_NAME 
timeout = TIMEOUT 
worker_class = 'eventlet' 
workers = 2 * CPU_CORES + 1 

我也試了一下,而無需使用 'eventlet',但得到了同樣的錯誤。

感謝您的任何幫助。

+0

作爲緩存後端切換到memcache解決了我的問題。然而,我仍然感興趣爲什麼會發生這種情況...如果我做錯了什麼或者這是一個錯誤。 –

回答

6

這很可能是默認的內存緩存,這意味着每個工作人員都有它自己的內存空間中的緩存自己的版本。如果你點擊線程1,你會得到一個不同的緩存,然後線程3. Nginx正在每個線程之間傳播負載,很可能是通過循環分配,所以你要改變每個命中的線程。這解釋了你古怪的結果。

當你做manage.py run_gunicorn它很可能運行單線程,因此只有一個緩存,這就是爲什麼你看不到相同的結果。

使用memcached或類似的東西是要走的路。

+0

好的,我期望的那種。它必須在django的最後一個版本中發生了變化...因爲它以前工作過。在文檔中指出這可能是很好的。 –

+0

是的,非常清楚。 nginx + gunicorn,建議使用'memcached'作爲緩存。 – hahakubile