Tôi muốn mô phỏng độ trễ và mất gói cho UDP
và TCP
trên Linux để đo hiệu năng của một ứng dụng. Có một cách đơn giản để làm điều này?
Tôi muốn mô phỏng độ trễ và mất gói cho UDP
và TCP
trên Linux để đo hiệu năng của một ứng dụng. Có một cách đơn giản để làm điều này?
Câu trả lời:
netem tận dụng chức năng đã được tích hợp trong Linux và các tiện ích không gian người dùng để mô phỏng các mạng. Đây thực sự là những gì câu trả lời của Mark đề cập đến, bằng một tên khác.
Các ví dụ trên trang chủ của họ đã cho thấy cách bạn có thể đạt được những gì bạn đã yêu cầu:
Ví dụ
Giả lập độ trễ mạng diện rộng
Đây là ví dụ đơn giản nhất, nó chỉ thêm một độ trễ cố định cho tất cả các gói đi ra khỏi Ethernet cục bộ.
# tc qdisc add dev eth0 root netem delay 100ms
Bây giờ, một thử nghiệm ping đơn giản để lưu trữ trên mạng cục bộ sẽ hiển thị mức tăng 100 mili giây. Độ trễ được giới hạn bởi độ phân giải xung nhịp của kernel (Hz). Trên hầu hết các hệ thống 2.4, đồng hồ hệ thống chạy ở tần số 100 Hz, cho phép độ trễ tăng dần 10 ms. Trên 2.6, giá trị là tham số cấu hình từ 1000 đến 100 Hz.
Các ví dụ sau chỉ thay đổi tham số mà không tải lại qdisc
Các mạng diện rộng thực cho thấy sự biến đổi nên có thể thêm biến thể ngẫu nhiên.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
Điều này gây ra độ trễ thêm vào là 100 ± 10 ms. Biến thể độ trễ mạng không hoàn toàn ngẫu nhiên, do đó, để mô phỏng rằng cũng có một giá trị tương quan.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Điều này gây ra độ trễ thêm vào là 100 ± 10 ms với phần tử ngẫu nhiên tiếp theo phụ thuộc 25% vào phần tử cuối cùng. Đây không phải là mối tương quan thống kê thực sự, nhưng là một xấp xỉ.
Phân phối chậm trễ
Thông thường, độ trễ trong mạng không đồng nhất. Nó là phổ biến hơn để sử dụng một cái gì đó giống như một phân phối bình thường để mô tả sự thay đổi trong độ trễ. Kỷ luật netem có thể lấy một bảng để chỉ định phân phối không đồng nhất.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Các bảng thực tế (bình thường, pareto, paretonatural) được tạo như một phần của quá trình biên dịch iproute2 và được đặt trong / usr / lib / tc; do đó, có thể với một số nỗ lực để thực hiện phân phối của riêng bạn dựa trên dữ liệu thử nghiệm.
Mất gói
Mất gói ngẫu nhiên được chỉ định trong lệnh 'tc' tính bằng phần trăm. Giá trị khác không nhỏ nhất có thể là:
2 −32 = 0,0000000,02%
# tc qdisc change dev eth0 root netem loss 0.1%
Điều này làm cho 1/10 của một phần trăm (tức là 1 trên 1000) các gói bị loại bỏ ngẫu nhiên.
Một mối tương quan tùy chọn cũng có thể được thêm vào. Điều này làm cho trình tạo số ngẫu nhiên ít ngẫu nhiên hơn và có thể được sử dụng để mô phỏng tổn thất nổ gói.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Điều này sẽ khiến 0,3% gói bị mất và mỗi xác suất liên tiếp phụ thuộc vào một phần tư vào lần cuối cùng.
Prob n = 0,25 × Prob n-1 + 0,75 × Ngẫu nhiên
Lưu ý rằng bạn nên sử dụng tc qdisc add
nếu bạn không có quy tắc nào cho giao diện đó hoặc tc qdisc change
nếu bạn đã có quy tắc cho giao diện đó. Cố gắng sử dụng tc qdisc change
trên một giao diện không có quy tắc sẽ đưa ra lỗi RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
sẽ liệt kê các quy tắc được xác định hiện tại và tc qdisc del dev eth0 root
sẽ xóa chúng
Đối với các gói bị rơi, tôi chỉ cần sử dụng iptables và mô-đun thống kê .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Ở trên sẽ thả một gói đến với xác suất 1%. Hãy cẩn thận, bất cứ điều gì ở trên khoảng 0,14 và hầu hết các kết nối tcp của bạn rất có thể sẽ bị đình trệ hoàn toàn.
Hãy xem man iptables và tìm kiếm "thống kê" để biết thêm thông tin.
DROP
trên các kết nối ra ngoài khá vô lý khiến các send()
hoạt động trở lại EPERM
, thay vào đó chỉ là bỏ các gói (như nó nên).
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Một trong những đồng nghiệp của tôi sử dụng tc để làm điều này. Tham khảo trang người đàn ông để biết thêm thông tin. Bạn có thể xem một ví dụ về việc sử dụng nó ở đây .
Hướng dẫn này về mô phỏng vật lý mạng chứa một lớp C ++ trong mã mẫu để mô phỏng độ trễ và mất gói trong kết nối UDP và có thể là hướng dẫn. Xem các biến độ trễ công khai và góiLoss của lớp Kết nối được tìm thấy trong tệp Connection.h của mã nguồn có thể tải xuống .
Tôi đã không tự mình thử, nhưng trang này có một danh sách các mô-đun plugin chạy trong hệ thống lọc IP iptables tích hợp trong Linux. Một trong các mô-đun được gọi là "nth" và cho phép bạn thiết lập quy tắc sẽ giảm tốc độ cấu hình của các gói. Có thể là một nơi tốt để bắt đầu, ít nhất.
Bạn có thể thử http://snad.ncsl.nist.gov/nistnet/ Dự án NIST khá cũ (phát hành lần cuối năm 2005), nhưng nó hoạt động với tôi.
Một công cụ tiêm lỗi mạng dễ sử dụng là Saboteur . Nó có thể mô phỏng:
- Tổng phân vùng mạng
- Dịch vụ từ xa đã chết (không nghe trên cổng dự kiến)
- Sự chậm trễ
- Mất gói-hết thời gian kết nốiTCP (thường xảy ra khi hai hệ thống được phân tách bằng tường lửa trạng thái)
Một trong những công cụ được sử dụng nhiều nhất trong cộng đồng khoa học cho mục đích đó là DummyNet . Khi bạn đã cài đặt ipfw
mô-đun hạt nhân, để giới thiệu độ trễ lan truyền 50ms giữa 2 máy chỉ cần chạy các lệnh sau:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Để giới thiệu 50% tổn thất gói bạn phải chạy:
./ipfw pipe 1 config plr 0.5
Ở đây chi tiết hơn.