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.