Инструменты пользователя

Инструменты сайта


net:channel_performance_measuring

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
net:channel_performance_measuring [2022/03/01 09:35] – [Эксперимент №5 - делаем программу отправки трафика напрямую в сетевой интерфейс] sannet:channel_performance_measuring [2022/03/01 12:15] (текущий) – [Эксперимент №5 - делаем программу отправки трафика напрямую в сетевой интерфейс] san
Строка 1: Строка 1:
 ====== Измерение пропускной способности канала: флудим по полной ====== ====== Измерение пропускной способности канала: флудим по полной ======
  
-**Дано:** есть арендованный оптический канал со скоростью 2 гигабита по договору. С одной стороны этот канал можно воткнуть в сервер, другая сторона находится далеко и разместить там измерительное оборудование не представляется возможным. С удаленной стороны канал подключен к коммутатору с которого можно снять значения приходящего из канала трафика.+**Дано:** есть арендованный оптический канал со скоростью 2 гигабита по договору. С одной стороны этот канал можно воткнуть в сервер в котором есть 10G оптическая сетевуха, другая сторона находится далеко и разместить там измерительное оборудование не представляется возможным. С удаленной стороны канал подключен к коммутатору с которого можно снять значения приходящего из канала трафика.
  
 **Требуется:** проверить что обещанные 2 гигабита предоставляются арендованным каналом. **Требуется:** проверить что обещанные 2 гигабита предоставляются арендованным каналом.
Строка 22: Строка 22:
 <file bash> <file bash>
 bmon -p eth1 -o curses:ngraph=2,curses:details,curses:info bmon -p eth1 -o curses:ngraph=2,curses:details,curses:info
 +</file>
 +
 +<file console>
 + eth1                                                                                                                                                                                                      bmon 4.0 
 +Interfaces                     │ RX bps       pps     %│ TX bps       pps     %
 + >eth1                         │      0              │   1.03GiB 733.75K
 +───────────────────────────────┴───────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 +                            (RX Bytes/second)                                                                MiB                      (TX Bytes/second)
 +  133.00 ..................|.........................................                                      1090.03 |||||||||||||||||||||.......................................
 +  110.83 ..................|.........................................                                       908.36 |||||||||||||||||||||.......................................
 +   88.67 ..................|.........................................                                       726.68 |||||||||||||||||||||.......................................
 +   66.50 ..................|.........................................                                       545.01 ||||||||||||||||||||||......................................
 +   44.33 ..................|.........................................                                       363.34 ||||||||||||||||||||||......................................
 +   22.17 ..................|.........................................                                       181.67 ||||||||||||||||||||||......................................
 +             10   15   20   25   30   35   40   45   50   55   60                                              1     10   15   20   25   30   35   40   45   50   55   60
 +                             (RX Packets/second)                                                                                     (TX Packets/second)
 +    1.00 ..................|.........................................                                       761.92 |||||||||||||||||||||.......................................
 +    0.83 ..................|.........................................                                       634.93 |||||||||||||||||||||.......................................
 +    0.67 ..................|.........................................                                       507.94 |||||||||||||||||||||.......................................
 +    0.50 ..................|.........................................                                       380.96 ||||||||||||||||||||||......................................
 +    0.33 ..................|.........................................                                       253.97 ||||||||||||||||||||||......................................
 +    0.17 ..................|.........................................                                       126.99 ||||||||||||||||||||||......................................
 +             10   15   20   25   30   35   40   45   50   55   60                                              1     10   15   20   25   30   35   40   45   50   55   60
 </file> </file>
  
Строка 294: Строка 317:
  struct ifreq if_idx;  struct ifreq if_idx;
  struct ifreq if_mac;  struct ifreq if_mac;
- int tx_len = 0; 
  struct ether_header *eh = (struct ether_header *) sendbuf;  struct ether_header *eh = (struct ether_header *) sendbuf;
  struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header));  struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header));
Строка 336: Строка 358:
  /* Ethertype field */  /* Ethertype field */
  eh->ether_type = htons(ETH_P_IP);  eh->ether_type = htons(ETH_P_IP);
