вторник, 18 июня 2013 г.

Нагружаем сеть рандомами или нулами.

Пусть есть 2 хоста: client и server . С client хотим на server послать много немыслимых данных и нагрузить сеть.
Пусть client с ip = 192.168.50.100, а server с ip = 192.168.4.5.

Устанавливаем простейшее соединение клиент-сервер с помощью netcat. На сервере начнем слушать с портом соединения 10000 (можно поставить другой, незарерервированный под системные нужды):

Запустим nc на server'e (ip = 192.168.4.5):
nc -l -p 10000

С клиента (ip = 192.168.100.50) устанавливаем соединение с серверной машиной по 10000-му порту:
nc 192.168.4.5 10000

Соединение установлено.

Теперь апгрейд простейшего соединения:
1. Добавим бесконечный цикл с прослушкой на сервере, чтобы при отключении клиента, соединение не прерывалось
2. Все данные, пришедшие с клиента отправляем в /dev/null, чтобы не наблюдать хаос и ужас из рандомов (в случае с нулями нам повезет больше и мы ничего страшного не увидим):
while sleep 1; do nc -l -p 10000 > /dev/null; done

Про хаос и ужас. Увидим мы это:



���dw`���8��, ״r ��9�ŝ_Wv & ��<o��a�\�5�.l�� X.�v� _ s}{b�g�|ކ�n��� ��{ x\΁t12 qk��q��o�} G�)�qv�
                                                                                                      �:� C4�D �� +� s��g}�w" <��e�I;7)=�|�5�
��s��R^��/
          � }"� a� � �.�9yk�C҇V~x��(g�tE�Z� ��"5r�v�rQ�p�v�EYv��bU Q ��gl��nr*;�2�� 1��dtU#�%��y.T"� ���
                                                                                                       ���e~_G% g �ݪY T�l� �"��'| B�M�)P$6! 6��W ���"�֮^���V:
w0rG� �@�-���a!�    y?<��c2 �M!�M5�Z#VD�o-#��z
Cd�Sb� u � �FA_ ��u�s�)�^�v��bO
�i �h? B}�K'
%dl�x���|u�C6`'u=`�UIL,P� d D�e� N�ym�� �^ ?� ] � �Ʌ��C&JUxG}p�xD0��% �q ��Kbgz� �u �u[_q��+E �
                                                                                                      �N
