Проблема установки RabbitMQ на Centos 5.5 - PullRequest
11 голосов
/ 28 марта 2011

Я пытался запустить rabbitmq-server-2.4.0 в Centos 5.5 для экземпляра Amazon AWS.

Мой экземпляр использует следующее ядро: 2.6.18-xenU-ec2-v1.2

Я пробовал установить erlang и rabbitmq-сервер, используя: 1) ням репо 2) прямая установка оборотов 3) компиляция из исходного кода.

В каждом случае я получаю следующее сообщение при попытке запустить Процесс RabbitMQ-Server:

pthread / ethr_event.c: 98: фатальная ошибка ожидания __ (): функция не выполнена выполнено (38)

Любая помощь будет оценена.

Ответы [ 6 ]

13 голосов
/ 16 февраля 2012

Проблема

При запуске erlang сообщение pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38) в современных дистрибутивах, скорее всего, является результатом скомпилированного двоичного файла Erlang, взаимодействующего с ядром, которое не реализует FUTEX_WAIT_PRIVATE и FUTEX_WAKE_PRIVATE.Ядра, которые Amazon предоставляет для EC2, не реализуют эти макросы FUTEX_PRIVATE_.

Попытка собрать Erlang из источника на блоке ec2 может завершиться неудачей таким же образом , если дистрибутив устанавливает заголовки ядра в / usr/ include / linux как требование других пакетов.(Например, Centos требует пакет kernel-headers как предварительное условие для gcc, gcc-c ++, glibc-devel и glibc-headers, среди других).Поскольку заголовки, установленные пакетом, не соответствуют ядру, установленному сценариями создания образа EC2, Эрланг неверно полагает, что доступны FUTEX_WAIT_PRIVATE и FUTEX_WAKE_PRIVATE.

Исправление

Чтобы исправить это, самое быстрое - это ручное исправление erts/include/internal/pthread/ethr_event.h для использования реализации не-PRIVATE futex:

#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE)
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT_PRIVATE
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE_PRIVATE
#else
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE
#endif

должно стать

//#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE)
//#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT_PRIVATE
//#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE_PRIVATE  
//#else
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE
//#endif

Быстрый тест

Если вы подозреваете, что проблема с закрытым futex является вашей проблемой, но вы хотите проверить ее, прежде чем перекомпилировать весь Erlang, следующая программа может определить его:

#include <sys/syscall.h>
#include <unistd.h>
#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef uint32_t u32; /* required on older kernel headers to fix a bug in futex.h Delete this line if it causes problems. */
#include <linux/futex.h>

int main(int argc, char *argv[])
{
#if defined(FUTEX_WAIT) && defined(FUTEX_WAKE) 
        uint32_t i = 1;
        int res = 0;
        res = syscall(__NR_futex, (void *) &i, FUTEX_WAKE, 1,
                        (void*)0,(void*)0, 0);
        if (res != 0)
        {
                printf("FUTEX_WAKE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAKE SUCCESS\n");
        }

        res = syscall(__NR_futex, (void *) &i, FUTEX_WAIT, 0,
                        (void*)0,(void*)0, 0);
        if (res != 0)
        {
                printf("FUTEX_WAIT HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAIT SUCCESS\n");
        }
#else
        printf("FUTEX_WAKE and FUTEX_WAIT are not defined.\n");
#endif

#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE) 
        uint32_t j = 1;
        int res_priv = 0;
        res_priv = syscall(__NR_futex, (void *) &j, FUTEX_WAKE_PRIVATE, 1,
                        (void*)0,(void*)0, 0);
        if (res_priv != 0)
        {
                printf("FUTEX_WAKE_PRIVATE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAKE_PRIVATE SUCCESS\n");
        }

        res_priv = syscall(__NR_futex, (void *) &j, FUTEX_WAIT_PRIVATE, 0,
                        (void*)0,(void*)0, 0);
        if (res_priv != 0)
        {
                printf("FUTEX_WAIT_PRIVATE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAIT_PRIVATE SUCCESS\n");
        }
#else
        printf("FUTEX_WAKE_PRIVATE and FUTEX_WAIT_PRIVATE are not defined.\n");
#endif


        return 0;
}

Вставьте его в futextest.c, затем gcc futextest.c и ./a.out.

Если ваше ядро ​​реализует частные фьютексы, вы увидите

FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS

Если у вас ядро ​​без функций _PRIVATE futex, вы увидите

FUTEX_WAKE SUCCESS
FUTEX WAIT SUCCESS
FUTEX_WAKE_PRIVATE HAD ERR 38: Function not implemented
FUTEX_WAIT_PRIVATE HAD ERR 38: Function not implemented

Это исправление должно позволить Erlang скомпилироваться и даст среду, которую вы можете установить rabbitmq против , используя метод --nodeps, обсуждаемый здесь .

11 голосов
/ 17 апреля 2011

Я установил его, сначала установив erlang по источнику:

sudo yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
wget http://www.erlang.org/download/otp_src_R13B04.tar.gz
tar xfvz otp_src_R13B04.tar.gz
cd otp_src_R13B04/
./configure
sudo make install

После этого создайте символическую ссылку, чтобы сделать erl доступным для пользователя root:
sudo ln -s /usr/local/bin/erl /bin/erl

Установитьrabbitmq rpm (возможно, устарели, проверьте последний выпуск самостоятельно):

wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.4.1/rabbitmq-server-2.4.1-1.noarch.rpm
rpm -Uvh rabbitmq-server-2.4.1-1.noarch.rpm
6 голосов
/ 26 октября 2011

Если erlang установлен из источника, rpm-установка rabbitmq не может распознать erlang, заявив, что требуется erlang R12B-3.
Использование:
rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm

Мне удалось успешно установить и использовать RabbitMQ 2.6.1 в CentOS 5.6 с Erlang R14B04

2 голосов
/ 07 декабря 2011

Для людей, которые найдут этот ответ в будущем, сам сайт RabbitMQ может дать вам потенциальный ответ:

Установка в Linux на основе RPM (CentOS, Fedora, OpenSuse, RedHat)

Erlang на RHEL 5 (и CentOS 5)

Из-за политики обновления пакетов EPEL EPEL 5 содержит версию Erlang R12B-5, которая является относительно старой.Rabbitmq-сервер поддерживает R12B-5, но производительность может быть ниже, чем для более поздних версий Erlang, а некоторые неосновные функции не поддерживаются (поддержка SSL, плагины на основе HTTP, включая плагин управления).Поэтому мы рекомендуем вам установить самую последнюю стабильную версию Erlang.Самый простой способ сделать это - использовать репозиторий пакетов, предоставленный для этой цели владельцем пакета EPEL Erlang.Включите его, вызвав (от имени root):

wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo

, а затем установите или обновите erlang с помощью yum installэрланг.

2 голосов
/ 29 марта 2011

Кажется, что это ядро ​​несовместимо с Erlang 14B, 14B01 или 14B02

Компиляция Erlang 13B04 привела к успешной установке rabbitmq-сервера

0 голосов
/ 18 декабря 2011

Если вы пойдете по пути построения Erlang вручную при минимальной установке ОС, вы также можете обнаружить, что вам нужно установить wxGTK & wxGTK-devel, чтобы все тесты были собраны и работали правильно.

...