UDP là giao thức hoàn toàn khả thi. Đó là trường hợp cũ của công cụ thích hợp cho đúng công việc!
Nếu bạn có một chương trình chờ UDP datagram, và sau đó đi để xử lý chúng trước khi trở về để chờ khác, sau đó thời gian xử lý trôi qua của bạn cần phải luôn luôn nhanh hơn tỷ lệ đến trường hợp xấu nhất của datagrams. Nếu không, thì hàng đợi nhận của cổng UDP sẽ bắt đầu lấp đầy.
Điều này có thể được dung thứ cho các vụ nổ ngắn. Hàng đợi thực hiện chính xác những gì nó được cho là làm - xếp hàng các gói dữ liệu cho đến khi bạn sẵn sàng. Nhưng nếu tỷ lệ đến trung bình thường xuyên gây ra một tồn đọng trong hàng đợi, đó là thời gian để thiết kế lại chương trình của bạn. Có hai lựa chọn chính ở đây: giảm thời gian xử lý trôi qua thông qua các kỹ thuật lập trình xảo quyệt và/hoặc đa luồng chương trình của bạn. Cân bằng tải trên nhiều phiên bản của chương trình của bạn cũng có thể được sử dụng.
Như đã đề cập, trên Linux, bạn có thể kiểm tra hệ thống tệp proc để nhận trạng thái về UDP. Ví dụ, nếu tôi cat
nút /proc/net/udp
, tôi nhận được một cái gì đó như thế này:
$ cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
40: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 3466 2 ffff88013abc8340 0
67: 00000000:231D 00000000:0000 07 00000000:0001E4C8 00:00000000 00000000 1006 0 16940862 2 ffff88013abc9040 2237
122: 00000000:30D4 00000000:0000 07 00000000:00000000 00:00000000 00000000 1006 0 912865 2 ffff88013abc8d00 0
Từ đó, tôi có thể thấy rằng một ổ cắm thuộc sở hữu của người sử dụng id 1006, đang lắng nghe trên cổng 0x231D (8989) và rằng nhận hàng đợi ở khoảng 128KB. Vì 128KB là kích thước tối đa trên hệ thống của tôi, điều này cho tôi biết chương trình của tôi là yếu kém trong việc theo kịp với các datagram đến. Đã có 2237 giọt cho đến nay, có nghĩa là lớp UDP không thể đặt thêm bất kỳ gói dữ liệu nào vào hàng đợi socket và phải thả chúng.
Bạn có thể xem hành vi của chương trình theo thời gian, ví dụ: sử dụng:
watch -d 'cat /proc/net/udp|grep 00000000:231D'
Cũng lưu ý rằng lệnh netstat ta về những điều tương tự: netstat -c --udp -an
Giải pháp của tôi cho chương trình weenie của tôi, sẽ là multi-thread.
Chúc mừng!
Cảm ơn rx_queue, phần còn lại - xem cập nhật) –
@Juliano Ai nói rằng anh ấy có thể chọn giao thức để sử dụng? Có thể anh ấy đang triển khai giao thức dựa trên udp để phục vụ khách hàng hiện tại. – steffen
Poster muốn biết về việc giám sát số liệu thống kê UDP, không cho ý kiến về giao thức sử dụng. Bằng cách xác định vị trí đầu tiên xảy ra mất lớp, người ta có thể làm việc trên một bản sửa lỗi. – RickS