Trickle - контроль пропускной способности сетевого трафика в Linux

Если вы когда-нибудь оказывались в ситуации, когда одно приложение съедало весь ваш трафик, то вы оцените роль приложения Trickle Bandwidth Shaper.

Независимо от того, являетесь ли вы системным администратором или просто пользователем Linux, вам необходимо научиться контролировать скорость загрузки и выгрузки приложений, чтобы убедиться, что пропускная способность вашей сети не забита одним приложением.

Что такое Trickle?

Trickle – это инструмент для формирования пропускной способности сети, который позволяет нам управлять входящей и исходящей скоростью приложений, чтобы не дать ни одному из них отнять всю (или большую часть) доступной пропускной способности.

В нескольких словах, trickle позволяет контролировать скорость сетевого трафика на основе каждого приложения, который является классическим примером формирования полосы пропускания в клиент-серверной среде.

Как работает Trickle?

Кроме того, trickle может помочь нам определить приоритеты приложений, так как общие лимиты установлены для всей системы, приоритетные приложения все равно получат больше пропускной способности автоматически.

Для выполнения этой задачи trickle устанавливает ограничения на трафик, по которому данные отправляются в сокеты и принимаются из них, используя TCP-соединения. Следует отметить, что, кроме скорости передачи данных, trickle никак не изменяет поведение процесса, который он формирует в каждый конкретный момент.

Чего не может Trickle?

Единственное ограничение заключается в том, что trickle не будет работать со статически связанными приложениями или двоичными файлами с установленными битами SUID или SGID, поскольку он использует динамическое связывание и загрузку, чтобы поместить себя между сформированным процессом и связанным с ним сетевым сокетом. Затем Trickle действует как прокси между этими двумя программными компонентами.

Поскольку для работы trickle не требуются привилегии суперпользователя, пользователи могут устанавливать свои собственные ограничения на трафик. Поскольку это может быть нежелательно, мы рассмотрим, как установить общие ограничения, которые пользователи системы не смогут превысить. Другими словами, пользователи по-прежнему смогут управлять скоростью трафика, но всегда в пределах, установленных системным администратором.

Тестовая среда

В этой статье мы расскажем, как ограничить пропускную способность сети, используемую приложениями на сервере Linux с помощью trickle.

Для генерации необходимого трафика мы будем использовать ncftpput и ncftpget (оба инструмента доступны при установке ncftp) на клиенте (сервер CentOS – dev1: 192.168.0.17), и vsftpd на сервере (Debian – dev2: 192.168.0.15) для демонстрационных целей.

Эти же инструкции работают и на дистрибутивах на базе RHEL и Debian, таких как Ubuntu и Linux Mint.

Как установить ncftp и vsftpd в Linux

  1. Для дистрибутивов на базе RedHat необходимо включить репозиторий EPEL, который является репозиторием свободного программного обеспечения с открытым исходным кодом, поддерживаемого проектом Fedora.
    1. Установите EPEL на RHEL 9:
      sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
      sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
    2. Установите EPEL на CentOS 9, AlmaLinux 9, Rocky Linux 9:
      sudo dnf config-manager --set-enabled crb
      sudo dnf install epel-release
    3. Установите EPEL на RHEL 8:
      sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms
      sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
    4. Установите EPEL на CentOS 8, AlmaLinux 8, Rocky Linux 8:
      sudo dnf config-manager --set-enabled powertools
      sudo dnf install epel-release
  2. Далее, установите ncftp следующим образом.
    sudo dnf install ncftp         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
    sudo apt install ncftp         [On Debian, Ubuntu and Mint]
  3. Настройте FTP-сервер на отдельном сервере. Обратите внимание, что хотя FTP по своей сути небезопасен, он по-прежнему широко используется в случаях, когда безопасность загрузки или скачивания файлов не требуется.
    Мы используем его в этой статье для иллюстрации преимуществ trickle и потому, что он показывает скорость передачи данных в stdout на клиенте.
    sudo dnf install vsftpd         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
    sudo apt install vsftpd         [On Debian, Ubuntu and Mint]

    Теперь отредактируйте файл /etc/vsftpd/vsftpd.conf на FTP-сервере следующим образом:
    sudo nano /etc/vsftpd/vsftpd.conf
    OR
    sudo nano /etc/vsftpd.conf

    Внесите следующие изменения:
    anonymous_enable=NO
    local_enable=YES
    chroot_local_user=YES
    allow_writeable_chroot=YES

    После этого обязательно запустите vsftpd для текущей сессии и включите его для автоматического запуска при последующих загрузках:
    sudo systemctl start vsftpd
    sudo systemctl enable vsftpd
    sudo systemctl status vsftpd
  4. Если вы решите установить FTP-сервер в CentOS/RHEL дроплет с SSH-ключами для удаленного доступа, вам понадобится защищенная паролем учетная запись пользователя с соответствующими правами на каталоги и файлы для загрузки и скачивания нужного содержимого за пределами домашнего каталога root.
    Затем вы можете перейти в свой домашний каталог, введя в браузере следующий URL. Появится окно входа, в котором вам будет предложено ввести действительную учетную запись пользователя и пароль на FTP-сервере.
    ftp://192.168.0.15

    Если аутентификация прошла успешно, вы увидите содержимое вашей домашней директории. Позже в этом руководстве вы сможете обновить эту страницу, чтобы отобразить файлы, которые были загружены во время предыдущих шагов.

