Erlang: не удается запустить ведомое устройство — {ошибка, время ожидания}

В настоящее время я пытаюсь настроить распределенную среду нагрузочного тестирования Tsung, которая использует функциональность подчиненного устройства Erlang, однако мне не удалось заставить узел контроллера запустить подчиненный узел. Например.

(musicglue@load1)1> net:ping(musicglue@load2).
pong
(musicglue@load1)2> slave:start(load2,musicglue,"-setcookie tom").
{error,timeout}

ЗАДНИЙ ПЛАН

Моя среда:

Контроллер — имя хоста: load1, пользователь: musicglue, Ubuntu 10.04 LTS, Erlang R15B01, скомпилированный из исходного кода Ведомый — имя хоста: load2, пользователь: musicglue, Ubuntu 10.04 LTS, Erlang R15B01 соответствует исходному коду Брандмауэр отключен SELinux не установлен

Вещи, которые работают:

  • Я могу использовать SSH с load1 на load2 и наоборот
  • Я могу запустить сеансы erl на load1 и load2
  • Я могу запустить сеанс erl на load2 с load1; ssh load2 ошибка
  • Я могу успешно пропинговать load2 из load1 из сеанса erl, используя один и тот же файл cookie на обоих узлах.

Вывод пинга:

musicglue@load1:~$ erl -rsh ssh -sname musicglue -setcookie tom
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:
0] [hipe] [kernel-poll:false]
Eshell V5.9.1  (abort with ^G)
(musicglue@load1)1> net:ping(musicglue@load2).
pong

ПРОБЛЕМА

Моя проблема возникает при попытке запустить подчиненный сеанс с load1 на load2:

musicglue@load1:~$ erl -rsh ssh -sname musicglue -setcookie tom
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:
0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(musicglue@load1)1> net:ping(musicglue@load2).
pong
(musicglue@load1)2> slave:start(load2,musicglue,"-setcookie
tom").
{error,timeout}

Вот вывод, который я получаю от epmd, когда запускаю команду slave:start:

epmd: Thu May 24 10:01:57 2012: Non-local peer connected
epmd: Thu May 24 10:01:57 2012: opening connection on file descriptor
4
epmd: Thu May 24 10:01:57 2012: got 12 bytes
***** 00000000  00 0a 7a 6d 75 73 69 63 67 6c 75 65
|..zmusicglue|
epmd: Thu May 24 10:01:57 2012: ** got PORT2_REQ
epmd: Thu May 24 10:01:57 2012: got 2 bytes
***** 00000000  77 01                                             |w.|
epmd: Thu May 24 10:01:57 2012: ** sent PORT2_RESP (error) for
"musicglue"
epmd: Thu May 24 10:01:57 2012: closing connection on file descriptor
4
epmd: Thu May 24 10:01:57 2012: Local peer connected
epmd: Thu May 24 10:01:57 2012: opening connection on file descriptor
4
epmd: Thu May 24 10:01:57 2012: got 24 bytes
***** 00000000  00 16 78 ca d6 4d 00 00  05 00 05 00 09 6d 75 73
|..x..M.......mus|
***** 00000010  69 63 67 6c 75 65 00 00                           |
icglue..|
epmd: Thu May 24 10:01:57 2012: ** got ALIVE2_REQ
epmd: Thu May 24 10:01:57 2012: registering 'musicglue:1', port 51926
epmd: Thu May 24 10:01:57 2012: type 77 proto 0 highvsn 5 lowvsn 5
epmd: Thu May 24 10:01:57 2012: got 4 bytes
***** 00000000  79 00 00 01                                       |
y...|
epmd: Thu May 24 10:01:57 2012: ** sent ALIVE2_RESP for "musicglue"
epmd: Thu May 24 10:01:57 2012: unregistering 'musicglue:1', port
51926
epmd: Thu May 24 10:01:57 2012: closing connection on file descriptor
4

Любая помощь или предложения, которые у кого-либо есть, будут высоко оценены,

Большое спасибо

РЕДАКТИРОВАТЬ

Я также должен упомянуть, что я вижу, что ssh-соединение успешно подтверждается load2, но затем немедленно отключается:

May 30 13:49:27 load2 sshd[16169]: Accepted publickey for musicglue from 173.45.236.182 port 51843 ssh2
May 30 13:49:27 load2 sshd[16171]: Received disconnect from 173.45.236.182: 11: disconnected by user

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

musicglue@load1:~$ erl -rsh ssh -sname musicglue -setcookie tom
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(musicglue@load1)1> slave:start(load2,bar,"-setcookie tom").
{error,timeout}

и для контроллера:

musicglue@load1:~$ erl -rsh ssh -sname foo -setcookie tom
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(foo@load1)1> slave:start(load2,musicglue,"-setcookie tom").
{error,timeout}

и для обоих:

musicglue@load1:~$ erl -rsh ssh -sname foo -setcookie tom
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(foo@load1)1> slave:start(load2,bar,"-setcookie tom").
{error,timeout}

Но безрезультатно

РЕШЕНИЕ

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

После исправления этого порта связи между двумя узлами все заработало отлично.


person Tom Maguire    schedule 29.05.2012    source источник
comment
Я думаю, это потому, что вы пытаетесь запустить новый подчиненный узел на load2 с тем же именем, musicglue, что и у существующего узла. Имена ваших имен должны быть уникальными на машине.   -  person rvirding    schedule 30.05.2012
comment
Спасибо @rvirding. Я пробовал комбинацию разных имен узлов (см. отредактированный пост), но все равно не повезло. Я неправильно истолковал ваш комментарий?   -  person Tom Maguire    schedule 30.05.2012
comment
@rvirding подумал, что вам может быть интересно узнать, что после решения моей проблемы (описанной выше) я мог использовать одно и то же имя как на контроллере, так и на подчиненном устройстве.   -  person Tom Maguire    schedule 07.06.2012
comment
Как именно вы исправил порт связи, ПОМОГИТЕ ПОЖАЛУЙСТА   -  person Igor Masternoy    schedule 23.01.2015
comment
@TomMaguire, как ты решил проблему со связью?   -  person elpddev    schedule 20.06.2016


Ответы (2)


Альтернативный ответ для тех, кто найдет этот вопрос через Google. Если вы пытаетесь запустить службу на отдельной машине, имя вашего узла контроллера должно разрешаться.

Например, у меня были тайм-ауты с:

> node().
[email protected]
> slave:start('192.168.122.196',bar,"-setcookie cookie").
{error,timeout}

Запустив мой экземпляр erlang с явным доменным именем:

erl -name [email protected] -setcookie cookie
> slave:start('192.168.122.196',bar,"-setcookie cookie").

Теперь эта команда выполняется успешно.

person Thomas M. DuBuisson    schedule 06.02.2013

Попробуйте зарегистрировать, что происходит через SSH, создав скрипт оболочки, подобный этому, где-нибудь в вашем PATH:

#!/bin/sh

echo "$0" "$@" > /tmp/my-ssh.log
ssh -v "$@"  2>&1 | tee -a /tmp/my-ssh.log

Назовите его my-ssh, запустите Erlang с erl -rsh my-ssh и проверьте, что входит в /tmp/my-ssh.log. Это должно пролить свет на проблему...

person legoscia    schedule 31.05.2012
comment
Спасибо @legoscia, это очень полезный небольшой скрипт. Я буду использовать это в будущем точно! - person Tom Maguire; 07.06.2012