ограничение скорости с помощью trickle
Я использую ADSL-подключение (обратный канал 1 Mbps) совместно с несколькими другими пользователями. Время от времени случается, что мы не можем поделить этот канал. Я произвожу несколько больших закачек, обычно это ISO-образы новых релизов Linux и FreeBSD для тестирования в VMWare. Эти закачки имеют тенденцию забивать канал, что не нравится другим пользователям (SSH- и IRC-сессии становятся практически невозможными). Поэтому я начал искать решение для ограничения скорости, чтобы не быть таким надоедливым.
Обычно я выполняю FTP-закачки с помощью клиента, встроенного в Mozilla, но там отсутствует возможность ограничить их скорость. Поэтому я начал искать другой, более подходящий FTP-клиент, имеющий эту возможность. Я остановился на gFTP, но это не решало до конца проблему совместного использования канала: помимо FTP-закачек я использовал SSH, CVS и rsync. Но поскольку не все машины, с которых я получал данные, имели FTP-сервер, я стал искать другой способ ограничить скорость закачки.
В моем случае ограничение скорости на уровне ядра не было возможным. У меня не было исходников модулей ядра для моего модема, а сам модем не обеспечивал возможности ограничения скорости. Более того, я хотел ограничивать скорость не на все время работы в Интернете, а только на время некоторых сессий (когда требуется совместное использование соединения) и иметь возможность делать это в разных ОС (BSD, Linux). Одним словом, я хотел использовать ограничение скорости на всех своих машинах, не прилагая при этом значительных усилий.
Один мой друг говорил мне, что сталкивался с аналогичной проблемой, и подкинул мне URL trickle (программу trickle можно получить по адресу http://monkey.org/~marius/pages/?page=trickle ) – программы, позволяющей выполнять ограничение скорости на уровне пользователя. Он не имел времени оттестировать ее, поэтому за это дело взялся я. Trickle казалась именно тем, что мне было нужно и на что я надеялся. Это была маленькая, легко конфигурируемая программа, которая делала именно то, что я хотел. Что мне понравилось больше всего, так это то, что не было необходимости перекомпилировать все мои приложения для работы с trickle, и я мог использовать ограничение скорости тогда, когда мне это было необходимо.
Вот почему ограничение скорости на уровне пользователя было более подходящим, нежели на уровне ядра: ночью я мог полностью занимать всю линию без ограничений, а днем мог ограничить скорость. Trickle позволяла делать мне все это.
использование Trickle
Пользоваться trickle так же просто, как показано в следующем примере:
$ trickle -s -d 100 ftp
Это все что вам нужно, чтобы установить предел скорости FTP-закачки 100 Кб/сек для одного соединения. Параметр “-s” означает, что программа будет работать отдельно от демона (существует также демон trickled, совместно с которым программа может работать). В данном случае речь идет о работе без демона.Обычно trickle проверяет, запущен ли демон trickled, который может ограничивать скорость сразу для нескольких программ. Также можно задавать такие параметры, как time-smoothing и length-smoothing для отдельных приложений (подробности смотрите в руководстве). Например, вы можете задать разные параметры для SSH и FTP. Когда клиентское приложение (для которого мы вводим ограничение) соединяется с демоном trickled, считываются персональные настройки этого приложения. Но trickle хорошо работает и без демона.
Интегрировать trickle с оконным менеджером очень просто. Например, в GNOME можно модифицировать ярлыки для использования trickle.
как работает trickle?
Так как же trickle работает? Она использует один из очень старых фокусов UNIX – предварительную загрузку (preloading). Это стало возможным со времени изобретения shared libraries. Trickle переопределяет функции, выполняющие чтение и запись в сокеты. Имя функции остается тем же, что и в стандартной библиотеке C, а вот сама функция уже реализована с помощью trickle, и при этом к ней добавлена новая возможность – ограничение скорости чтения и записи этих данных. Когда клиентская программа, загруженная при помощи trickle, вызывает функцию работы с сокетом, на самом деле она использует trickle, а не стандартную функцию из библиотеки C.
предостережения
Несмотря на то, что trickle работает с большинством приложений, все-таки существует ряд исключений. Так как trickle использует предварительную линковку, она не будет работать для статически слинкованных программ. К тому же пользователь может обойти устанавливаемые ограничения с помощью предварительной загрузки других библиотек, аналогично принципу работы trickle. Однако, на мой взгляд, это лишь незначительные неудобства.
Во время моих тестов некоторые программы отказывались работать самостоятельно. В частности, Mozilla не любит параметры, установленные в демоне trickled (маленькие значения для time-smoothing и length-smoothing). Так что если вы хотите использовать демон, вам нужно будет немного поэкспериментировать с его опциями.
Еще одной программой, заработавшей не совсем так, как мне хотелось, является Bittorrent (для распространения ISO-образов Linux). Когда я уменьшаю предельную скорость передачи, скорость приема также заметно снижается, даже если я не менял ее сам.
Конечно, еще не исчерпана возможность улучшения trickle. В настоящий момент лимиты являются жесткими. Если установить предел закачки 20 KB/s, его нельзя будет ни уменьшить, ни увеличить. Было бы замечательно иметь возможность динамически менять значения пределов. Еще было бы неплохо задавать значения пределов в файле конфигурации trickled. Сейчас можно задавать лишь некоторые параметры.
В конечном счете я могу сказать, что trickle – это отличный инструмент и, вероятно, лучший выбор, если вам нужен легкий и гибкий регулировщик скорости.
Armijn Hemel, перевод Юрия Левина,yl@tut.by.
Сетевые решения. Статья была опубликована в номере 07 за 2004 год в рубрике sysadmin