首先,版本:
- gevent - v0.13.7
- gunicorn - v0.14.2
- 请求 - 0.11.2
我们最近升级了在 gunicorn 后面运行的服务器,以使用 gevent 异步工作人员,而不仅仅是普通的同步工作人员。一切都很好,但是我们现在在尝试通过 http 访问 3rd 方服务时遇到了一个问题,我只是不知道如何追踪可能是什么问题。
简短的堆栈跟踪如下所示:
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 groups issue相关。我检查了我们的/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
withhttplib=True
- 我问“修补它是否有意义?”,回答是否定的。
- 建议使用 gevent 1.0(即使它是 beta 版)。
来自@schmir 的引用:
“patch httplib 使用 libevent http 客户端库。我不信任 libevent。如果您使用它,我的建议是关闭它”
#独角兽
<Damianz>
你的平台是什么?我已经看到这个问题出现在它尝试 ipv6 并且只是失败的 Windows 盒子上。(我在 CentOS 5 上)<dmishe>
我在mac上看到过类似的,看起来gevent beta修复了它
听起来一般建议是放弃 gevent v0.13.7 并升级到 gevent 1.0b。
如果能解决这个问题,我会跟进。同时,任何可以提供建议的人,我都会非常感激。
更新 #2 - 生产 4 天,太平洋夏令时间下午 1:15
看起来升级到gevent
已经解决了这个问题——如果没有其他人插话,我会添加我的答案并接受它,但只有在生产中没有发生任何事件的一周之后。