Điểm:2

Làm cách nào để mô phỏng những gì xảy ra bên trong bộ đệm gói của một công tắc đơn giản?

lá cờ ro

Tôi đang gỡ lỗi một trường hợp các gói UDP bị mất trong một bộ chuyển mạch gigabit lưu trữ và chuyển tiếp và tôi muốn hình dung điều gì xảy ra bên trong bộ chuyển mạch để hiểu rõ hơn ý chính của vấn đề.

Kịch bản rất đơn giản - hai luồng dữ liệu bùng nổ đi qua 2 cổng bên trong công tắc và cả hai đều muốn rời khỏi cổng đó qua cổng thứ ba (chung cho cả hai). Vì vậy, công tắc cần giữ một số dữ liệu trong bộ đệm gói trong một thời gian.

Vấn đề là: dựa trên các tính toán đơn giản của tôi, bộ đệm phải đủ lớn để xử lý trường hợp tôi đang kiểm tra. Một luồng dữ liệu gửi các đợt 25 kB (được chia thành 1514 gói B) cứ sau 1,56 ms, luồng còn lại gửi các đợt 60 kB cứ sau 1 ms. Giờ đây, ngay cả một công tắc soho như Netgear GS105E cũng có bộ đệm kích thước 128 kB. Vì vậy, phép toán đơn giản (25+60 < 128) cho biết nó sẽ hoạt động ngay cả khi các luồng truy cập cùng một lúc (do không có lưu lượng truy cập đáng kể nào khác).

Các thử nghiệm thực tế cho thấy rằng rất nhiều gói từ cả hai luồng bị mất trên một số thiết bị chuyển mạch (có vẻ như nó bị ràng buộc với kích thước bộ đệm, nhưng không chỉ với nó). Trong mô phỏng của tôi, tôi không thể làm đầy bộ đệm khi được đặt thành 128 kB.

Tôi đã ghi hình ảnh động này cho bộ đệm có kích thước 24 kB trong đó có quá tải. Tuy nhiên, bạn có thể dễ dàng thấy rằng việc tăng bộ đệm chỉ một vài byte sẽ giải quyết được vấn đề và tất cả các gói sẽ đi qua.

Tôi đã thực hiện một số đơn giản hóa trong mô phỏng này. Tất cả các gói có cùng QoS (điều đó cũng đúng trong trường hợp thực tế). Vì vậy, tôi đã loại bỏ hàng đợi QoS khỏi mô phỏng và tôi coi tất cả lưu lượng truy cập đều quan trọng như nhau. Tiếp theo, tôi bỏ qua việc quản lý bộ nhớ đệm. Tôi có thể tưởng tượng nó là một phần quan trọng của vấn đề, nhưng tôi sẽ ngạc nhiên nếu sự đơn giản hóa của tôi với phân bổ hoàn hảo sẽ sai hơn 10% so với trường hợp thực tế. Tôi cũng giả vờ rằng bộ chuyển mạch biết độ dài khung khi nó nhận được byte đầu tiên để nó dự trữ tất cả bộ nhớ cần thiết ngay từ đầu. Vì tôi không thể tìm thấy bất kỳ tài liệu nào về kích thước của hàng đợi vào/ra của các cổng, tôi cho rằng tất cả chúng đều được đặt trong bộ đệm gói dùng chung và chúng có thể chiếm phần lớn bộ đệm khi cần (mặc dù tôi nghĩ thủ phạm có thể là Ở đâu đó).Tôi đã đặt độ trễ xử lý của từng gói thành 512 ns (độ trễ lan truyền của gói 64 B).

Tôi không chắc liệu nó có đóng vai trò gì hay không, nhưng các luồng bao gồm các gói UDP bị phân mảnh (tức là cụm 25 kB là một gói UDP duy nhất được phân đoạn thành 17 đoạn IP). Luồng thứ hai tạo ra cụm dưới dạng 2 hoặc 3 gói UDP 20 kB, mỗi gói được phân đoạn thành 14 đoạn IP.

Các lệnh trong Iperf 3.7 để sao chép luồng tương tự như luồng thực là:

iperf3 -c chìm -u -b 128M -t 600 -l 25256 --pacing-timer 1560
iperf3 -c chìm -u -b 400M -t 600 -l 20k --pacing-timer 1000

Bạn có ý tưởng nào khác mà tôi đã quên tính đến điều gì có thể khiến mô phỏng khác xa với thực tế không? Cảm ơn sự giúp đỡ của bạn!

Mã nguồn cho hình ảnh động là tại https://gist.github.com/peci1/a0346538acc6c289b2c6d596b184ad21 .

mô phỏng luồng dữ liệu qua switch

Đây là bảng kết quả của tôi từ các thí nghiệm thực tế. Luồng dữ liệu một là cố định - 128 Mbps trong các gói UDP 25 kB mỗi gói 1,56 ms. Tôi đang thay đổi các tham số của luồng thứ hai để cố gắng tìm giới hạn mà các gói của luồng đầu tiên sẽ bắt đầu bị mất bởi công tắc. tôi đã thay đổi -l (độ dài) tham số chỉ định kích thước của gói UDP và -b (băng thông) chỉ định băng thông mà các gói này sẽ tạo ra. --pacing-hẹn giờ luôn được đặt thành 1000 cho luồng thứ hai. Bạn có thể thấy rằng D-Link và Netgear GS105 hoàn toàn không thể đối phó với các đợt bùng nổ 60 kB. GS108 làm tốt hơn nhiều so với GS105, trong khi nó có chip switch gần như giống nhau (cùng "họ", chỉ khác số cổng và bộ nhớ đệm lớn hơn một chút).