- tx_len += sizeof(struct ether_header); 
  
  /* IP Header */  /* IP Header */
Строка 352: Строка 373:
  /* Destination IP address */  /* Destination IP address */
  iph->daddr = inet_addr(server);  iph->daddr = inet_addr(server);
- tx_len += sizeof(struct iphdr); 
  
  udph->source=htons(55555);  udph->source=htons(55555);
Строка 358: Строка 378:
 // udph->len // udph->len
 // udph->check // udph->check
- tx_len += sizeof(struct udphdr); 
  
  /* Packet data */  /* Packet data */
Строка 404: Строка 423:
 #!/bin/bash #!/bin/bash
  
-threads=32+threads=32 # будем запускать в 32 потока
 cmd="udprawsender" cmd="udprawsender"
 param="-d 192.168.10.25 -p 5555 -s 1500 -i eth1" param="-d 192.168.10.25 -p 5555 -s 1500 -i eth1"
Строка 422: Строка 441:
 После запуска всех потоков флудилки скрипт ожидает нажатия Enter, после которого завершает запущенные потоки. Поэтому скрипт не рекомендуется прерывать по Ctrl+C, если так сделать, то запущенная в много потоков флудилка не будет завершена и останется флудить после прерывания скрипта. После запуска всех потоков флудилки скрипт ожидает нажатия Enter, после которого завершает запущенные потоки. Поэтому скрипт не рекомендуется прерывать по Ctrl+C, если так сделать, то запущенная в много потоков флудилка не будет завершена и останется флудить после прерывания скрипта.
 Если скрипт был неправильно завершен, то придется прибивать запущенные флудилки с помощью "killall -9". Если скрипт был неправильно завершен, то придется прибивать запущенные флудилки с помощью "killall -9".
 +
 +Число потоков флудилки 32 было подобрано опытным путем. Начиная с 8 увеличивал, пока результаты не перестали заметно увеличиваться.
  
 Результаты: 1.07GiB 766.91K  Результаты: 1.07GiB 766.91K 
 О! 1,07×8=8,56 гигабит в секунду, 766К пакетов в секунду. Пока что это максимум чего удалось достигнуть. О! 1,07×8=8,56 гигабит в секунду, 766К пакетов в секунду. Пока что это максимум чего удалось достигнуть.
  
 +Я пробовал запускать udpsender в много потоков. Результаты получались почти такие же как у отправлялки сырых пакетов, однако udpsender при этом заметно сильнее нагружает систему. Load Average подскакивает очень заметно пропорционально числу потоков флудилки.
 +
 +===== Послесловие =====
 +
 +При выполнении задачи описанной в статье важно озаботиться тюнингом сетевой карты. Как минимум увеличить размер очереди отправки:
 +<file bash>
 +ip link set dev eth1 txqueuelen 10000
 +</file>
 +Если на сетевой карте выставить MTU в 9000, то можно увеличить загрузку однопоточным зафлуживанием канала. В многопоточном варианте все-равно все упирается в потолок 1.08GiB/s, но зато можно снизить число запускаемых потоков для достижения этого "потолка".
 +
 +Результатов превышающих абсолютно все описанные удалось добиться при использовании udpblast в многопоточном режиме **1.16GiB 150.92K** **1,16*8=9,28 гигабит в секунду**, что близко к максимальной полосе испытываемого 10гигабитного интерфейса, однако все остальные эксперименты были тоже интересны.
 +
 +Вот скрипт многопоточного флуда с помощью tcpblast
 +<file bash netflood-max.sh>
 +#!/bin/bash
 +
 +threads=32
 +buflen=65535
 +pkt="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $buflen| head -n 1)"
 +
 +for i in $(seq 1 $threads)
 +do
 + (echo "$pkt" |udpblast -4q -s 32kb -c1m 192.168.10.25:5555) &
 + echo "Run thread $i"
 + sleep 0.1
 +done
 +read -p "Flood Started! Press enter to terminate flood"
 +killall -9 udpblast
 +</file>
 +
 +
 +{{tag>linux shell Си network}}
net/channel_performance_measuring.1646116512.txt.gz · Последнее изменение: 2022/03/01 09:35 — san

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki