Ứng dụng của chúng tôi đang đọc dữ liệu rất nhanh qua các cổng TCP/IP trong Java. Chúng tôi đang sử dụng thư viện NIO với một Ổ cắm không chặn và Bộ chọn để cho biết sự sẵn sàng để đọc. Trung bình, thời gian xử lý tổng thể để đọc và xử lý dữ liệu đọc là dưới một phần nghìn giây. Tuy nhiên, chúng tôi thường xuyên thấy các gai 10-20 mili giây. (chạy trên Linux).Vấn đề hiệu suất Socket Java TCP/IP
Sử dụng tcpdump chúng tôi có thể thấy sự khác biệt về thời gian giữa việc đọc tcpdump của 2 thông điệp kín đáo và so sánh điều đó với thời gian đăng ký của chúng tôi. Chúng tôi thấy tcpdump dường như không có độ trễ, trong khi ứng dụng có thể hiển thị 20 mili giây. Chúng tôi khá chắc chắn đây không phải GC, vì nhật ký GC cho thấy hầu như không có GC đầy đủ, và trong JDK 6 (từ những gì tôi hiểu), GC mặc định là song song, vì vậy nó không nên tạm dừng các luồng ứng dụng (trừ khi làm đầy đủ GC). Có vẻ như có sự chậm trễ cho phương pháp Selector.select(0)
của Java để trả lại sự sẵn sàng để đọc, bởi vì ở lớp TCP, dữ liệu đã sẵn sàng để đọc (và tcpdump đang đọc nó).
Thông tin bổ sung: tại tải cao điểm, chúng tôi xử lý khoảng 6.000 x 150 byte trung bình cho mỗi thư hoặc khoảng 900 MB mỗi giây.
Như @Jim Lewis đã nói, có khả năng mất thời gian để chuyển ngữ cảnh và bạn không thể kiểm soát cách Java triển khai NIO nội bộ. Hoàn toàn có thể là JVM bổ sung thêm một số chi phí mà bạn sẽ không thể loại bỏ. Điều đó nói rằng, không nhìn thấy nhiều dữ liệu hơn, tôi không thể đưa ra giải pháp. –
Vâng - Tôi đã dọn dẹp các câu trả lời không được chấp nhận của mình. Tôi không muốn bất cứ ai nghĩ rằng tôi không coi trọng thời gian họ đã trả lời câu hỏi. –
Tôi có thể giúp cung cấp một số chi tiết về jvm, kernel/distro, phần cứng – Matt