imported>Vix |
imported>Supportadmin |
Строка 1: |
Строка 1: |
| Предположим у вас есть домашняя сеть (или не домашняя, а сеть небольшого офиса) с выходом в интернет через не очень скоростной канал.<br>
| | За последние пару лет, а сейчас январь 2018, в JS появилось столько всего нового и это в стольких местах описано. Пора собрать в кучу весь поток сознания. |
| А пользователей — много, и каждый хочет что-то скачивать, да с максимальной скоростью. Вот тут перед нами встатет задача, как максимально эффективно распределить наш интернет-канал между пользователями так, чтобы они не мешали друг другу.<br>
| | ==Объявления переменных let и const == |
| В этой статье я опишу, как можно решить такую задачу с помощью Linux-сервера.
| | [https://learn.javascript.ru/let-const Теория] |
| | [https://jsperf.com/let-vs-var-performance/93 Тесты] |
|
| |
|
| Сформулируем, что же мы хотим получить в результате:<br>
| | Вывод: никакого существенного изменения производительности не несут. Вопрос в обратной совместимости кода. |
| 1. Чтобы канал поровну делился между пользователями.<br>
| |
| 2. Чтобы канал зря не простаивал.<br>
| |
| 3. Чтобы онлайн-игры, ssh и telnet не «лагали» даже при полной загрузке канала, например торрентами.<br>
| |
| | |
| | |
| Если интернетом будут одновременно пользоваться 10 пользователей — каждый получит в свое распоряжение 1/10 часть канала, если в данный момент активен только один пользователь — он будет использовать весь канал сам.<br>
| |
| Добиться этого можно используя планировщик пакетов HTB, который входит в ядро linux начиная с версии 2.4.20.<br>
| |
| <br>
| |
| Можно конфигурировать шейпер с помощью команды tc, но для более удобной и наглядной настройки я рекомендую скачать скрипт [http://www.nixtech.ru/datatrans/linux/shaiper/htb.init-v0.8.5 htb.init.] Они использует для конфигурации htb набор конфигурационных файлов, именуемых так, что при сортировке по алфавиту их имена позволяют визуально представить себе дерево классов шейпера и удобно его редактировать.
| |
| * '''Внимание - в скрипте выставите пути в соответствии с вашими настройками!'''<br>
| |
| Предположим, что у нас на сервере есть интерфейс eth0, через который мы подключены к интернет, и eth1, который «смотрит» в локальную сеть.<br>
| |
| | |
| Управлять можно только исходящим из интерфейса трафиком, поэтому для eth0 будут правила для upload трафика пользователей, а для — eth1 — download трафика.<br>
| |
| | |
| По умолчанию конфигурационные файлы htb.init находятся в /etc/htb/. Для начала напишем правила шейпинга для upload трафика, они у нас будут простые.<br>
| |
| Создаем файл с именем eth0 (интерейс «смотрящий» в интернет), в него напищем следующие строки:<br>
| |
| DEFAULT=20
| |
| R2Q=1
| |
| | |
| Параметр DEFAULT задает номер класса, к которому будет относиться трафик «по умолчанию» — обычно это класс с минимальным приоритетом. Параметр R2Q влияет на работу алгоритма разделения канала и зависит от ширины канала. Я подбирал его значение эмпирическим путем, для моего исходящего канала в 2 Mbit.<br>
| |
| | |
| Далее, создадим файл eth0-2.full2MBit, для класса включающего в себя весь доступный интернет-канал. Имя файла состоит из имени интерфейса и id класса, после точки идет смысловое имя класса, используется как комментарий и системой игнорируется.<br>
| |
| RATE=2Mbit
| |
| CEIL=2Mbit
| |
| | |
| RATE — это наша гарантированная полоса, CEIL — максимальная полоса. Так как у меня канал с гарантированной максимальной полосой в 2 Mbit, то эти параметры у меня равны.<br>
| |
| | |
| Теперь мы создадим по одному файлу для каждого класса трафика, который у нас будет. Я у себя создал отдельные классы для ssh трафика, а так же трафика игр World Of Warcraft и Counter Strike, хотя вы можете сделать для всего высокоприоритетного трафика один класс.<br>
| |
| | |
| Пример для ssh — создаем файл eth0-2:10.ssh. В имени файла через двоеточие указан id родительского класса 2 и id текущего класса — 10. Идентификаторы для класса вы можете выбирать произвольно.<br>
| |
| # class for outgoing ssh
| |
| RATE=128Kbit
| |
| CEIL=2Mbit
| |
| RULE=*:22
| |
| PRIO=1
| |
| BURST=100Kb
| |
| | |
| В параметре RATE указана гарантированная полоса для этого класса, в CEIL — максимальная. Мы выделяем для ssh 128 KBit (как минимум) и разрешаем ему загрузить весь канал (я закачивать файлы по sftp). PRIO задает приоритет класса трафика (1- максимальный, чем больше число — тем меньш приоритет). BURST задает максимальный объем трафика, который будет передан на максимальной скорости перед тем, как перейти к передаче данных из дургих классов. Установив этот параметр в достаточно высокое значение мы добиваемся того, что трафик ssh будет передан с минимальными задержками.
| |
| RULE задает правило, по которому будет отбираться трафик в этот класс.
| |
| Формат — RULE=[[saddr[/prefix]][:port[/mask]],][daddr[/prefix]][:port[/mask]]
| |
| Обратите внимание на запятую! RULE=*:22 обозначает трафик, у которого порт назначения 22, а RULE=*:22, обозначает трафик, у которого исходящий порт — 22.
| |
| | |
| Создадим так же классы для других видов трафика, и класс для трафика «по умолчанию» с id 20 (мы указали вначале что именно в класс номер 20 надо направлять трафик «по умолчанию»). В нем укажем используемую дисциплину разделения канала LEAF=sfq, для того чтобы upload поровну делился между TCP сессиями разных пользователей.
| |
| | |
| Для eth1 правила будут почти такие же, только с учетом что общая ширина канала — 100 Mbit, мы ведь хотим чтобы можно было обращаться к локальным ресурсам сервера на полной скорости, для интернет-трафика выделен отдельный класс на 2 MBit, у которого как потомки добавлены классы отдельных пользователей, разделение по классам я делал по IP адресам. Для каждого пользователя можно указать максимальную и гарантированную скорость, а так же приоритет.
| |
| | |
| После правки конфигурации перезапускаем htb.init:
| |
| /etc/init.d/htb.init restart
| |
| И правила шейпинга трафика сразу же вступают в силу.
| |
| | |
| В процессе состевления правил обычно возникает необходимость как-то визуализировать трафик, в целях отладки и мониторинга, поэтому решил написать плагин для системы мониторинга серверов munin, который бы визуализировал распределение по классам HTB трафика. Выводить решил загрузку только классов-листьев дерева, так как именно они обычно несут смысловую нагрузку.
| |
| Скачать плагин вы можете из официального репозитория плагинов munin, называется он qos_, просто скопируйте его в папку плагинов munin /usr/share/munin/plugins/ и в папке используемых плагинов /etc/munin/plugins сделайте на него символическую ссылку вида qos_eth1, где eth1 — имя интерфейса, на котором нужно мониторить загрузку.<br>
| |
| В файле конфигурации плагинов можно добавить следущее:<br>
| |
| [qos_eth1]
| |
| env.ignore_queue1_10 yes
| |
| env.label_name1_31 Viperet
| |
| env.label_name1_32 Cornet
| |
| | |
| Параметр env.ignore_queue позволяет не отображать на графике состояние класса с указанным id, а параметр env.label_name — задать человекопонятную метку для класса на графике.
| |
| | |
| В итоге должно получиться что то такое:<br>
| |
| /sbin/tc qdisc del dev eth1 root
| |
| /sbin/tc qdisc add dev eth1 root handle 1 htb default 20 r2q 1
| |
|
| |
| /sbin/tc qdisc del dev eth0 root
| |
| /sbin/tc qdisc add dev eth0 root handle 1 htb default 20 r2q 1
| |
|
| |
| /sbin/tc qdisc del dev tun0 root
| |
| /sbin/tc qdisc add dev tun0 root handle 1 htb default 20 r2q 1
| |
|
| |
| /sbin/tc class add dev eth1 parent 1: classid 1:2 htb rate 100Mbit
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:2 classid 1:10 htb rate 100Mbit
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.5 classid 1:10
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.6 classid 1:10
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.9 classid 1:10
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:2 classid 1:20 htb rate 2Mbit ceil 2Mbit
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:20 classid 1:21 htb rate 36Kbit ceil 0.5Mbit burst 100Kb prio 1
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip sport 22 0xffff classid 1:21
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:20 classid 1:30 htb rate 1000Kbit ceil 2000Kbit prio 5
| |
| /sbin/tc qdisc add dev eth1 parent 1:30 handle 30 sfq perturb 10
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:30 classid 1:31 htb rate 100Kbit ceil 0.5Mbit prio 5
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.101 classid 1:31
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.100 classid 1:31
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.99 classid 1:31
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:30 classid 1:52 htb rate 100Kbit ceil 0.5Mbit prio 5
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.22 classid 1:52
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 192.168.0.27 classid 1:52
| |
|
| |
| /sbin/tc class add dev eth1 parent 1:30 classid 1:60 htb rate 100Kbit ceil 1Mbit prio 5
| |
| /sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip dst 192.168.0.0/24 classid 1:60
| |
|
| |
| /sbin/tc class add dev eth0 parent 1: classid 1:2 htb rate 2Mbit ceil 2Mbit
| |
|
| |
| /sbin/tc class add dev eth0 parent 1:2 classid 1:10 htb rate 128Kbit ceil 2Mbit burst 100Kb prio 1
| |
| /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dport 22 0xffff classid 1:10
| |
|
| |
| /sbin/tc class add dev eth0 parent 1:2 classid 1:10 htb rate 512Kbit ceil 1Mbit burst 100Kb prio 1
| |
| /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dport 1194 0xffff classid 1:10
| |
|
| |
| /sbin/tc class add dev eth0 parent 1:2 classid 1:20 htb rate 50Kbit ceil 2Mbit prio 5
| |
| /sbin/tc qdisc add dev eth0 parent 1:20 handle 20 sfq perturb 10
| |
|
| |
| /sbin/tc class add dev tun0 parent 1: classid 1:2 htb rate 0.5Mbit ceil 1Mbit
| |
| | |
| Хочу заметить, что у меня несколько нетипичная ситуация, два интернет канала на 2 и 1 Mbit, и для каждого пользователя ограничение в 2 Mbit скорости загрузки, поэтому на графике видно, что если активен один пользователь — его скорость урезается на 2 Mbit, а если несколько — суммарная скорость может достигать и трех. На таком достаточно «тесном» канале работают более 20 человек, и вполне комфортно себя чувствуют, не мешая друг другу.<br>
| |
| Эта картинка с реально действующего сервера, и она обновляется каждые 5 минут и отображает актуальную картину загрузки канала.
| |
| | |
| [http://www.nixtech.ru/datatrans/linux/shaiper/htb.tar.gz примеры конфигурационных файлов]
| |
| | |
| [http://habrahabr.ru/post/60095/ взято тут...]
| |