Tips & tricks → Ограничиваем скорость инета...
Сначала ситуация: Общежитие, универская локалка с универским инетом и с универскими условиями. Одно из условий - ограничение скорости. Админ не стал раздавать ограничения сам, но поставил бан на час за превышение 300 Красных бородачей в секунду (300Kb/s) более минуты. Причем это прописано в правилах и мы должны настраивать это ограничение на клиентских машинах и сами.
Я нашел выход.
Мой выход - trickle. Отличная, несложная программка, маленькая утилита для ограничивания скорости интернета в программах, работающиая как пользовательский процесс. Trickle позволяет ограничить скорость без необходимости накладывания патчей на ядро, каких либо настроек firewall'a либо прав супер-пользователся (aka root) в системе. Trickle реализован в виде программы враппера, библиотеки подменяющей стандартные функции сокетов и подключаемой к программе через LD_PRELOAD. Он может быть запущен в режиме взаимодействия и как отдельный сервис.
В режиме приложения он будет уменьшать скорость доступа к каналу для приложения, которое вы ему явно укажете. Это наиболее простой способ использования trickle. Запустите trickle с параметрами пропускной способности канала и названием программы, которую вы хотите ограничить.
$trickle -d 28 -u 28 wget http://m600.org.ua/getfile/id/5164
trickle: Could not reach trickled, working independently: No such file or directory
--2009-03-06 04:01:05-- http://m600.org.ua/getfile/id/5164
Распознаётся m600.org.ua... 82.144.222.149
Устанавливается соединение с m600.org.ua|82.144.222.149|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 302 Moved Temporarily
Адрес: /file/id/5164 [переход]
--2009-03-06 04:01:05-- http://m600.org.ua/file/id/5164
Устанавливается соединение с m600.org.ua|82.144.222.149|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: нет информации [text/html]
Сохраняется в каталог: `5164.1'.
[ <=> ] 21 373 27,1K/s в 0,8s
2009-03-06 04:01:06 (27,1 KB/s) - `5164.1' сохранён [21373]
В примере я использовал утилиту wget для демонстрации. На самом деле wget имеет собственные опции ограничения использования пропускной способности канала. Как вы можете видеть, скорость загрузки 27.1K/с. Конечно это не ровно 28 K/s, но скорость будет меняться - в среднем наши 28 K/s. Для более тонкой настроки поведения программы можно использовать опции -w и -t. Для более подробной информации смотрите man trickle.
Таким образом для обновлений я использую
#trickle -d 290 -u 290 apt-get upgrade
В режиме сервиса trickle контролирует скорость использования канала большим количеством приложений. Trickle может лимитировать пропускную способность канала для группы приложений. Для запуска trickle в данном режиме используйте команду:
~$trickled -d 20 -u 20
В системе будет запщен сервис, ограничивающий скорость доступа программ, запущенных через trickle, до 20 K/s (входящую и исходящую скорости) к интернет каналу. При запуске одной программы через trickle ей будет доступен канал в 20 K/s, для двух - по 10 K/s и т.д. Для примера мы можем запустить три сессии wget:
~$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,38K/s в 3,2s
2009-03-06 04:08:18 (6,38 KB/s) - `5164.3' сохранён [21073]
~/download$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,38K/s в 3,2s
2009-03-06 04:09:55 (6,38 KB/s) - `5164.1' сохранён [21073]
~/sownloadtest$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,40K/s в 3,2s
2009-03-06 04:12:11 (6,40 KB/s) - `5164' сохранён [21073]
Скорость загрузки на каждой из сессий будет около 6.39 K/s, создавая в сумме 19.16 K/s. Как и в случае с другими шейперами, может потребоваться несколько секунд для начала ограничения скорости. Это связанно с алгоритмами шейперов, использующихся для определения времени задержки трафика перед передачей или приемом.
Trickle доступен в репозиторияхъ многих дистрибутивов. У меня в дебиане - apt-get install trickle.
Внимание, Trickle не работает с setuid программами. Причиной является игнорирование этими программами функции LD_PRELOAD, что сделано в целях безопасности. Trickle требует обязательного использования этой опции для шейпинга. (по той же причине trickle не работает со статически собранными программами).
Trickle работает лишь с программами, использующими интерфейс socket(2) для передачи и приема данных. Так же он работает лишь с TCP соединениями, но не с UDP.
Я нашел выход.
Мой выход - trickle. Отличная, несложная программка, маленькая утилита для ограничивания скорости интернета в программах, работающиая как пользовательский процесс. Trickle позволяет ограничить скорость без необходимости накладывания патчей на ядро, каких либо настроек firewall'a либо прав супер-пользователся (aka root) в системе. Trickle реализован в виде программы враппера, библиотеки подменяющей стандартные функции сокетов и подключаемой к программе через LD_PRELOAD. Он может быть запущен в режиме взаимодействия и как отдельный сервис.
В режиме приложения он будет уменьшать скорость доступа к каналу для приложения, которое вы ему явно укажете. Это наиболее простой способ использования trickle. Запустите trickle с параметрами пропускной способности канала и названием программы, которую вы хотите ограничить.
$trickle -d 28 -u 28 wget http://m600.org.ua/getfile/id/5164
trickle: Could not reach trickled, working independently: No such file or directory
--2009-03-06 04:01:05-- http://m600.org.ua/getfile/id/5164
Распознаётся m600.org.ua... 82.144.222.149
Устанавливается соединение с m600.org.ua|82.144.222.149|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 302 Moved Temporarily
Адрес: /file/id/5164 [переход]
--2009-03-06 04:01:05-- http://m600.org.ua/file/id/5164
Устанавливается соединение с m600.org.ua|82.144.222.149|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: нет информации [text/html]
Сохраняется в каталог: `5164.1'.
[ <=> ] 21 373 27,1K/s в 0,8s
2009-03-06 04:01:06 (27,1 KB/s) - `5164.1' сохранён [21373]
В примере я использовал утилиту wget для демонстрации. На самом деле wget имеет собственные опции ограничения использования пропускной способности канала. Как вы можете видеть, скорость загрузки 27.1K/с. Конечно это не ровно 28 K/s, но скорость будет меняться - в среднем наши 28 K/s. Для более тонкой настроки поведения программы можно использовать опции -w и -t. Для более подробной информации смотрите man trickle.
Таким образом для обновлений я использую
#trickle -d 290 -u 290 apt-get upgrade
В режиме сервиса trickle контролирует скорость использования канала большим количеством приложений. Trickle может лимитировать пропускную способность канала для группы приложений. Для запуска trickle в данном режиме используйте команду:
~$trickled -d 20 -u 20
В системе будет запщен сервис, ограничивающий скорость доступа программ, запущенных через trickle, до 20 K/s (входящую и исходящую скорости) к интернет каналу. При запуске одной программы через trickle ей будет доступен канал в 20 K/s, для двух - по 10 K/s и т.д. Для примера мы можем запустить три сессии wget:
~$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,38K/s в 3,2s
2009-03-06 04:08:18 (6,38 KB/s) - `5164.3' сохранён [21073]
~/download$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,38K/s в 3,2s
2009-03-06 04:09:55 (6,38 KB/s) - `5164.1' сохранён [21073]
~/sownloadtest$trickle wget http://m600.org.ua/getfile/id/5164
[ <=> ] 21 073 6,40K/s в 3,2s
2009-03-06 04:12:11 (6,40 KB/s) - `5164' сохранён [21073]
Скорость загрузки на каждой из сессий будет около 6.39 K/s, создавая в сумме 19.16 K/s. Как и в случае с другими шейперами, может потребоваться несколько секунд для начала ограничения скорости. Это связанно с алгоритмами шейперов, использующихся для определения времени задержки трафика перед передачей или приемом.
Trickle доступен в репозиторияхъ многих дистрибутивов. У меня в дебиане - apt-get install trickle.
Внимание, Trickle не работает с setuid программами. Причиной является игнорирование этими программами функции LD_PRELOAD, что сделано в целях безопасности. Trickle требует обязательного использования этой опции для шейпинга. (по той же причине trickle не работает со статически собранными программами).
Trickle работает лишь с программами, использующими интерфейс socket(2) для передачи и приема данных. Так же он работает лишь с TCP соединениями, но не с UDP.