Пользователь
0,0
рейтинг
23 января 2013 в 18:34

Авторегулирование скорости Transmission из песочницы

После приобретения RPi, установки кучи всяких вкусностей, понял, что надо что-то делать со скоростью работы transmission. Когда он качает на полной скорости — быстро качаются треки, но невозможно нормально пользоваться интернетом. Приходится постоянно лезть в веб интерфейс и резать скорость. Если качает медленно — это напрягает длиииительностью процесса. Все это порядком поднадоело, поэтому было решено автоматизировать этот процесс
image

Как известно, transmission имеет функцию «альтернативная скорость» и запуск ее по расписанию. По началу меня это устраивало, но все-таки можно же качать не только ночью по полной, но и все то время, когда никто не пользуется интернетом.

Изменяем скорость через файл конфигурации

По-началу все мои мысли пали на файл конфигурации transmission
/etc/transmission-daemon/settings.json

Необходимо учитывать, что все изменения в этом файле вступят в силу только, если сначала остановить работу transmission
/etc/init.d/transmission-daemon stop
внести изменения и запустить
/etc/init.d/transmission-daemon start
Параметры, которые меня интересовали были:
speed-limit-down
speed-limit-up

Ограничение скорости закачки и отдачи соответственно.
Значения этих параметров необходимо изменить в зависимости есть ли кто-нибудь сейчас в сети.

Есть кто в сети?

Для определения наличия кого-либо в сети я воспользовался обычным пингом. Так как все устройства (ПК, ноутбук, моб. телефон) подключаются к роутеру с DHCP, то IP адреса устройствам присваиваются последовательно, а значит перебирать будем с помощью цикла.

Так родился скрипт версии 1.0

#!/bin/bash 

#v1.0
#локальный адрес
ip=192.168.1.
#количество возможных машин в сети
n=3
#с какого адреса начинать пинговать машины
i0=2
i=$i0
#ограничение скорости. 0 - никого нет в сети, скорость на максимум; 1- есть кто-то в сети, скорость ограничена
speedlimit=0
#скорость на отдачу и прием, если никого нет
upspeed=50
downspeed=500
#скорость на отдачу и прием, если кто-то есть в сети
upspeedlim=10
downspeedlim=10

let end=n+i
result=0

#бесконечный цикл
while [ 1 = 1 ]; do
	#цикл пинга локальных машин от i до последней машины end
	until [ "$i" -eq "$end" ];do
		result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}')
		#если в результате пинга кто-то был обнаружен, то цикл останавливается и .. см. if
		if [ "$result" = 1 ]; then
			break
		fi
		let i++
	done
	#если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его
	#иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его
	if [ "$result" = 1 ]; then
		if [ $speedlimit = 0 ]; then
			sudo /etc/init.d/transmission-daemon stop
			#изменяем скорость закачки
			sudo perl -pi~ -e 's/"speed-limit-down":(.+)/"speed-limit-down": '$downspeedlim',/' /etc/transmission-daemon/settings.json
			#изменяем скорость отдачи
                        		sudo perl -pi~ -e 's/"speed-limit-up":(.+)/"speed-limit-up": '$upspeedlim',/' /etc/transmission-daemon/settings.json
			sudo /etc/init.d/transmission-daemon start
			speedlimit=1
		fi
	fi
	if [ "$result" = 0 ]; then
		if [ $speedlimit = 1 ]; then
			sudo /etc/init.d/transmission-daemon stop
                        		#изменяем скорость закачки
                        		sudo perl -pi~ -e 's/"speed-limit-down":(.+)/"speed-limit-down": '$downspeed',/' /etc/transmission-daemon/settings.json
                      		#изменяем скорость отдачи
                        		sudo perl -pi~ -e 's/"speed-limit-up":(.+)/"speed-limit-up": '$upspeed',/' /etc/transmission-daemon/settings.json
			sudo /etc/init.d/transmission-daemon start
			speedlimit=0
		fi
	fi
#задержка 30 секунд
sleep 30
i=$i0

done

Он конечно не супер, но работает.

Совершенствуемся дальше

