我一直在努力让Rabbitmq-server-2.4.0在Centos上运行 5.5在Amazon AWS实例上。
我的实例使用以下内核:2.6.18-xenU-ec2-v1.2
我尝试使用以下方法安装erlang和rabbitmq-server: 1)yum回购 2)直接转速安装 3)从源代码编译。
在每种情况下,尝试启动时都会收到以下消息 RabbitMQ-Server进程:
pthread / ethr_event.c:98:等待__()中的致命错误:函数没有 实施(38)
任何帮助都将不胜感激。
答案 0 :(得分:13)
当启动erlang时,消息pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38)
在现代发行版中很可能是预编译的Erlang二进制文件与未实现FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PRIVATE的内核交互的结果。亚马逊为EC2提供的内核不实现这些FUTEX_PRIVATE_宏。
如果发行版将内核头文件安装到/ usr / include / linux作为其他软件包的要求,则尝试在ec2框上从源构建Erlang可能会以相同的方式失败 。 (例如,Centos需要kernel-headers包作为gcc,gcc-c ++,glibc-devel和glibc-headers等的先决条件)。由于程序包安装的标头与EC2映像创建脚本安装的内核不匹配,因此Erlang错误地假定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
如果您怀疑私有互斥问题是您的问题,但想要在重新编译所有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编译,并且将产生一个环境,您可以针对using the --nodeps method discussed here安装rabbitmq。
答案 1 :(得分:11)
我通过首先按来源安装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
之后创建一个符号链接,以便为root用户提供erl:
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
答案 2 :(得分:6)
如果从源代码安装了erlang,则Rabbitmq的rpm安装无法识别erlang,表明需要使用erlang R12B-3。
使用:
rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm
我能够在使用Erlang R14B04的CentOS 5.6上成功安装和使用RabbitMQ 2.6.1
答案 3 :(得分:2)
似乎此内核与Erlang 14B,14B01或14B02不兼容
编译Erlang 13B04导致成功安装了rabbitmq-server
答案 4 :(得分:2)
对于将来找到这个答案的人来说,RabbitMQ网站本身就有一个潜在的答案:
Installing on RPM-based Linux (CentOS, Fedora, OpenSuse, RedHat)
RHEL 5(和CentOS 5)上的Erlang
由于EPEL包更新政策,EPEL 5包含Erlang版本 R12B-5,相对较老。 rabbitmq-server支持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
然后使用yum install erlang安装或更新erlang。
答案 5 :(得分:0)
如果您在最小的操作系统安装上手动构建Erlang的路线,您可能还会发现需要安装wxGTK&amp; wxGTK-devel,以便所有测试都能正确构建和运行。