25.07.2010

SSH на стероидах

Опишу хак, котоорый использую для ускорения работы по SSH.

Во время работы очень часто соединяюсь с несколькими хостами: хост с репозитариями git и mercurial, девелоперский хост, хосты массового хостинга. Время на соединение получается довольно внушительное и зависит в основном не от скорости канала, а от провисания. При соединении с хостом в Германии, с которым я работаю ну очень часто (и с него же отдаётся этот блог) задержка в лучшем случае 5 секунд. Неприятно, особенно когда речь идёт не о том, чтобы открыть консоль, а например просто вдавить в репозитарий набор изменений и продолжить работать.

У ssh-клиента есть возможность открывать контрольные сокеты и таким образом через одно соединение пропускать несколько потоков. Заметная задержка происходит только при открытии первого потока. Это частично решает проблему, но имеет неприятный побочный эффект. Особенно неудобно, что первый поток считается главным и если его закрыть - обрываются все остальные. Я так пробовал и мне не понравилось.

В итоге пришёл к гибридному решению. Выделил хосты, задержка при соединении с которыми особенно раздражает и стал по расписанию открывать на них контрольные соединения в фоне. Так нет варианта их случайно закрыть.

~/.ssh/config

host *
    ControlPath ~/.ssh/%r@%h:%p
host example.com
    ControlMaster auto

Пользовательский кронтаб (crontab -e)

SSH_OPTS="-N -f -o ConnectTimeout=30 -o ServerAliveInterval=15 -o ServerAliveCountMax=2"
* *  * * * test -f ~/.ssh/username@example.com:22 || ssh $SSH_OPTS username@example.com

Здесь пришлось немного поколдовать с опциями ssh, т.к. он по умолчанию не шлёт на сервер проверочные запросы и таймаут соединения у него отсутствует. Если это не поправить, то при отсутствии интернет-соединения каждую минуту будет стартовать лишний процесс, а так оно до запуска следующего скорее всего уже отработает.

Ниже результаты выполнения команды time ssh example.com /bin/true, которые конечно нельзя рассматривать как абсолютную величину, т.к. для разных хостов это они будут разнится, но о порядке прироста скорости они представление дают.

До После
real	0m5.624s
user	0m0.006s
sys	0m0.005s
    
real	0m0.179s
user	0m0.003s
sys	0m0.001s
    

Комментарии

21.05.11 08:07 Nikita Menkovich комментирует:

Можно в sshd_config добавить UseDNS no и тогда обратную зону ssh не будет искать, это ещё сильнее ускоряет. И первое подключение в том числе.