8

まず、バージョン:

  • 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-requestsurllib3httplibgeventhttplib

この問題のデバッグにアプローチする方法について何か考えがある人はいますか?

前もって感謝します!

更新 - 12:50PM PDT

freenode でのいくつかの会話の後、#gevent と #gunicorn チャンネルはさらに洞察を与えているようです:

#gevent

  • gevent v0.13.7 は引き続きpatch_allwith をサポートしています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 週間後にのみ承認します。

4

1 に答える 1

3

gevent 1.0b にアップグレードすると、この問題は解消されます。

于 2012-10-02T07:39:36.007 に答える