Trickle: легковесный ограничитель скорости интернет канала (shaper).

Проект "Пакет дня" нуждается в помощи переводчиков. Если Вы можете помочь с переводом статей, пожалуйста, присоединяйтесь!

Оригинальная статья: Ferry Boender.
Перевод: Азовцев Юрий
Иногда вам нужно что то скачать из сети, но при этом вы не хотите полностью занимать Internet канал. Возможно вы уже загружаете что то очень важное, или вашим каналом пользуется несколько человек и вы не хотите вести себя эгоистично.
Некоторые приложения, например gFTP, wget и bittorrent предлагают встроенные инструменты ограничения скорости входящего/исходящего потока. Но, например, apt-get не имеет таких возможностей.

Trickle - это "шейпер" для интернет канала, работающий как пользовательский процесс. Он позволяет ограничить скорость доступа прикладных программ к Интернет каналу без необходимости накладывания патчей на ядро, каких либо настроек firewall'a либо прав супер-пользователся (aka root) в системе. Trickle может быть запущен в режиме взаимодействия и как отдельный сервис. В режиме сервиса trickle лимитирует скорость использования канала большим количеством пользовательских приложений. В режиме одиночного приложения trickle будет уменьшать скорость доступа к каналу для приложения, которое вы ему явно укажете.

Режим приложения

Это наиболее простой способ использования trickle. Запустите trickle с параметрами пропускной способности канала и названием программы, которую вы хотите ограничить.

[todsah@jib]~$ trickle -d 20 -u 20 wget http://www.electricmonk.nl/bigfile
trickle: Could not reach trickled, working independently: No such file or directory
–12:19:18–  http://www.electricmonk.nl/bigfile
           => `bigfile’
Resolving www.electricmonk.nl… 194.187.77.6
Connecting to www.electricmonk.nl|194.187.77.6|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 51,200,000 (49M) [text/plain]

 0% [                                     ] 180,224       21.83K/s    ETA 38:03

В примере мы использовали утилиту wget для демонстрации. На самом деле wget имеет собственные опции ограничения использования пропускной способности канала. Как вы можете видеть, скорость загрузки 21.83K/с. Конечно это не идеальные 20 K/s, но скорость будет варьироваться от 19 до 21 K/s давая в среднем наши 20 K/s. Для более тонкой настроки такого поведения программы вы можете использовать опции -w и -t. Для более подробной информации смотрите manual.

Режим сервиса (daemon mode)

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

[todsah@jib]~$ trickled -d 20 -u 20

В системе будет запщен сервис, ограничивающий скорость доступа программ, запущенных через trickle, до 20 K/s (входящую и исходящую скорости) к интернет каналу. При запуске одной программы через trickle ей будет доступен канал в 20 K/s, для двух - по 10 K/s и т.д. Для примера мы можем запустить три сессии wget:

[todsah@jib]~/temp$ trickle wget http://www.electricmonk.nl/bigfile
 1% [                                     ] 933,888        6.66K/s  ETA 1:47:17
[todsah@jib]~/download$ trickle wget http://www.electricmonk.nl/bigfile
 1% [                                     ] 720,896        6.65K/s  ETA 1:56:59
[todsah@jib]~$ trickle wget http://www.electricmonk.nl/bigfile
 2% [                                     ] 1,228,800      6.64K/s  ETA 1:45:00

Скорость загрузка на каждой из сессий будет около 6.6 K/s, создавая в сумме 19.8 K/s. Как и в случае с другими шейперами, может потребоваться несколько секунд для начала ограничения скорости. Это связанно с алгоритмами шейперов, использующихся для определения времени задержки трафика перед передачей или приемом.

Доступность

Trickle доступен в Debian начиная с версии 3.1 (Sarge) и в Ubuntu с Warty. apt-get install trickle должно сработать "без шума и пыли".

Замечания

  • Trickle не работает с setuid программами. Причиной является игнорирование этими программами функции LD_PRELOAD, что сделано в целях безопасности. Trickle требует обязательного использования этой опции для шейпинга. (по той же причине trickle не работает со статически собранными программами).
  • Trickle работает лишь с программами, использующими интерфейс socket(2) для передачи и приема данных. Так же он работает лишь с TCP соединениями, но не с UDP.