Дальше я начал рассуждать о том, что перезагружать transmission как-то уныло, веб интерфейс ведь все это делает без перезагрузок, а чем я, собственно, хуже.
Благодаря товарищу andbas было выбрано направление в сторону утилиты transmission-remote. Расписывать и хвалить ее не буду, вкратце скажу, что с ее помощью подключаясь к веб-интерфейсу можно управлять transmission. Единственным минусом я бы назвал то, что в скрипте приходится в явном виде указывать логин и пароль, хотя это, возможно, можно изменить.
Для некоторого упрощения я решил использовать функцию «альтернативная скорость» или далее по тексту «черепашка», потому что в веб-интерфейсе иконка изображена как раз в виде черепашки и интуитивно намекает что с ее помощью мы будем «тормозить».
Значит так, если кто-то есть в сети, то включаем черепашку, нет — выключаем. Если мы в сети и хотим принудительно включить закачку на полную, то делается достаточно просто — клик по черепашке, вместо входа в настройки и изменения скорости.

Перерождение, скрипт версии 1.1
#!/bin/bash 
#ver.1.1

#transmission ip:port
tip=192.168.1.100:9091
#login
login=*
#password
password=*

#локальный адрес
ip=192.168.1.
#количество возможных машин в сети
n=3
#с какого адреса начинать пинговать машины
i0=2
i=$i0
let end=n+i

result=0
#флаг однократного выполнения при старте
start=1
#флаг ограничения скорости
speedlimit=0

#бесконечный цикл
while [ 1 = 1 ]; do
	#цикл пинга локальных машин от i до последней машины end
	until [ "$i" -eq "$end" ];do
		result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}')
		#если в результате пинга кто-то был обнаружен, то цикл останавливается и .. см. if
		if [ "$result" = 1 ]; then
			break
		fi
		let i=$i+1
	done
	#если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его
	#иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его
	if [ "$result" = 1 ]; then
		if [ $start = 1 ]; then
			#однократно при старте
			#устанавливаем черепашку, устанавливаем флаг ограничения скорости
			transmission-remote $tip -n $login:$password -as
			speedlimit=1
			start=0
		else
			if [ $speedlimit = 0 ]; then
				#устанавливаем черепашку, устанавливаем флаг ограничения 
				transmission-remote $tip -n $login:$password -as
 				speedlimit=1
			fi
		fi
	fi
	if [ "$result" = 0 ]; then
		if [ $start = 1 ]; then
			#однократно при старте
			#сбрасываем черепашку, сбрасываем флаг ограничения скорости
			transmission-remote $tip -n $login:$password -AS
			speedlimit=0
			start=0			
		else
			if [ $speedlimit = 1 ]; then
				#сбрасываем черепашку, сбрасываем флаг ограничения
 				transmission-remote $tip -n $login:$password -AS
				speedlimit=0
			fi
		fi
	fi
#задержка 30 секунд
sleep 30
i=$i0
done

Опять двадцать пять. Когда кто-то в сети — качаем медленно, канал не забиваем, никому не мешаем, но винчестер то работает: греется, потребляет энергию. С моими настройками (10кб/с закачка на черепашке) это выглядит не совсем экономично, уж лучше пусть ничего не качается вовсе и винчестер не гудит.

Ставлю точку (возможно временно), скрипт версии 1.2
#!/bin/bash 

#v1.2 

#transmission ip:port
tip=192.168.1.100:9091
#login
login=login
#password
password=pass

#локальный адрес
ip=192.168.1.
#количество возможных машин в сети
n=3
#с какого адреса начинать пинговать машины
i0=2
i=$i0
let end=n+i
result=0
#флаг однократного выполнения при старте
start=1
#флаг ограничения скорости
speedlimit=0

