Câu hỏi này tương tự như Network port open, but no process attached? và netstat shows a listening port with no pid but lsof does not. Nhưng câu trả lời cho họ không thể giải quyết được tôi, vì nó quá kỳ quặc.Tại sao luôn có 5 kết nối không có chương trình kèm theo?
Tôi có một ứng dụng máy chủ gọi lps
mà chờ đợi cho các kết nối tcp trên cổng 8588.
[[email protected] lcms]# netstat -lnp | grep 8588
tcp 0 0 0.0.0.0:8588 0.0.0.0:* LISTEN 6971/lps
Như bạn có thể thấy, không có gì là sai với ổ cắm nghe, nhưng khi tôi kết nối một số ngàn khách hàng kiểm tra (bằng văn bản bởi một đồng nghiệp khác) đến máy chủ, cho dù là 2000, 3000 hoặc 4000. Luôn có 5 khách hàng (cũng ngẫu nhiên) kết nối và gửi yêu cầu đăng nhập tới máy chủ, nhưng không thể nhận được bất kỳ phản hồi nào. Lấy 3000 khách hàng làm ví dụ. Đây là những gì lệnh netstat
cho:
[[email protected] lcms]# netstat -nap | grep 8588 | grep ES | wc -l
3000
Và đây là lsof
lệnh đầu ra:
[[email protected] lcms]# lsof -i:8588 | grep ES | wc -l
2995
Đó 5 kết nối đang ở đây:
[[email protected] lcms]# netstat -nap | grep 8588 | grep -v 'lps'
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52658 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52692 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52719 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52721 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52705 ESTABLISHED -
5 ở trên cho thấy rằng họ đang kết nối đến máy chủ trên cổng 8588 nhưng không có chương trình nào được đính kèm. Và cột thứ hai (là RECV-Q
) tiếp tục tăng khi khách hàng đang gửi yêu cầu.
Các liên kết ở trên nói điều gì đó về gắn kết NFS và RPC. Đối với RPC, tôi đã sử dụng lệnh rcpinfo -p
và kết quả không liên quan gì đến cổng 8588. Và kết nối NFS, nfssta
đầu ra cho biết Error: No Client Stats (/proc/net/rpc/nfs: No such file or directory).
Câu hỏi: Điều này có thể xảy ra như thế nào? Luôn luôn 5 và cũng không phải từ 5 khách hàng giống nhau. Tôi không nghĩ rằng đó là xung đột cổng như các khách hàng khác cũng được kết nối với cùng một máy chủ IP và cổng và tất cả chúng đều được xử lý đúng bởi máy chủ.
Lưu ý: Tôi đang sử dụng Linux epoll
để chấp nhận yêu cầu của khách hàng. Tôi cũng viết mã gỡ lỗi trong chương trình của tôi và ghi lại mọi ổ cắm (cùng với thông tin của khách hàng) mà trả về accept
nhưng không thể tìm thấy 5 kết nối. Đây là uname -a
đầu ra:
Linux centos63 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Cảm ơn sự giúp đỡ của các bạn! Tôi thực sự bối rối.
Cập nhật 2013/06/08: Sau khi nâng cấp hệ thống để CentOS 6.4, cùng một vấn đề xảy ra. Cuối cùng tôi quay trở lại epoll
và tìm thấy this page rằng bộ đó nghe fd không bị chặn và accept
cho đến khi EAGAIN
hoặc EWOULDBLOCK
lỗi trả về. Và có, nó hoạt động. Không còn kết nối nào đang chờ xử lý. Nhưng tại sao vậy? Các Unix Mạng Lập trình Tập 1 nói
accept is called by a TCP server to return the next completed connection from the
front of the completed connection queue. If the completed connection queue is empty,
the process is put to sleep (assuming the default of a blocking socket).
Vì vậy, nếu vẫn còn một số kết nối hoàn thành trong hàng đợi, tại sao quá trình này được đưa vào giấc ngủ?
Cập nhật 2013/07/01: tôi sử dụng EPOLLET
khi thêm ổ cắm nghe, vì vậy tôi không thể chấp nhận tất cả nếu không giữ chấp nhận cho đến EAGAIN
gặp phải. Tôi vừa mới nhận ra vấn đề này. Lỗi của tôi. Hãy nhớ rằng: luôn luôn read
hoặc accept
cho đến khi EAGAIN
xuất hiện nếu sử dụng EPOLLET
, ngay cả khi đó là ổ cắm nghe. Một lần nữa xin cảm ơn Matthew đã chứng minh cho tôi một chương trình thử nghiệm.
Có điều gì đặc biệt về IP 192.168.0.241 trong môi trường của bạn không? – Nils
Một thứ khác được thêm vào @Nils, tôi không nghĩ rằng đó là sự cố của IP 192.168.0.241. Chúng tôi có một số máy ảo thử nghiệm và 5 máy đó có thể đến từ các máy chủ khác nhau. – leowang
Đợi một chút. Là máy chủ này 'lps' một chương trình bạn đang viết? –