�&� A�*p�Z�GB�D ���es� (j:�r���1���G�C�6�F�K��=5gRDU� �) ��E�f�n�̄8��(l�d6 ��(/�l �u�Q� �(K�9h�u�K� n [��]Z�=JʙcvS�io�OG �Ot�& Z��-W�� ���?d�B7�� yl��q � �/َ=�BD4��� �ۍg�?)z���sC� |�Qfʩ=*D8�H��� f �{$:Kq�H�je��G�Z�R��H�j� 1%Ss�&�2.
LE �gM�
        8[��7n5�\L��z ]�Ng���=� � ��� �j�{x^�E�xF cl��?�f���* �a@&h �9�&�K�!�(�/�5 a =�j� 3�{}��L�=�\�/6 1�(@�dn 8@Nw��'#� ?8x) � X�zh���;0 �w�"[��}���E�)�>�'���[/�*'\� ERY) �M��v0f��m�ˡod��C��� 쿺t��� ���]���|�*@ �Z�Wx� QP��2��:S Eb�j i)F\4.>L@�}*|dγc;F|^E�� �a�Ex$ m]Z�W xJ�� �N^k_N�Ys 9RZ � fGF��A���_l�.e2��6P�\v���B�F�3� � ��u a�� G�D9���!�
V�H9'\�u *�9 �y2=� ��-*��� C h#5ޥ*�7 �d�,p z�pqSe�*Z3�K�3 ` 
�� 1�3�ib<}���s�zu YC s[>n "��^@ k
                                   0�x
j��b֜ ��C0�j ��?�P�5g�Q>�+�Z�%'`#}�X-BO~
�0=���iz
        �7�c [fK� �l�A�B
                         Y� ��NBs��6�;$G�hI�CYuhYF��� ��e>h�cOQ�ql�KD>�� �m��Y 2��5~ �+� A_ � �~� �V�]
                                                                                                            � ̎�|
                                                                                                                ��j�N�/qJ�f�
W"��
ו| w(dZ�� 1 C
w&͹� g.I
           �o��T%�w�t1اy���cDY<D�� fx�9(���C���SF��,���y �����
                                                               �
M�'b �Lei�(�/��_ �J
|�IЖsk�̊Zh � ��u�� 5ٓ h�5$���p���=E3 щj���!��J]�[�P
�=� �g��{.B" b:{8^KL/I~����~`��/su� .�n*~ M�,�W�Y�9v�� �@ 6�N1$F})
                                                    ��� j�Ni���Av��*��Vf���R�_�P�� Ye�Dd�� �2
p���f=�G

И это можно будет остановить убив соединение с сервером. И то, простой Ctrl+C не поможет.


3. Установим pv - утилита для мониторинга соединения. Показывает с какой скоростью, в каком направлении, сколько всего передано данных и сколько по времени продолжался коннект.
sudo apt-get install pv
4. Шлем с клиента на сервер /dev/null или /dev/urandom. Через pipe соединяем 2 команды и получаем:
pv </dev/zero | nc 192.168.4.5 10000 

Наблюдаем за пакетами с сервера (ip=192.168.4.5):
watch cat /proc/net/dev

Внутри будет информация о интерфейсах, кол-ве переданных и принятых байт, пакетов, ошибок, потерянных файлов и т.д. Обновление будет происходить каждые 2 сек.

Если нагрузка идет на Ethernet(eth0), то можно просмотреть проспускную способность и изменить некоторые параметры. 
Рассмотрим подробнее:
1. Смотрим настройки eth0-интерфейса.
sudo ethtool eth0 
Откроются неведомые ранее режимы работы этого интерфейса. Так, например, он может работать в полудуплексном режиме, а не в full-mode. Скорость тоже важный параметр.
Пример моего интерфейса eth0:


Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes:   10baseT/Half 10baseT/Full 
                       100baseT/Half 100baseT/Full 
                       1000baseT/Half 1000baseT/Full 
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes:  10baseT/Half 10baseT/Full 
                       100baseT/Half 100baseT/Full 
                       1000baseT/Half 1000baseT/Full 
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                    100baseT/Half 100baseT/Full 
Link partner advertised pause frame use: Symmetric
Link partner advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000033 (51)
      drv probe ifdown ifup
Link detected: yes

2. С помощью команды:
ethtool -s eth0 autoneg on advertise 0xf
Можно перевести eth0 в полнодуплексный режим и установить скорость 100Мб/с(если она поддерживается физически).

Подробнее о ключах:
-s - изменяет настройки интерфейса
autoneg on - Настраивает режим авто-согласования, если он поддерживается данным устройством. Обычно этот режим включен, но в случае возникновения проблем с некоторыми устройствами, вы можете его отключить. 
advertise N - устанавливает скорсоть и дуплекс при включенном автосогласовании. Аргумент N - hex-число, которое может принимать следующие значения:
0x001 10 Half
0x002 10 Full
0x004 100 Half
0x008 100 Full
0x010 1000 Half(not supported by IEEE standards)
0x020 1000 Full
0x8000 2500 Full(not supported by IEEE standards)
0x1000 10000 Full
0x03F Auto

Подробнее о ethtool тут

И о применении: полезно при тестировании сети, если ваша программа зависит от входного траффика.


6 комментариев:

  1. 'хаос и ужас' понравился. И тут же появился вопрос. В какой кодировке текст выводится на консоль? Unicode она же вряд ли поддерживает?

    ОтветитьУдалить
    Ответы
    1. Это не текст, это рандом. И не важно в какой кодировке) ну а вообще:
      Victoria:Projects vika$ echo 'Привет, Денис'
      Привет, Денис
      Так что поддерживается.

      Удалить
    2. Очевидно, что выведет в той кодировке, которая задана в консоли.
      Можно увидеть в переменной $LANG:
      $ echo $LANG
      ru_RU.UTF-8

      Если хочется вводить текстовые данные на клиенте и выводить на сервере в одной кодировке, то стоит либо задать им одинаковую кодировку, либо использовать что-то типа iconv. А по сети в любом случае передаётся просто набор бит.

      Удалить
  2. ох уж эти виндусятники...

    ОтветитьУдалить
  3. > И это можно будет остановить убив соединение с сервером. И то, простой Ctrl+C не поможет.

    Ctrl+4 помогает?

    ОтветитьУдалить
    Ответы
    1. Не пробовала. Но все равно: мусор в /dev/null лучше отправлять

      Удалить