#бесконечный цикл
while [ 1 = 1 ]; do
	#цикл пинга локальных машин от i до последней машины end
	until [ "$i" -eq "$end" ];do
		result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}')
		#если в результате пинга кто-то был обнаружен, то цикл останавливается и см далее
		if [ "$result" = 1 ]; then
			break
		fi
		let i++
	done
	#если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его
	#иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его
	if [ "$result" = 1 ]; then
		if [ $start = 1 ]; then
			#однократно при старте
			#останавливаем все треки, устанавливаем флаг ограничения скорости
			transmission-remote $tip -n $login:$password -t all -S
			speedlimit=1
			#сбрасываем флаг однократного выполнения
			start=0
		else
			if [ $speedlimit = 0 ]; then
				#останавливаем все треки, устанавливаем флаг ограничения скорости
 				transmission-remote $tip -n $login:$password  -t all -S
				speedlimit=1
			fi
		fi
	fi
	if [ "$result" = 0 ]; then
		if [ $start = 1 ]; then
			#однократно при старте
			#запускаем все треки, сбрасываем флаг ограничения скорости
			transmission-remote $tip -n $login:$password -t all -s
			speedlimit=0
			#сбрасываем флаг однократного выполнения
			start=0			
		else
			if [ $speedlimit = 1 ]; then
				#запускаем все треки, сбрасываем флаг ограничения скорости
				transmission-remote $tip -n $login:$password -t all -s
				speedlimit=0
			fi
		fi
	fi
#задержка 30 секунд
sleep 30
i=$i0
done

Теперь вроде бы все устраивает…

Напоследок автозагрузка скрипта

Совсем забыл, ведь скрипт должен стартовать вместе с системой. Поэтому было решено сделать демон.
#! /bin/sh
### BEGIN INIT INFO
# Provides:          tsl
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO


case "$1" in

  start)
	start-stop-daemon -Sbvx /usr/bin/tsl
  ;;
  stop)
	sudo pkill tsl
  ;;
  *)
     echo "Usage: /etc/init.d/tsl-deamon {start|stop}"
     ;;
esac
:

Для начинающих линуксоидов: скрипт необходимо сделать запускающимся
sudo chmod +x <bash_script_name>
и положить в папку usr/bin
Демон положить в etc/ini.d и для автозапуска прописать
update-rc.d <daemon_name> defaults
для удаления из автозагрузки
update-rc.d -f <daemon_name> remove

*в моем случае имя скрипта tsl (transmission speed limiter), если собираетесь его менять, то и в демоне также необходимо поменять

Эпилог

