2012-02-08 20 views
9

Tôi có một ứng dụng java trong đó sử dụng một vài trường hợp MulticastSocket để nghe đến một vài nguồn cấp dữ liệu đa hướng UDP. Mỗi ổ cắm như vậy được xử lý bởi một sợi chuyên dụng.
Chủ đề đọc từng Datagram, phân tích nội dung của nó và ghi vào nhật ký (log4j) id trình tự của gói (long) và dấu thời gian mà Datagram đã nhận được.java - MulticastSocket vấn đề trên Windows Server 2008

Khi tôi cố gắng chạy 2 phiên bản của cùng một ứng dụng trên Windows Server 2008 R2, với 2 * 6 lõi và so sánh 2 bản ghi được tạo bởi 2 ứng dụng, Tôi nhận thấy rằng thời gian của gói không giống nhau.

Hầu hết các gói được nhận bởi 2 ứng dụng cùng một lúc (milis), nhưng thường xuyên có sự khác biệt khoảng 1-7ms khác nhau giữa thời gian tiếp nhận của cùng một gói bởi 2 ứng dụng.

Tôi đã thử phân bổ thêm bộ đệm trong NIC và cũng làm cho bộ đệm ổ cắm lớn hơn. Ngoài ra, tôi đã thử giảm thiểu số lần chạy GC và tôi cũng sử dụng -verbose: gc và có thể thấy rằng thời gian GC và sự khác biệt về thời gian có vấn đề không xảy ra cùng một lúc. Điều này cho phép tôi giả định rằng vấn đề của tôi không liên quan đến GC.

Không có vấn đề về gói thả nào được quan sát và vấn đề về băng thông không có khả năng xảy ra.

Ý tưởng/Ý kiến ​​được hoan nghênh. Cảm ơn.

+1

Tần số ngắt của hệ điều hành AFAIK là 1 trên mỗi 10ms, do đó hệ điều hành không thể đảm bảo các khoảng thời gian cao hơn mức đó. –

Trả lời

6

Theo mặc định, tần số gián đoạn của bộ hẹn giờ Windows là 100 Hz (1 lần đánh dấu trên mỗi 10ms). Nó có nghĩa là hệ điều hành không thể đảm bảo rằng các luồng Java sẽ được đánh thức ở độ chính xác cao hơn.

Dưới đây là một đoạn trích từ một nổi bật James Holmes article về thời gian trong Java - nó có thể là trường hợp của bạn:

cho người dùng Windows, đặc biệt là trên các hệ thống lõi kép hoặc đa xử lý (và có vẻ như phổ biến nhất trên x64 Các hệ thống AMD) nếu bạn thấy hành vi thời gian thất thường trong Java hoặc các ứng dụng khác (trò chơi, bản trình bày đa phương tiện) trên hệ thống của bạn, sau đó thử thêm công tắc/usepmtimer vào tệp boot.ini của bạn.

PS: không có nghĩa là tôi đáng tin cậy trong lĩnh vực tối ưu hóa hiệu suất Windows, cũng bắt đầu từ Windows 2008 HPET được hỗ trợ, nhưng làm thế nào nó liên quan đến tần số ngắt hẹn giờ là một bí ẩn đối với tôi.

0

7ms là kết quả rất tốt đối với máy 6 lõi và trôi dạt trong java sẽ cao hơn nhiều nếu trình thu gom rác khởi động. Đừng quên rằng thời gian chạy java cũng có chi phí riêng.