如何防止RuntimeError("无法创建新的会话密钥.")?

cla*_*ion 15 django memcached amazon-ec2

客户端的Dj​​ango应用程序间歇性地(大约每天两次)投掷RuntimeError("Unable to create a new session key."):

    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.
Run Code Online (Sandbox Code Playgroud)

正如您在回溯中看到的那样,django.contrib.sessions当使用缓存会话后端与memcached缓存后端时,这种情况发生在深层次.

Django trac票证(https://code.djangoproject.com/ticket/14093)建议将会话密钥哈希从MD5更改为UUID4,但这没有帮助 - 问题在于网络.我观察到(使用tcpdump)当从app服务器到memcache服务器的TCP连接因数据包丢失而超时时,可能会发生此异常.

我们有两个app服务器和一个memcached(1.4.2)服务器,都在Amazon EC2中运行.在高需求期间,我观察到一个应用服务器与memcache服务器交换75,000个数据包/秒.在这个需求高的时期,我观察到一个SYN数据包丢失了一个新的memcache连接,导致python-memcache连接超时(在内核甚至改变重传之前)和a RuntimeError.

我对如何解决这个问题感到茫然.我想调整Linux的TCP重传计时器低于三秒,但它不可调.如果做不到这一点,我想让python-memcache在放弃之前重试几次连接,但事实并非如此.我看到pylibmc具有可配置的连接和重试行为,但我无法找到解决丢包问题的选项组合.

想法?

Nik*_*nyh 5

刚解决了同样的问题apt-get install memcached.可能也是你的情况.

哦,对不起,这不是你的情况.我只是更加注意阅读问题.但我会留下我的答案 - 因为它是关于这个运行时错误.


jus*_*ane 3

查看启动板上的 python-memcached 代码,您应该能够调整dead_retryretry_timeout. 另一种选择可能是在一个或两个应用服务器上运行低内存、低连接的 memcached 实例,作为主 Memcached 服务器无法访问时的后备方案。