Как установить Trickle в Linux

Теперь установите trickle с помощью yum или apt.

Для успешной установки считается хорошей практикой убедиться в актуальности установленных пакетов (с помощью yum update) перед установкой самого инструмента.

sudo yum -y update && sudo yum  install trickle  [On RedHat based systems]
sudo apt -y update && sudo apt install trickle 	 [On Debian based systems]

Проверьте, будет ли trickle работать с нужным бинарником. Как мы уже объясняли ранее, trickle будет работать только с двоичными файлами, использующими динамические или разделяемые библиотеки.

Чтобы проверить, можно ли использовать этот инструмент с определенным приложением, мы можем воспользоваться известной утилитой ldd, где ldd означает list dynamic dependencies.

В частности, мы будем искать присутствие glibc (библиотека GNU C) в списке динамических зависимостей любой программы, поскольку именно эта библиотека определяет системные вызовы, участвующие в общении через сокеты.

Выполните следующую команду для данного двоичного файла, чтобы проверить, можно ли использовать trickle для формирования его пропускной способности:

sudo ldd $(which [binary]) | grep libc.so

Например,

sudo ldd $(which ncftp) | grep libc.so

и в результате получите:

sudo libc.so.6 =>/lib64/libc.so.6 (0x00007efff2e6c000)

Строка между скобками в выводе может меняться от системы к системе и даже между последующими запусками одной и той же команды, поскольку она представляет собой адрес загрузки библиотеки в физической памяти.

Если приведенная выше команда не дает никаких результатов, это означает, что двоичный файл, с которым она была запущена, не использует libc, и поэтому trickle не может быть использован в качестве формирователя полосы пропускания в этом случае.

Узнайте, как использовать Trickle в Linux

Самое основное использование trickle – это автономный режим. При таком подходе trickle используется для явного определения скоростей download и upload данного приложения. Как мы уже объясняли ранее, для краткости мы будем использовать одно и то же приложение для тестов скорости.

Запуск Trickle в автономном режиме

Мы сравним скорости download и upload с использованием и без использования trickle. Опция -d указывает скорость загрузки в КБ/с, а флаг -u указывает trickle на ограничение скорости загрузки в тех же единицах. Кроме того, мы будем использовать флаг -s, который указывает, что trickle должен работать в автономном режиме.

Основной синтаксис для запуска trickle в автономном режиме следующий:

sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]

Чтобы выполнить следующие примеры самостоятельно, убедитесь, что на клиентской машине (192.168.0.17 в моем случае) установлены trickle и ncftp.

Пример 1: Загрузка файла размером 2,8 МБ с использованием Trickle и без него

Для следующих тестов мы используем свободно распространяемый PDF-файл Linux Fundamentals (доступен по адресу
здесь).

Изначально вы можете загрузить этот файл в текущий рабочий каталог с помощью следующей команды wget:

wget http://linux-training.be/files/books/LinuxFun.pdf

Синтаксис загрузки файла на наш FTP-сервер без trickle следующий:

sudo ncftpput -u username -p password 192.168.0.15  /remote_directory local-filename

Где /remote_directory – путь к каталогу загрузки относительно домашнего каталога имени пользователя, а local-filename – файл в вашем текущем рабочем каталоге.

В частности, без trickle мы получим пиковую скорость загрузки 52,02 МБ/с (обратите внимание, что это не реальная средняя скорость загрузки, а мгновенный начальный пик), и файл будет загружен практически мгновенно:

sudo ncftpput -u username -p password 192.168.0.15  /testdir LinuxFun.pdf

Вывод:

LinuxFun.pdf:                                        	2.79 MB   52.02 MB/s

При использовании trickle мы ограничим скорость передачи данных до 5 КБ/с. Перед тем как загрузить файл во второй раз, нам нужно удалить его из каталога назначения.

В противном случае ncftp сообщит нам, что в каталоге назначения находится тот же файл, который мы пытаемся загрузить, и не будет выполнять передачу:

rm /absolute/path/to/destination/directory/LinuxFun.pdf

Тогда:

trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf

Выход:

LinuxFun.pdf:                                        	2.79 MB	4.94 kB/s

В приведенном примере мы видим, что средняя скорость загрузки упала до 5 КБ/с.

Пример 2: Загрузка одного и того же файла размером 2,8 МБ с помощью и без Trickle

Сначала не забудьте удалить PDF из исходного каталога:

rm /absolute/path/to/source/directory/LinuxFun.pdf

Обратите внимание, что в следующих случаях удаленный файл будет загружен в текущий каталог на клиентской машине. На этот факт указывает точка, которая появляется после IP-адреса FTP-сервера.

ncftpget -u username -p  password 111.111.111.111 . /testdir/LinuxFun.pdf

Выход:

LinuxFun.pdf:                                        	2.79 MB  260.53 MB/s

