龙卷风 Python 阻塞 _socket.getaddrinfo
Tornado Python blocking on _socket.getaddrinfo
Python3.4
龙卷风 4.3
当使用 AsyncHttpClient 并捕获任何大于 1s 的阻塞调用时,我偶尔会得到这个堆栈跟踪。
_socket.getaddrinfo
正在阻塞。
怎么会这样? DNS 没有缓存吗?域解析缓慢或网络故障?
IOLoop blocked for more than 1 seconds in
...
response = yield client.fetch(request, raise_error=True)
File "/usr/local/lib/python3.4/dist-packages/tornado/httpclient.py", line 255, in fetch
self.fetch_impl(request, handle_response)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 133, in fetch_impl
self._process_queue()
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 148, in _process_queue
self._handle_request(request, release_callback, callback)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 157, in _handle_request
self.max_header_size, self.max_body_size)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 236, in __init__
callback=self._on_connect)
File "/usr/local/lib/python3.4/dist-packages/tornado/gen.py", line 230, in wrapper
yielded = next(result)
File "/usr/local/lib/python3.4/dist-packages/tornado/tcpclient.py", line 164, in connect
addrinfo = yield self.resolver.resolve(host, port, af)
File "/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py", line 371, in wrapper
future = getattr(self, executor).submit(fn, self, *args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py", line 337, in submit
future.set_result(fn(*args, **kwargs))
File "/usr/local/lib/python3.4/dist-packages/tornado/netutil.py", line 374, in resolve
addrinfo = socket.getaddrinfo(host, port, family, socket.SOCK_STREAM)
File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
根据操作系统的配置,DNS 查找可能会也可能不会被缓存。 Mac OS X 系统会缓存一分钟左右,Linux 系统通常 不会 在其默认配置中缓存 DNS。
默认情况下,Tornado 直接调用 getaddrinfo 并将其留给您的系统实现来缓存结果。您可以使用缓存配置您的系统,或者接受偶尔的 getaddrinfo 调用会很慢,或者为 Tornado 安装一个非阻塞解析器,如 PyCARES 或 Twisted。有关详细信息,请参阅 Tornado's documentation on configuring alternate resolvers。
Python3.4
龙卷风 4.3
当使用 AsyncHttpClient 并捕获任何大于 1s 的阻塞调用时,我偶尔会得到这个堆栈跟踪。
_socket.getaddrinfo
正在阻塞。
怎么会这样? DNS 没有缓存吗?域解析缓慢或网络故障?
IOLoop blocked for more than 1 seconds in
...
response = yield client.fetch(request, raise_error=True)
File "/usr/local/lib/python3.4/dist-packages/tornado/httpclient.py", line 255, in fetch
self.fetch_impl(request, handle_response)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 133, in fetch_impl
self._process_queue()
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 148, in _process_queue
self._handle_request(request, release_callback, callback)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 157, in _handle_request
self.max_header_size, self.max_body_size)
File "/usr/local/lib/python3.4/dist-packages/tornado/simple_httpclient.py", line 236, in __init__
callback=self._on_connect)
File "/usr/local/lib/python3.4/dist-packages/tornado/gen.py", line 230, in wrapper
yielded = next(result)
File "/usr/local/lib/python3.4/dist-packages/tornado/tcpclient.py", line 164, in connect
addrinfo = yield self.resolver.resolve(host, port, af)
File "/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py", line 371, in wrapper
future = getattr(self, executor).submit(fn, self, *args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py", line 337, in submit
future.set_result(fn(*args, **kwargs))
File "/usr/local/lib/python3.4/dist-packages/tornado/netutil.py", line 374, in resolve
addrinfo = socket.getaddrinfo(host, port, family, socket.SOCK_STREAM)
File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
根据操作系统的配置,DNS 查找可能会也可能不会被缓存。 Mac OS X 系统会缓存一分钟左右,Linux 系统通常 不会 在其默认配置中缓存 DNS。
默认情况下,Tornado 直接调用 getaddrinfo 并将其留给您的系统实现来缓存结果。您可以使用缓存配置您的系统,或者接受偶尔的 getaddrinfo 调用会很慢,或者为 Tornado 安装一个非阻塞解析器,如 PyCARES 或 Twisted。有关详细信息,请参阅 Tornado's documentation on configuring alternate resolvers。