Python requests调用API报域名解析错误且进程因OOM被杀死问题求助
问题描述
使用Python的requests库请求API的脚本由调度器每日执行一次,此前运行一切正常,近期运行时会抛出异常,且对应PID的Python进程会因OOM(内存不足)被系统杀死,暂无法判断问题是DNS解析故障导致还是内存不足直接导致,寻求排查思路与解决方案。
报错回溯信息
Traceback (most recent call last): File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connection.py", line 170, in _new_conn (self._dns_host, self.port), self.timeout, **extra_kw File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/util/connection.py", line 73, in create_connection for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): File "/usr/lib/python3.6/socket.py", line 745, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -3] Temporary failure in name resolution During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 706, in urlopen chunked=chunked, File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 382, in _make_request self._validate_conn(conn) File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 1010, in _validate_conn conn.connect() File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connection.py", line 353, in connect conn = self._new_conn() File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connection.py", line 182, in _new_conn self, "Failed to establish a new connection: %s" % e urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7f163156c160>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/adapters.py", line 449, in send timeout=timeout File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 756, in urlopen method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] File "/home/ubuntu/.local/lib/python3.6/site-packages/urllib3/util/retry.py", line 574, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='<.............>', port=443): Max retries exceeded with url: /api/v2/test_connection/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f163156c160>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/pf_cic_etl_script_v2.py", line 50, in <module> resp = requests.get(url, headers=headers) File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/api.py", line 76, in get return request('get', url, params=params, **kwargs) File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/sessions.py", line 542, in request resp = self.send(prep, **send_kwargs) File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/sessions.py", line 655, in send r = adapter.send(request, **kwargs) File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/adapters.py", line 516, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPSConnectionPool(host='<...............>', port=443): Max retries exceeded with url: /api/v2/test_connection/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f163156c160>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',)) Killed
进程被杀死系统日志
dmesg -T| grep -E -i -B100 'killed process' [Sat Sep 25 06:08:31 2021] Tasks state (memory values in pages): [Sat Sep 25 06:08:31 2021] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name [Sat Sep 25 06:08:31 2021] [ 1643] 1000 1643 517804 455512 4157440 0 0 python3 [Sat Sep 25 06:08:31 2021] [ 1651] 0 1651 5954 69 86016 0 0 apport [Sat Sep 25 06:08:31 2021] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice,task=python3,pid=1643,uid=1000 [Sat Sep 25 06:08:31 2021] Out of memory: Killed process 1643 (python3) total-vm:2071216kB, anon-rss:1822048kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:4060kB oom_score_adj:0
排查思路与解决方案
首先明确:DNS解析故障和OOM是两个独立存在的问题,前者是请求阶段抛出的业务异常,后者是进程占用内存超出系统阈值被强制终止的系统事件,两者无直接因果关系。
DNS解析问题排查
- 手动验证服务器DNS可用性:执行
nslookup 你的API域名或ping 你的API域名,确认是否能正常解析到IP,依次排查/etc/resolv.conf配置是否错误、上游DNS服务器是否宕机、服务器网络策略是否限制了DNS请求 - 临时在
/etc/hosts中绑定API域名和对应IP,重新运行脚本观察是否还会报解析错误,快速确认问题根因 - 脚本层面添加DNS解析异常捕获逻辑,遇到解析错误直接终止进程,避免后续无效逻辑占用内存资源
OOM内存溢出问题排查
- 从dmesg日志可看出Python进程运行时占用了近1.8G物理内存,先排查脚本逻辑:是否存在请求返回的响应体过大未及时释放、循环加载大量数据到内存不释放、内存泄漏等问题
- 使用
memory_profiler工具逐行检测脚本内存占用,定位内存飙升的具体代码位置 - 代码优化:如果接口返回大体积响应,添加
stream=True参数流式下载,避免一次性加载整个响应到内存;处理完的数据及时释放引用,不要长期存放在全局变量中 - 临时兜底方案:给脚本添加cgroup内存限制,或在调度执行前先检查系统可用内存,不足时延后执行,避免触发系统OOM杀死进程影响其他服务
额外优化建议
- 给requests请求配置合理的超时时间和重试次数,避免请求 hang 住长期占用资源,示例配置:
requests.get(url, headers=headers, timeout=10),重试逻辑可通过requests.adapters.HTTPAdapter配置 - 脚本执行时添加日志输出,记录每一步的内存占用和执行状态,方便后续出现问题时快速定位
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

