客户端的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将会终止您的用户会话。 :( –