使用gevent访问外部http服务时出现间歇性问题

时间:2012-09-13 18:40:17

标签: python exception gevent gunicorn python-requests

首先,版本:

  • gevent - v0.13.7
  • gunicorn - 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 /etc/resolv.conf有关。我查看了[me@host:~]$ cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 10.3.0.2 ,并且只有一个DNS解析服务:

python-requests

我查看了ERRNO66的内容:google groups issue,“/ **发生未知错误* /”。我没有太多运气找到那些有用的东西......就像它无法与dns服务器通话一样?

我认为可能需要对python-requests执行某些操作,请参阅https://github.com/libevent/libevent/blob/master/include/event2/dns.h#L162,因为urllib3取决于httplibgevent实施,httplib;但是,事实证明patch_all的作者今年早些时候在how enable requests async mode?提交中删除了httplib=True补丁而没有任何关于原因的评论。

有没有人对如何调试此问题有任何想法,或者可能会对这里发生的事情有所了解?

提前致谢!

更新 - 下午12:50 PDT

在对freenode进行一些对话后,#gevent和#gunicorn频道似乎有了更多的见解:

#gevent

  • gevent v0.13.7仍然支持<Damianz><dmishe>
  • 我问“修补它是否有意义?”,答案是否定的。
  • 建议使用gevent 1.0(即使它是测试版)。
  • 引自@schmir:

      

    “补丁httplib使用libevent http客户端库。我不相信libevent。如果您使用它,我的建议就是关闭它”

#gunicorn

  • gevent你的平台是什么?我已经看到这个问题出现在Windows框中,它尝试ipv6并且生命失败..(我在CentOS 5上)
  • {{1}}我在mac上看到类似的内容,看起来像gevent beta修复它

听起来一般的建议是放弃gevent v0.13.7并升级到gevent 1.0b。

如果能解决这个问题,我会跟进。与此同时,任何能够提出建议的人,我都会非常感激。

更新#2 - 4天生产,下午1:15 PDT

看起来升级到{{1}}已经解决了这个问题 - 我会添加我的答案并接受它,如果没有其他人插入,但仅在一周内没有生产中的事件。

1 个答案:

答案 0 :(得分:3)

升级到gevent 1.0b已经消除了这个问题。