Все описано не детально, это и так понятно. Также должны быть ошибки, недочеты и прочее. Сам я начинающий линуксоид (спасибо малине за это), поэтому в некоторых местах возможны глупости…
А в общем, думаю, идея ясна. На базе данного шаблона можно сделать двух, трех… позиционное регулирование скорости закачки/откачки, в зависимости от количества пользователей в сети например (если 1 юзер — одна скорость, 2 — другая и т.д.). Также если у нас айпи идет не по порядку, то можно использовать массив из адресов и в цикле перебирать элементы массива.
Антон @outofspace
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +15
    Я конечно дико извиняюсь, но: ru.wikipedia.org/wiki/QoS
    • +4
      И добавлю частный случай — шейпер
      • +3
        Стыдно, но с этими понятиями сталкиваюсь впервые. Почитал «вот из ит» и все равно отдам предпочтение своему скрипту =)
        • 0
          Я вместо отключения всех активных торрентов
          transmission-remote $tip -n $login:$password -t all -S

          просто включаю режим альтернативного ограничения скорости (у меня это 5 мегабит из 100 доступных от провайдера))
          transmission-remote $tip -n $login:$password -as

          отключение режима
          transmission-remote $tip -n $login:$password -AS


          Потому как полностью глушить все торренты как-то не комильфо.
      • 0
        Раз уж затронули тему, какие решения для шейпинга в линуксе подскажите? В винде, в своё время, пользовался cFosSpeed и был очень доволен, а на убунте так и не нашел каких-то достойных аналогов.
        • +2
          Погуглите на тему «LARTC» — узнаете очень много нового и полезного.
    • –5
      QoS и...?
      О каком QoS идёт речь?
      Даже в заголовке IP пакета есть флаг для QoS, но я стесняюсь спросить — кто-нибудь его использует вообще в реальных сетях?
      • +5
        Если б не использовали, то вы бы сейчас этот комментарий раза с 20-ого смогли оставить.
  • 0
    А еще можно и полностью отключать винчестер, когда нет закачек. Например, устанавливать с помощью hdparm -S минимальное время перед отключение диска во время простоя, совсем тишина будет.
    • 0
      Можно. Забыл уточнить, у меня винчестер с автоматическим уходом в сон, так что мне это делать не обязательно, но, действительно, в остальных случаях необходимо и это сделать
  • 0
    И скажите, какая у вас максимальная скорость скачивания?
    • 0
      Максимальная скорость ограничена скоростью провайдера/линии(как и у всех =)), а вообще 1Мбит/с
      • +1
        1 Мбит/сек как-то совсем не будет напрягать винчестер (ну шуршит себе, да и ладно.)
        100Мбит/сек — то да, когда качается со скоростью 11 МиБ/секунда да ещё и оперирует кучкой маленьких файлов (наверное) — винчестер трещит головками.
      • 0
        Я хотел посмотреть не упираетесь ли вы в скорости самой RPi, сетевая скорость в ней, как оказалось, не очень высока.

        А скоростью скачивания с нее вы довольны? Хватает для ваших нужд?
        • 0
          Я думаю, дело не совсем в сетевом интерфейсе, а в невозможности обслуживать большое количество прерываний, тут виноват довольно слабый CPU.
          • 0
            Да, вот и думаю на днях разогнать немного свою малину, посмотреть что получится по сетевым скоростям.
  • –1
    Я вот тоже долго мучился с Трансмишн, а потом взял да и поставил Deluge. Доволен как слон.
  • 0
    У меня NAS с Трасмишином правда под SnakeOS, буду смотреть как там влезть в ОС NAS, т.к. действительно отличная штука, чаще всего забываю отключать черепашку перед завершением серфинга.
  • +1
    Разве transmission не перечитывает конфиг по sighup?
    И простыни кода лучше все-таки убрать под спойлер.
    • +2
      И даже должна быть такая интересная конструкция
      # transmission-daemon reload
      Она опять-таки заставляет демон перечитать конфиг.
      • +1
        вот только по моему трансмишн такой гад — что он переписывает конфиг при стопе
  • +3
    Предлагаю ознакомиться с transmission-cli и совершить еще одно перерождение. :)

  • +1
    Просто ради интереса: разве во всех системах демоны инициализируются одинаково? Как насчет SystemD?
  • 0
    А у меня вот вопрос не про трансмишн и прочее, а больше по сути: пингом определяется наличие включенных компьютеров, зарегистрированных в сети. Но ведь они могут просто быть включены, за ними может не быть людей и никто, кроме трансмишна так и не работает в сети. Однако Ваш скрипт такого не предусматривает и закачка будет остановлена. А у меня вот вообще все компьютеры не выключаются никогда. Плюс есть еще пара зарегистрирвоанных в сети мультимедиацентров и проч. Как быть?
    • 0
      LAVBoy, полагаю, что решение описанное товарищами выше LARTC, как раз для Вас
      • 0
        Да, спасибо, это понятно! Я просто не совсем корректно выразился. Имел в виду, в чем смысл приведенного выше скрипта, если он постоянно ограничивает трансмишн?
        • 0
          Когда я его делал, я и знать не знал про LARTC, поэтому писла для себя, а у меня дела обстоят следующим образом: когда компьютеры есть в сети — то интернетом ктото пользуется — соответственно стопим трансмишн, когда все повыходили из сети(выключили компьютеры, телефоны и прочее) — старт трансмишн. У меня машины просто так не простаивают, поэтому об использовании интернета я узнаю косвенно, по наличию устройств в сети.

          *п.с. почему я не могу отвечать на комментарии? постоянно приходится лезть в инструменты разработчика и убирать блокировку кнопки?
  • 0
    В аналогичном случае все разруливает роутер.
    При закачке на 35 Мбит на одном компьютере, на втором можно спокойно разговаривать по скайпу.
    Это вышеупомянутое QoS.
  • 0
    Необходимо учитывать, что все изменения в этом файле вступят в силу только, если сначала остановить работу transmission
    /etc/init.d/transmission-daemon stop
    

    внести изменения и запустить
    /etc/init.d/transmission-daemon start
    


    Ну зачем же так? Mожно просто попросить Transmission перезагрузить конфиги и без рестарта:
    $ killall -HUP transmission-da
    

    или
    $ pkill -HUP transmission-da
    
    • 0
      Кстати да. Лимит скорости меняется в трансмишине сразу после его выставления в настройках. Даже окно настроек не надо закрывать, не говоря уже о перезапуске программы.

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