2013-11-20 13 views
5

Máy chủ (Linux) của chúng tôi đã sử dụng tùy chọn {active, once} với ổ cắm của nó và có các thông báo {tcp_error, Socket, etimedout} bật lên. Tôi biết điều này có thể là do điều kiện mạng xấu, nhưng có điều gì đó kỳ lạ về nó.Thông điệp '{tcp_error, Socket, etimedout}' của ổ cắm hoạt động đến từ đâu?

TCP keepalive được kích hoạt trên toàn hệ thống trên máy tính của chúng tôi, và các giá trị tùy chọn thực tế là:

net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_keepalive_probes = 9 
net.ipv4.tcp_keepalive_intvl = 75 

Có nghĩa là các ổ cắm sẽ timeout trong ít nhất 20 phút, tôi tin. Nhưng thật lạ lùng, các quy trình của chúng tôi đã nhận được {tcp_error, Socket, etimedout} trong chưa đầy 10 giây.

Tôi đã tự hỏi, counld nó được kích hoạt bởi các hoạt động gen_tcp:send(...)? Và sau đó tôi thấy điều đó là không thể bởi vì các hoạt động gửi đều đồng bộ, chúng sẽ thất bại ngay lập tức.

Vì vậy, câu hỏi của tôi là, thông báo etimedout xuất phát từ đâu? Hoặc những gì kích hoạt nó chính xác? Tôi goofed xung quanh nguồn C của Erlang VM, đặc biệt là inet_drv.c, nhưng không có kết luận nào được nêu ra.

Cảm ơn.

Trả lời

3

Chụp tcpdump cho thấy rằng đó là sự kiện thời gian chờ từ truyền lại TCP.

Máy chủ của chúng tôi có số /proc/sys/net/ipv4/tcp_retries2 được đặt thành 5, dẫn đến ngắt kết nối trong 5 lần truyền, trong khi giá trị mặc định là 15 trên máy phát triển, vì vậy chúng tôi không thể tạo lại sự cố cục bộ.

Trả lại từ gen_tcp:send(...) (hoặc các API tương đương bằng các ngôn ngữ khác) chỉ có nghĩa là gói được chấp nhận bởi ngăn xếp TCP, nhưng không đảm bảo rằng gói đó có thể đến được ngang hàng và lỗi có thể được giải quyết khi bạn bị chặn hoạt động.

Tìm thấy một số mô tả ngắn gọn về truyền lại TCP here.

Các vấn đề liên quan