Erlang Centos 5.5上的RabbitMQ安装问题

Erlang Centos 5.5上的RabbitMQ安装问题,erlang,rabbitmq,centos5,Erlang,Rabbitmq,Centos5,我一直在尝试在Centos上启动并运行rabbitmq-server-2.4.0 5.5在Amazon AWS实例上 我的实例使用以下内核:2.6.18-xenU-ec2-v1.2 我已尝试使用以下方法安装erlang和rabbitmq服务器: 1) 百胜回购 2) 直接rpm安装 3) 从源代码编译 在任何情况下,我都会在尝试启动 RabbitMQ服务器进程: pthread/ethr_event.c:98:等待()中出现致命错误:函数未执行 已实施(38) 任何帮助都将不胜感激。此内核似乎与

我一直在尝试在Centos上启动并运行rabbitmq-server-2.4.0 5.5在Amazon AWS实例上

我的实例使用以下内核:2.6.18-xenU-ec2-v1.2

我已尝试使用以下方法安装erlang和rabbitmq服务器: 1) 百胜回购 2) 直接rpm安装 3) 从源代码编译

在任何情况下,我都会在尝试启动 RabbitMQ服务器进程:

pthread/ethr_event.c:98:等待()中出现致命错误:函数未执行 已实施(38)


任何帮助都将不胜感激。

此内核似乎与Erlang 14B、14B01或14B02不兼容


编译Erlang 13B04成功安装了rabbitmq服务器

我首先通过源代码安装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也可用于根用户:
sudo ln-s/usr/local/bin/erl/bin/erl

安装rabbitmq rpm(可能过时,请自己检查最新版本):


如果从源代码处安装erlang,rabbitmq的rpm安装将无法识别erlang,说明需要erlang R12B-3。
用法:
rpm--nodeps-Uvh rabbitmq-server-2.6.1-1.noarch.rpm


我能够在CentOS 5.6上通过Erlang R14B04成功安装和使用RabbitMQ 2.6.1。对于将来发现此答案的人,RabbitMQ站点本身有一个潜在的答案:

RHEL 5(和CentOS 5)上的Erlang

由于EPEL包更新策略,EPEL 5包含Erlang版本 R12B-5,相对较旧。rabbitmq服务器支持R12B-5,但 性能可能低于较新的Erlang版本,并且 某些非核心功能不受支持(SSL支持,基于HTTP 插件(包括管理插件)。因此,我们建议: 您安装了Erlang的最新稳定版本。最简单的方法 要做到这一点,请使用 EPEL Erlang包的所有者。通过调用(作为根用户)来启用它:

wget-O/etc/yum.repos.d/epel-erlang.repo

然后使用yum安装erlang安装或更新erlang


如果您在最少的OS安装上手动构建Erlang,您可能还会发现您需要安装wxGTK和wxGTK-devel,以便所有测试都能正确构建和运行。

问题出在哪里 启动erlang时,在现代发行版上,消息
pthread/ethr\u event.c:98:wait\u():Function not implemented(38)
很可能是预编译的erlang二进制文件与未实现FUTEX\u wait\u PRIVATE和FUTEX\u WAKE\u PRIVATE的内核交互的结果。Amazon为EC2提供的内核没有实现这些FUTEX_PRIVATE_宏

如果发行版按照其他软件包的要求将内核头安装到/usr/include/linux中,那么尝试在ec2盒上从源代码构建Erlang可能会以同样的方式失败。(例如,Centos需要内核头文件包作为gcc、gcc-c++、glibc-devel和glibc头文件等的先决条件)。由于包安装的头与EC2映像创建脚本安装的内核不匹配,Erlang错误地假设FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PRIVATE可用

修复 要修复它,最快的方法是手动修补
erts/include/internal/pthread/ethr_event.h
以使用非私有futex实现:

应该成为

/#如果定义(FUTEX_WAIT_PRIVATE)和&defined(FUTEX_WAKE_PRIVATE)
//#定义ETHR\u FUTEX\u WAIT\u FUTEX\u WAIT\u PRIVATE
//#定义ETHR_FUTEX_WAKE__FUTEX_WAKE_PRIVATE
//#否则
#定义ETHR\u FUTEX\u WAIT\u FUTEX\u WAIT
#定义ETHR_FUTEX_WAKE__FUTEX_WAKE
//#恩迪夫
快速测试 如果您怀疑私有futex问题是您的问题,但希望在重新编译所有Erlang之前验证它,以下程序可以确定它:

如果您的内核没有_privatefutex函数,您将看到

FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS
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的环境。

在CentOS 5.6(最终版)VirtualBox VMi上编译Erlang R14B03(erts-5.8.4)是否有效。您没有使用erlang编译它--NodeP不检查依赖关系,只安装rabbitmq。这是错误的。我在谷歌搜索了几个小时后,尝试了这个解决方案,它很有效。因为在使用rpm时,它会查找从源代码编译erlang时找不到的erlang rpm
#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;
}
FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS
FUTEX_WAKE SUCCESS
FUTEX WAIT SUCCESS
FUTEX_WAKE_PRIVATE HAD ERR 38: Function not implemented
FUTEX_WAIT_PRIVATE HAD ERR 38: Function not implemented