Как я могу предотвратить RuntimeError («Невозможно создать новый ключ сеанса»)?

Клиентское приложение Django периодически (примерно два раза в день) выдает ошибку 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.

Как видно из трассировки, это происходит глубоко в недрах django.contrib.sessions при использовании бэкэнда сеанса кеширования с бэкэндом кэша memcached.

Билет трассировки Django ( https://code.djangoproject.com/ ticket / 14093 ) предлагает изменить хэш ключа сеанса с MD5 на UUID4, но это не поможет - проблема в сети. Я заметил (с помощью tcpdump), что это исключение может возникать, когда e TCP-соединение от сервера приложений к серверу memcache истекло из-за потери пакетов.

У нас есть два сервера приложений и один сервер memcached (1.4.2), все они работают в Amazon EC2. В периоды высокого спроса я наблюдал, как один сервер приложений обменивается 75 000 пакетов в секунду с сервером кэша памяти. В течение этого периода высокого спроса я наблюдал потерю одного пакета SYN для нового соединения кэша памяти, что привело к тайм-ауту соединения python-memcache (еще до того, как ядро ​​даже изменилось на повторную передачу) и RuntimeError .

Я не знаю, как это решить. Я хотел бы настроить таймер повторной передачи TCP в Linux меньше трех секунд, но он не настраивается. В противном случае я бы хотел, чтобы python-memcache повторил попытку подключения пару раз, прежде чем отказаться, но этого не произойдет. Я вижу, что pylibmc имеет настраиваемое поведение при подключении и повторной попытке, но мне не удалось найти комбинацию параметров, которая работает с потерей пакетов.

Идеи?

15
задан claymation 29 July 2011 в 05:55
поделиться