Ограничивая скорость загрузки на уровне 20 КБ/с:

trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf

Выход:

LinuxFun.pdf:                                        	2.79 MB   17.76 kB/s

Запуск Trickle в контролируемом неуправляемом режиме

Trickle может работать и в неуправляемом режиме, следуя ряду параметров, определенных в /etc/trickled.conf. Этот файл определяет, как trickled (демон) ведет себя и управляет trickle.

Кроме того, если мы хотим задать глобальные настройки, которые будут использоваться всеми приложениями, нам нужно будет использовать команду trickled. Эта команда запускает демона и позволяет нам определить лимиты download и upload, которые будут использоваться всеми приложениями, запущенными через trickle, без необходимости каждый раз указывать лимиты.

Например, выполнив:

trickled -d 50 -u 10

Это приведет к тому, что входящая и исходящая скорости любого приложения, запущенного через trickle, будет ограничена до 30 КБ/с и 10 КБ/с, соответственно.

Обратите внимание, что вы можете в любой момент проверить, запущен ли trickled и с какими аргументами:

ps -ef | grep trickled | grep -v grep

Вывод:

root 	16475 	1  0 Dec24 ?    	00:00:04 trickled -d 50 -u 10

Пример 3: Загрузка файла MP4 размером 19 МБ на FTP-сервер с помощью Trickle

Изначально мы загрузим этот файл в текущий рабочий каталог с помощью следующей команды:

wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4

Сначала мы запустим демон trickled с помощью команды, указанной выше:

trickled -d 30 -u 10

Без trickle:

ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4

Выход:

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   36.31 MB/s

С trickle:

trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4

Выход:

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB	9.51 kB/s

Как видно из приведенного выше результата, скорость передачи данных упала до 10 КБ/с.

Пример 4: Загрузка того же видео с помощью Trickle

Как и в Примере 2, мы будем загружать файл в текущий рабочий каталог.

Без trickle:

ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4

Вывод:

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB  108.34 MB/s

С trickle:

trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4

Вывод:

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   29.28 kB/s

Что соответствует установленному ранее лимиту загрузки (30 КБ/с).

Примечание: После запуска демона нет необходимости устанавливать индивидуальные лимиты для каждого приложения, использующего trickle.

Как мы уже упоминали, можно дополнительно настроить формирование пропускной способности trickle с помощью файла trickled.conf. Типичный раздел этого файла состоит из следующих строк:

[service]
Priority =<value>
Time-Smoothing =<value>
Length-Smoothing =<value>

Где,

  • [service] указывает имя приложения, использование полосы пропускания которого мы собираемся регулировать.
  • Priority позволяет нам указать службу, имеющую более высокий приоритет по отношению к другим, таким образом не позволяя одному приложению забирать всю полосу пропускания, которой управляет демон. Чем меньше число, тем больше пропускная способность, выделенная для [сервиса].
  • Time-Smoothing [в секундах]: определяет, через какие промежутки времени trickled будет пытаться позволить приложению передавать и получать данные. Меньшие значения (что-то между диапазоном 0,1 – 1 с) идеально подходят для интерактивных приложений и приведут к более непрерывной (плавной) сессии, в то время как немного большие значения (1 – 10 с) лучше подходят для приложений, которым требуется массовая передача данных. Если значение не указано, используется значение по умолчанию (5 с).
  • Сглаживание по длине [в КБ]: идея та же, что и в сглаживании по времени, но основана на длине операции ввода-вывода. Если значение не указано, используется значение по умолчанию (10 КБ).

Изменение значений сглаживания приведет к тому, что приложение, указанное [service], будет использовать скорость передачи данных в пределах интервала, а не фиксированное значение. К сожалению, не существует формулы для расчета нижней и верхней границ этого интервала, так как это в основном зависит от каждого конкретного сценария.

Следующий пример файла trickled.conf в клиенте CentOS 7 (192.168.0.17):

[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2
[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3

Используя эту настройку, trickled будет отдавать предпочтение SSH-соединениям перед FTP-передачами. Обратите внимание, что интерактивный процесс, такой как SSH, использует меньшие значения сглаживания времени, в то время как служба, выполняющая массовую передачу данных (FTP), использует большее значение.

Значения сглаживания отвечают за то, что входящая и исходящая скорости в нашем предыдущем примере не соответствуют точному значению, указанному демоном trickled, а перемещаются в интервале, близком к нему.

Заключение

В этой статье мы рассмотрели, как ограничить полосу пропускания, используемую приложениями с помощью trickle в дистрибутивах на базе Fedora и Debian. Другие возможные варианты использования включают, но не ограничиваются ими:

  • Ограничение скорости загрузки с помощью системной утилиты, такой как wget, или, например, торрент-клиента.
  • Ограничение скорости обновления вашей системы с помощью yum (или aptitude, если вы работаете с системой на базе Debian), системы управления пакетами.
  • Если ваш сервер находится за прокси или брандмауэром (или сам является прокси или брандмауэром), вы можете использовать trickle для установки ограничений на скорость загрузки и выгрузки или связи с клиентами или извне.
Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен www.tecmint.com

Похожие статьи

Комментарии (0)