25.07.2010
Опишу хак, котоорый использую для ускорения работы по 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 0m0.179s user 0m0.003s sys 0m0.001s |
21.05.11 08:07 Nikita Menkovich комментирует:
Можно в sshd_config добавить UseDNS no и тогда обратную зону ssh не будет искать, это ещё сильнее ускоряет. И первое подключение в том числе.