Mô phỏng các gói bị trì hoãn và bị hủy trên Linux


Câu trả lời:


323

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 addnếu bạn không có quy tắc nào cho giao diện đó hoặc tc qdisc changenếu bạn đã có quy tắc cho giao diện đó. Cố gắng sử dụng tc qdisc changetrên một giao diện không có quy tắc sẽ đưa ra lỗi RTNETLINK answers: No such file or directory.


2
Trang web gốc có lỗi đó, tôi chỉ sao chép văn bản đó trực tiếp. Nhưng vâng, 2 ^ (- 32) = 2.33e-10
ephemient

34
Lưu ý rằng tc -p qdisc ls dev eth0sẽ liệt kê các quy tắc được xác định hiện tại và tc qdisc del dev eth0 rootsẽ xóa chúng
Quamis

1
nâng cấp để chỉ ra lỗi khi cố gắng thay đổi mục không tồn tại
Neo

Bạn có biết tại sao tôi nhận được những lỗi này? ubfox @ anmol-vm1-new: / home / hadoop / Yarnpp / workloads / KẾT QUẢ $ sudo tc qdisc / KẾT QUẢ $ sudo tc qdisc thay đổi dev eth0 root netem delay 100ms RTNETLINK câu trả lời: Đối số không hợp lệ serverfault.com/questions/743885/
Mona Jalal

Có lẽ nên bao gồm các chi tiết về cách giới hạn toàn bộ thông lượng giao diện để mô phỏng các liên kết tốc độ thấp
Pavel P

91

Đố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.


6
Tại sao các kết nối TCP bị đình trệ ở mức trên 14%?
David Wolever

2
@DavidWolever: Vì cách điều chỉnh kích thước cửa sổ trượt tcp. Nhưng 14% hoàn toàn là từ kinh nghiệm, hãy tự mình thử và bạn sẽ thấy rằng ssh trở nên không sử dụng được ở mức 14% trở lên, nhưng thực sự hoạt động khá tốt ở mức độ giảm gói tin thấp hơn.
Bjarke Freund-Hansen

12
Để an toàn, có lẽ tốt nhất là giới hạn quy tắc chỉ áp dụng cho (các) cổng mà bạn muốn kiểm tra: iptables -A INPUT - thống kê FOO -m .... Bằng cách này, ssh của bạn và các kết nối khác sẽ vẫn không bị biến đổi và bạn có thể tăng tỷ lệ rơi cho dịch vụ quan tâm để có thể tái tạo bất kỳ vấn đề nào với nó nhanh hơn.
Mikhail T.

5
Lưu ý rằng DROPtrê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).
Tên giả

2
Đây có phải là tất cả những gì cần thiết để hoàn tác lệnh đó? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314

6

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 .


Tôi nghĩ là dễ sử dụng iptables hơn :)
c4f4t0r

chắc chắn, nhưng tc nhanh hơn nhiều so với iptables
teknoraver

5

iptables (8) có một mô-đun khớp thống kê có thể được sử dụng để khớp với mọi gói thứ n. Để bỏ gói này, chỉ cần thêm -j DROP .



1

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.



1

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)

1
Đáng buồn thay, cam kết cuối cùng cho dự án đó là vào ngày 28 tháng 8 năm 2015, tức là gần 4 năm trước. Các vấn đề mở bây giờ là 5 tuổi.
Ali

1

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 ipfwmô-đ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.