Repro đơn giản - trong một cửa sổ xem các quy trình ở trên cùng, trong lần chạy khác: nc -lkp 10000 > /dev/null & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 ) & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 )
Quan sát rằng chỉ có một cái đầu
và nc
quá trình đang tích cực sử dụng CPU.
Gắn dấu vết vào cái đầu
cái đó không hoạt động - hãy xem nó bị đình trệ khi ghi, ví dụ:
strace: Quy trình 589084 đính kèm
write(1, "\264\347\270\26\27\24'BRb^\353\302\36@\216\17V\210*n\252`\353\330\351\276\2\250 \330\350\217"..., 4096^Cstrace: Quá trình 589084 đã tách ra
<tách ra ...>
Thiết lập hai trình nghe trên các cổng khác nhau - ví dụ: 10000 và 10001, và cả hai đều chạy hết tốc lực.
Đây là một ví dụ đơn giản, nhưng tôi có thể sao chép nó bằng các đầu vào và đầu ra khác - ví dụ: zcatting các tệp lớn và gửi chúng đến các dịch vụ sản xuất qua mạng. Nó không liên quan đến đầu vào và nó không liên quan đến ổ cắm nghe.
Vậy - tại sao tôi chỉ có thể có một kết nối tcp tới bất kỳ Máy chủ/cổng cụ thể nào đang chủ động gửi dữ liệu?
Có một nguồn dữ liệu độc lập (vui lòng thử nghiệm nếu bạn không tin tôi) và một quy trình độc lập mở kết nối tcp của chính nó (netstat
sẽ hiển thị cả hai đều mở) - điểm chung duy nhất là điểm đến (không nhất thiết phải là nc
nghe trên lo
- xảy ra với bất cứ điều gì).
Do đích chắc chắn có thể có nhiều ổ cắm đến nhận dữ liệu cùng một lúc và nguồn chắc chắn có thể gửi dữ liệu xuống nhiều ổ cắm mạng cùng một lúc, tôi đang cố gắng tìm ra nguồn gốc của sự tranh chấp, khiến chỉ có một đường ống hoạt động tại Một lần.