Сотни клиентов Apache SSHD оставляют запущенными сотни процессов демона OpenSSH.

Я использую клиент java-библиотеки Apache SSHD для обслуживания файлов через HTTP, которые читаются через SSH. Концептуальное приложение отлично работает.

Но когда я хочу читать сотни файлов последовательно (например, для отображения изображений в галерее), я сталкиваюсь с проблемами масштабируемости: мой сервер заканчивается сотнями процессов демона OpenSSH:

  • под моим именем пользователя как /usr/lib/openssh/sftp-server и
  • sshd:username@notty и
  • под корнем как sshd: username [priv]

что приводит к тому, что моему серверу не хватает памяти, и мой сервер выходит из строя.

Я не думаю, что это ошибка в OpenSSH (я использую OpenSSH_5.9p1), но как я использую клиент Apache SSHD.

Вот код, который я запускаю каждый раз, когда обслуживаю файл:

SshClient client = SshClient.setUpDefaultClient();
client.getProperties().put(ClientFactoryManager.HEARTBEAT_INTERVAL, "50000");
client.start();
session = client.connect("username", "server", 22).await().getSession();
session.addPasswordIdentity("password");
session.auth().await();
SftpClient sftp = session.createSftpClient();
// Create an HTTP response from an sftp channel stream

Что из следующего, если таковое имеется, мне нужно делать сотни клиентских запросов JSch?

  1. Закрыть/остановить мой сеанс и/или клиент после каждого запроса? (терминология здесь настолько общая, но функциональность настолько точна, что у меня может быть неправильное понимание каждого компонента)?
  2. Объединение клиентов?
  3. Конфигурация сервера для ограничения количества потоков демона?
  4. Уменьшить таймаут (на клиенте или на сервере)?

Любое понимание, конкретное или общее, было бы полезно.


person Sridhar Sarnobat    schedule 07.08.2015    source источник


Ответы (1)


Вы обязательно должны отключить сеанс SSH/SFTP после того, как закончите с ним:

client.stop();

Объединение клиентов в пул неплохая идея, но вы делаете это только после отключения не помогает.

person Martin Prikryl    schedule 07.08.2015
comment
Спасибо за быстрый ответ. Причина, по которой я оставил соединение открытым, заключалась в том, что я хотел повторно использовать соединения и каждый раз избегать аутентификации. Очевидно, я все испортил, но как правильно избежать избыточного подключения/отключения? - person Sridhar Sarnobat; 07.08.2015
comment
Ну это не вопрос к JSch. А скорее о сохранении постоянных объектов на веб-сервере для разных HTTP-запросов. Но для этого нам нужно знать, какой веб-сервер/среду вы используете. Это в принципе совсем другой вопрос. И я почти уверен, что на SO уже ответили. - person Martin Prikryl; 07.08.2015
comment
Хорошо, спасибо, что развеяли мое замешательство. Я помечаю это как правильное на данный момент, но еще не пробовал (мне нужно найти клиентский код Apache SSHD, который соответствует session.disconnect() в JJSH). - person Sridhar Sarnobat; 07.08.2015
comment
Это client.stop() в Apache SSH. Я на самом деле не вижу, как Apache SSH связан с JSch. - person Martin Prikryl; 07.08.2015
comment
Спасибо. Я думал, что компонент SSHD Apache Mina использует Jsch под капотом, но похоже, что я ошибаюсь (github.com/apache/mina-sshd/blob/master/sshd-core/pom.xml). К счастью для меня, я все равно не слишком люблю ЗАО. - person Sridhar Sarnobat; 07.08.2015
comment
Я могу подтвердить, что это работает. Я не получаю сотни процессов sshd. Также быстро обслуживать файлы, потому что на сервере больше свободной памяти. Я просто интеллектуально недоволен тем, что (пока) не использую повторно соединения. Но в следующий раз я пойду по этому мосту осторожнее. Спасибо еще раз. - person Sridhar Sarnobat; 08.08.2015