Во-первых, версии:
- 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
решило эту проблему - я добавлю свой ответ и приму его, если никто не откликнется, но только после недели без инцидентов в производстве.