客戶端的Django應用程序是間歇性(大約一天兩次)投擲RuntimeError("Unable to create a new session key.")
:如何防止RuntimeError(「無法創建新的會話密鑰」)?
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/views/decorators.py", line 17, in _checklogin
if request.user.is_active and request.user.is_staff:
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/middleware.py", line 9, in __get__
request._cached_user = get_user(request)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/__init__.py", line 107, in get_user
user_id = request.session[SESSION_KEY]
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py", line 47, in __getitem__
return self._session[key]
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py", line 195, in _get_session
self._session_cache = self.load()
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/cache.py", line 16, in load
self.create()
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/cache.py", line 33, in create
raise RuntimeError("Unable to create a new session key.")
RuntimeError: Unable to create a new session key.
正如你可以回溯看到,這使用與memcached的緩存緩存會話後端時,發生在django.contrib.sessions
深處深後端。
Django trac票證(https://code.djangoproject.com/ticket/14093)建議將會話密鑰散列從MD5更改爲UUID4,但這沒有幫助 - 問題在於網絡。我觀察到(使用tcpdump),當從應用程序服務器到memcache服務器的TCP連接由於數據包丟失而超時時,可能會發生此異常。
我們有兩臺應用服務器和一臺memcached(1.4.2)服務器,所有服務器都運行在Amazon EC2中。在高需求期間,我觀察到一臺應用服務器與memcache服務器交換75,000個數據包/秒。在這個高需求期間,我觀察到一個SYN數據包會導致新的memcache連接丟失,導致python-memcache連接超時(在內核更改爲重新發送之前)以及RuntimeError
。
我不知道如何解決這個問題。我想調整Linux的TCP重傳定時器低於3秒,但它不可調。如果不行,我想讓python-memcache在放棄之前重試一次連接,但它不會。我發現pylibmc具有可配置的連接和重試行爲,但是我一直無法找到可以解決數據包丟失的選項組合。
想法?
我有純的Django的DEV-服務器同樣的問題。發佈請你的設置。 – I159
不是你正在尋找的答案 - 但是redis是一個選項?特別是對於會話,因爲Redis具有基於磁盤的備份,如果服務重新啓動,則memcached將會終止您的用戶會話。 :( –