まず、バージョン:
- 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 groups issueに関連する可能性があると思いました。を確認し/etc/resolv.conf
たところ、DNS 解決サービスは 1 つしかありません。
[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:50PM PDT
freenode でのいくつかの会話の後、#gevent と #gunicorn チャンネルはさらに洞察を与えているようです:
#gevent
- gevent v0.13.7 は引き続き
patch_all
with をサポートしていますhttplib=True
- 「パッチを当てるのは理にかなっていますか?」と尋ねたところ、答えはノーでした。
- gevent 1.0 を使用することをお勧めします (ベータ版であっても)。
@schmirからの引用:
「パッチ httplib は libevent http クライアント ライブラリを使用します。私は libevent を信頼していません。私のアドバイスは、使用している場合はオフにすることでした」
#ガンコーン
<Damianz>
あなたのプラットフォームは何ですか?私はその問題がipv6を試みて失敗するWindowsボックスに現れるのを見てきました..(私はCentOS 5を使用しています)<dmishe>
私はMacで同様のものを見てきました.geventベータ版がそれを修正したようです
一般的なアドバイスは、gevent v0.13.7 を捨てて gevent 1.0b にアップグレードすることです。
この問題が解決するかどうかをフォローアップします。それまでの間、アドバイスをいただける方がいらっしゃいましたら、よろしくお願いいたします。
更新 #2 - 本番環境で 4 日間、午後 1 時 15 分 (PDT)
へのアップグレードでgevent
この問題は解決されたようです。回答を追加して、他に誰も連絡がなければ受け入れますが、本番環境でインシデントが発生しなかった 1 週間後にのみ承認します。