Công tắc điện Kích thước bộ đệm [kB] Lưu lượng tối đa bùng nổ 1,5kB Lưu lượng truy cập tối đa 20kB bùng nổ Lưu lượng truy cập tối đa 60kB bùng nổ
Gigablox chắc chắn (VSC7512) 220 825 Mb/giây 825 Mb/giây 825 Mb/giây
Gigablox (RTL8367N-VB-CG) 250 730 Mb/giây 750 Mb/giây 790 Mb/giây
D-Link DIS-100G-5W (QCA8337N-AL3C) 128 110 Mb/giây 1 Mb/giây mỗi lần nổ đều mất gói
Zyxel XGS 1210-12 (RTL9302B) 1500 800 Mb/giây 830 Mb/giây 830 Mb/giây
Netgear GS310-TP (RTL8380M) 520 830 Mb/giây 830 Mb/giây 835 Mb/giây
Netgear GS308T (RTL8380M) 520 830 Mb/giây 835 Mb/giây 835 Mb/giây
Netgear GS108 v3 (BCM53118) 192 630 Mb/giây 660 Mb/giây 710Mbps
Netgear GS105E (BCM53114) 128 120 Mb/giây 1 Mb/giây mỗi lần nổ đều mất gói
Renkforce RF-4270245 ? 740 Mb/giây 760Mbps 800 Mb/giây
Mikrotik RB260GS (AR8327) 128 835 Mb/giây 835 Mb/giây 835 Mb/giây
cây bách xù EX2300 4GB? 800 Mb/giây 830 Mb/giây 830 Mb/giây

(Câu hỏi này đã được di chuyển từ https://networkengineering.stackexchange.com/questions/78529/how-to-simulate-what-happens-inside-the-packet-buffer-of-a-simple-switch nơi nó được đánh dấu là lạc đề).

paladin avatar
lá cờ id
Kích thước MTU cho các gói Ethernet là 1500Bytes chứ không phải 1514Byte. Nhìn vào -> https://en.wikipedia.org/wiki/Maximum_transmission_unit#MTUs_for_common_media
paladin avatar
lá cờ id
PS nếu bạn thực sự gửi các gói có kích thước MTU là 1514Byte qua Ethernet, các gói đó sẽ được chia thành 2 gói (1500Bytes + 14Bytes), giúp giảm một nửa bộ đệm của bộ chuyển mạch một cách hiệu quả.
Martin Pecka avatar
lá cờ ro
1514 bao gồm cả chi phí hoạt động. Kích thước gói IP là 1500 byte.
paladin avatar
lá cờ id
Tôi vừa đọc được rằng `iperf` không hoạt động chính xác 100%. Chức năng của nó phụ thuộc vào phần cứng đã sử dụng của bạn. Nếu bạn muốn có kết quả chính xác hơn, hãy sử dụng giá trị `--pacing-timer` nhỏ hơn. Tóm lại, `iperf` không thể đảm bảo đạt được tốc độ bit mong muốn.
Martin Pecka avatar
lá cờ ro
@paladin Cảm ơn bạn đã cung cấp thông tin. Tôi đã xác minh các thuộc tính tốc độ bit và luồng gói ở bên nhận và chúng trông như mong đợi.
Zac67 avatar
lá cờ ru
Tôi có thể tạo nhiều mô hình khác nhau nhưng *bạn không thể sao chép thực sự những gì đang diễn ra bên trong công tắc mà không có thông tin chi tiết* về việc triển khai nó. Các nhà phát triển và nhà cung cấp khác nhau có thể sử dụng các cách tiếp cận rất khác nhau cho vấn đề này. Bộ đệm có thể được phân bổ tĩnh cho các cổng, v.v. Trừ khi bạn rất may mắn, bạn sẽ không bao giờ có thông tin đó. Tương ứng, câu hỏi của bạn chỉ dẫn đến phỏng đoán không có chủ đề ở đây. Nếu công tắc không hoạt động, hãy sử dụng công tắc tốt hơn. Nếu bạn có các yêu cầu *rất* cụ thể, trước tiên hãy liên hệ với nhà cung cấp hoặc đánh giá trong phòng thí nghiệm.
Martin Pecka avatar
lá cờ ro
@ Zac67 Cảm ơn bạn đã có cái nhìn sâu sắc. Đây là điều tôi lo sợ (và tôi hy vọng sẽ có một vài "cách tiếp cận tiêu chuẩn" mà các nhà cung cấp có thể chọn...)."Nếu công tắc không hoạt động, hãy sử dụng công tắc tốt hơn" - đó chính xác là điều tôi muốn, nhưng lý tưởng nhất là tôi muốn có cách đánh giá hành vi trước khi mua công tắc hoặc ít nhất là đoán được hành vi của nó.. .
Zac67 avatar
lá cờ ru
@MartinPecka Đáng buồn thay, bạn sẽ không tìm thấy điều đó bằng cách tạo các mô hình lý thuyết mà chỉ bằng cách hỏi nhà cung cấp về trường hợp sử dụng của bạn hoặc bằng cách thử nghiệm cứng nhắc.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.