gpt4 book ai didi

erlang - Centos 5.5 上的 RabbitMQ 安装问题

转载 作者:行者123 更新时间:2023-12-04 01:24:16 24 4
gpt4 key购买 nike

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

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

我尝试使用以下方法安装 erlang 和 rabbitmq-server:
1) 百胜 repo
2)直接rpm安装
3) 从源代码编译。

在每种情况下,我在尝试启动时都会收到以下消息
RabbitMQ-Server 进程:

pthread/ethr_event.c:98:wait__() 中的 fatal error :函数没有
实现 (38)

任何帮助,将不胜感激。

最佳答案

问题

在启动 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_ 宏。

如果发行版将内核头文件安装到/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

快速测试

如果您怀疑私有(private) 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 中。

如果你的内核实现了私有(private) futex,你会看到
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。

关于erlang - Centos 5.5 上的 RabbitMQ 安装问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5463503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com