Вы когда-нибудь сталкивались с ситуацией, когда одна программа захватывала всю вашу полосу пропускания сети? Если вы когда-либо были в ситуации, когда одна программа поглотила все ваше трафик, тогда вы оцените роль приложения 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.
Установите 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
Установите EPEL на CentOS 9, AlmaLinux 9, Rocky Linux 9:
sudo dnf config-manager --set-enabled crb sudo dnf install epel-release
Установите 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
Установите 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 означает список динамических зависимостей.
В частности, мы будем искать наличие 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 используется для явного определения скоростей загрузки и отправки данных заданного приложения. Как мы уже объясняли ранее, ради краткости, мы будем использовать одно и то же приложение для тестов загрузки и отправки данных.
Запуск Trickle в режиме самостоятельного запуска
Мы сравним скорости загрузки и отправки данных с использованием и без использования trickle. Опция -d
указывает скорость загрузки в КБ/с, а флаг -u
говорит trickle ограничить скорость отправки данных в той же единице измерения. Кроме того, мы будем использовать флаг -s
, который указывает, что trickle должен работать в автономном режиме.
Основная синтаксис запуска trickle в автономном режиме следующий:
sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
Чтобы выполнить следующие примеры самостоятельно, убедитесь, что у вас установлены trickle и ncftp на клиентском компьютере (192.168.0.17 в моем случае).
Пример 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-сервера.
Без “trickle”:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
Вывод:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
С “trickle”, ограничивая скорость скачивания на 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. Этот файл определяет, как ведет себя и управляет “trickle”.
Кроме того, если мы хотим установить глобальные настройки, которые будут использоваться всеми приложениями в целом, нам нужно будет использовать команду trickle. Эта команда запускает демон и позволяет нам определять лимиты загрузки и выгрузки, которые будут общими для всех приложений, запущенных через trickle, без необходимости указывать лимиты каждый раз.
Например, запуск:
trickled -d 50 -u 10
Это вызовет ограничение скорости загрузки и выгрузки любого приложения, запущенного через trickle, до 30 KB/s и 10 KB/s, соответственно.
Обратите внимание, что вы можете проверить в любой момент, работает ли trickled и с какими аргументами:
ps -ef | grep trickled | grep -v grep
Вывод:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
Пример 3: Загрузка файла MP4 объемом 19MB на FTP-сервер с использованием Trickle
В этом примере мы будем использовать бесплатно распространяемое видео “He is the gift”, доступное для загрузки по этой ссылке.
Сначала мы загрузим этот файл в текущую рабочую директорию с помощью следующей команды:
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 KB/s.
Пример 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] указывает имя приложения, используемой пропускной способности которого мы намерены формировать.
- Приоритет позволяет нам указать службу с более высоким приоритетом относительно другой, тем самым не позволяя одному приложению захватывать всю пропускную способность, которой управляет демон. Чем ниже число, тем больше пропускной способности назначается [service].
- 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, но находятся в интервале, близком к нему.
[ Вам также может понравиться: Как обезопасить и укрепить сервер OpenSSH ]
Заключение
В этой статье мы рассмотрели, как ограничить пропускную способность, используемую приложениями, с помощью trickle на дистрибутивах на основе Fedora и Debian / производных. Другие возможные варианты использования включают, но не ограничиваются:
- Ограничение скорости загрузки с помощью системного утилиты, такой как wget, или клиента торрента, например.
- Ограничение скорости, с которой ваша система может обновляться через `yum` (или `aptitude`, если вы используете систему на базе Debian), систему управления пакетами.
- Если ваш сервер находится за прокси или брандмауэром (или сам является прокси или брандмауэром), вы можете использовать trickle для установки ограничений как на скорость загрузки и загрузки, так и на скорость связи с клиентами или внешним миром.
Вопросы и комментарии будут приняты с большим удовольствием. Не стесняйтесь использовать форму ниже, чтобы направить их к нам.
Source:
https://www.tecmint.com/limit-linux-network-bandwidth-usage-with-trickle/