Периодические проблемы при доступе к внешним службам http с помощью gevent

Во-первых, версии:

  • gevent - v0.13.7
  • пушкарог - v0.14.2
  • запросы - 0.11.2

Недавно мы обновили наши серверы, работающие за gunicorn, чтобы использовать асинхронные рабочие процессы gevent вместо обычных рабочих операций синхронизации. Все работает отлично, но теперь у нас возникла проблема при попытке доступа к сторонней службе через http, и я просто понятия не имею, как отследить, в чем может быть проблема.

Краткая трассировка стека выглядит следующим образом:

File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/sessions.py", line 295, in post
  return self.request('post', url, data=data, **kwargs)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/sessions.py", line 252, in request
  r.send(prefetch=prefetch)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/models.py", line 625, in send
  raise ConnectionError(sockerr)
ConnectionError: [Errno 66] unknown

Еще одна другая трассировка стека, но мы думаем, что это та же проблема:

File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 94, in connect
  sock = socket.create_connection((self.host, self.port), self.timeout)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/gevent/socket.py", line 637, in create_connection
  for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/gevent/socket.py", line 769, in getaddrinfo
  raise
DNSError: [Errno 66] unknown

Сначала я подумал, что это может быть связано с libevent-dns, из этого проблема с группами Google. Проверил наш /etc/resolv.conf, а там только один сервис разрешения dns:

[me@host:~]$ cat /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 10.3.0.2

Я посмотрел, что такое ERRNO66: https://github.com/libevent/libevent/blob/master/include/event2/dns.h#L162,"/** Произошла неизвестная ошибка */". Мне не очень повезло найти это полезным ... похоже, что он не может общаться с DNS-сервером?

Я подумал, что, возможно, придется что-то делать с python-requests, см. как включить асинхронный режим запросов? так как python-requests зависит от urllib3, что реализовано в терминах httplib; но оказывается, что автор gevent удалил патч httplib в этот коммит ранее в этом году без каких-либо комментариев относительно того, почему.

Есть ли у кого-нибудь идеи о том, как подойти к отладке этой проблемы, или может пролить свет на то, что здесь происходит?

Заранее спасибо!

Обновление — 12:50 по тихоокеанскому времени

После некоторых разговоров на freenode, #gevent и канал #gunicorn, кажется, пролили больше информации:

#gevent

  • gevent v0.13.7 по-прежнему поддерживает patch_all с httplib=True
  • Я спросил "есть ли смысл патчить?", ответ был нет.
  • Рекомендация использовать gevent 1.0 (даже если это бета-версия).
  • #P11# <блочная цитата> #P12#

#ганикорн

  • <Damianz> Какая у вас платформа? Я видел, как эта проблема появляется в окнах, где он пытается использовать ipv6 и просто терпит неудачу.. (Я на CentOS 5)
  • <dmishe> Я видел подобное на Mac, похоже, бета-версия gevent это исправила

Похоже, общий совет — отказаться от gevent v0.13.7 и перейти на gevent 1.0b.

Я продолжу, если это решит эту проблему. Между тем, кто может дать совет, буду очень признателен.

Обновление № 2 — 4 дня в производстве, 13:15 по тихоокеанскому времени.

Похоже, что обновление до gevent решило эту проблему - я добавлю свой ответ и приму его, если никто не откликнется, но только после недели без инцидентов в производстве.


person Mahmoud Abdelkader    schedule 13.09.2012    source источник
comment
В последний раз, когда я тестировал gevent 1.0 (libev), я столкнулся с проблемой, что пример разрешения 300 имен хостов выполняется около 2 секунд, а версия 0.13 (libevent) работает 0,1 секунды или около того. 0.13 использует механизм разрешения и кэширования libevent, а 1.0 использует c-ares. Что касается вашего вопроса: если это воспроизводимо - вы можете попробовать трассировку.   -  person SanityIO    schedule 17.09.2012
comment
Обновление до gevent 1.0b(libev), кажется, устранило проблемы с DNSError. Проблема не воспроизводима, но на самом деле довольно прерывистая и очень разрушительная для нашего бизнеса. Я буду следить за этими проблемами с производительностью, тем временем я предлагаю вам уведомить команду gevent, чтобы они знали о вашей проблеме в будущем.   -  person Mahmoud Abdelkader    schedule 18.09.2012


Ответы (1)


Обновление до gevent 1.0b устранило проблему.

person Mahmoud Abdelkader    schedule 02.10.2012