2011-12-02 22 views
14

Sau khi chạy trong một số giờ trên Linux, chương trình Python 2.6 của tôi sử dụng urllib2, httplib và chủ đề, bắt đầu tăng lỗi này cho mọi yêu cầu:Vĩnh viễn 'Tạm thời thất bại trong giải pháp tên' sau khi chạy trong một số giờ

<class 'urllib2.URLError'> URLError(gaierror(-3, 'Temporary failure in name resolution'),)

Nếu tôi khởi động lại chương trình, chương trình sẽ bắt đầu hoạt động trở lại. Tôi đoán là một số loại cạn kiệt tài nguyên nhưng tôi không biết cách kiểm tra nó. Làm cách nào để chẩn đoán và khắc phục sự cố?

+2

Bạn đang đóng cửa sớm hơn HTTPRequests (hoặc bất cứ điều gì bạn đang sử dụng)? –

+0

Đang cố gắng. Tôi chỉ nhận thấy tôi có một số lượng lớn các kết nối CLOSE_WAIT phải liên quan đến vấn đề này. – 2371

Trả lời

12

Điều này là do sự thất bại của một thư viện để đóng các kết nối, dẫn đến một số lượng lớn các kết nối bị mắc kẹt trong một trạng thái CLOSE_WAIT. Cuối cùng, điều này gây ra lỗi 'Lỗi tạm thời trong độ phân giải tên' do cạn kiệt tài nguyên.

+12

Khi nào vấn đề này được khắc phục chính xác? Tôi cho rằng lỗi đó là do thư viện httplib gây ra? – pkaleta

+10

Được phân bổ, vui lòng cung cấp thêm chi tiết về những phát hiện của bạn, cảm ơn! –

+8

@ 2371: Làm sao bạn phát hiện ra là do cạn kiệt tài nguyên? – rajpy

0

Đã gặp sự cố tương tự, trong trường hợp của tôi không cạn kiệt tài nguyên, máy chủ DHCP của tôi đã thay đổi địa chỉ máy chủ, libc không muốn chơi bóng và tải lại tệp resolv.conf mới, duy trì đã lưu vào bộ nhớ cache và buộc tôi phải khởi động lại tập lệnh mỗi lần thay đổi.

Tất cả các kết nối socket python nỗ lực của tôi thất bại sau này, vì vậy tôi tìm thấy this code rằng giải quyết tình trạng này:

import ctypes 
try: 
    libc = ctypes.CDLL('libc.so.6') 
    res_init = getattr(libc, '__res_init') 
    res_init(None) 
except: 
    pass 

Sử dụng nó trước khi gọi các socket.connect, hy vọng điều này sẽ giúp