`
wqtn22
  • 浏览: 99791 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

erlang虚拟机topology不符导致启动后crash

阅读更多

线上有一台t4的机器,这些机器的cpu topo是经过伪造的,通过top命令可以看到4个核心:

top

Cpu0  :  0.3%us,  0.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.7%st

Cpu1  :  0.7%us,  0.3%sy,  0.0%ni, 98.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st

Cpu2  :  0.3%us,  0.7%sy,  0.0%ni, 78.1%id,  0.0%wa,  0.0%hi,  0.0%si, 20.9%st

Cpu3  :  0.0%us,  0.3%sy,  0.0%ni, 79.2%id,  0.0%wa,  0.0%hi,  0.0%si, 20.5%st

/proc/cpu_info下也是4个核心:

cat /proc/cpuinfo 

processor       : 0

physical id     : 0

core id         : 0

cpu cores       : 4

 

processor       : 1

physical id     : 0

core id         : 1

cpu cores       : 4

 

processor       : 2

physical id     : 0

core id         : 2

cpu cores       : 4

 

processor       : 3

physical id     : 0

core id         : 3

cpu cores       : 4

 

但实际机器有24个核心:

cat /sys/devices/system/cpu/online 

0-23

在这台机器上编译erlang虚拟机或安装已经打包的虚拟机,全部会报出segment falut的错误,对于这个问题,进行了跟踪。

首先可以确认,erlang虚拟机本身是可以正确编译好的,这给我们提供了gdb跟踪的条件,跟踪发现:

main

|-erts_cpu_info_create

  |-erts_cpu_info_update

    |-configured = (int) sysconf(_SC_NPROCESSORS_CONF);

    | 使用sysconf得到cpu个数,此处得到的是伪造的4

    |-cpuinfo->configured = configured;

    |-read_topology

      |-cpuinfo->topology = malloc(sizeof(erts_cpu_topology_t) * cpuinfo->configured);

      | 此处为拓扑信息分配空间,数量为从sysconf处获得的cpu个数

      |-cdir = opendir("/sys/devices/system/cpu");

      |-do {

          struct dirent *cde = readdir(cdir);

          if (sscanf(cde->d_name, "cpu%d", &cpu_id) == 1) {

            sprintf(fpath, "%s/cpu%d/topology/physical_package_id", cpath, cpu_id);

            if (read_file(fpath, buf, sizeof(buf)) <= 0) continue;

            读取/sys/devices/system/cpu/cpu#/topology/physical_package_id,注意这将取出配置的4个cpu之外的cpu的物理封包id

            sprintf(fpath, "%s/cpu%d/topology/physical_package_id", cpath, cpu_id);

            if (read_file(fpath, buf, sizeof(buf)) <= 0) continue;

            读取/sys/devices/system/cpu/cpu#/topology/core_id,注意这将取出配置的4个cpu之外的cpu的核心id

            ix++;

            cpuinfo->topology[ix].node= node_id;

            在ix超过4时,该处动作将越界访问cpuinfo->topology分配的内存,引发segment fault

          }

        } while (got_nodes);

自此,已经得到了问题的原因,t4机器伪造的cpu拓扑信息并不完全,erlang虚拟机在启动的时候会额外检查/sys/devices/system/cpu下

具体的cpu信息,这些信息与通过sysconf得到的信息不符,进而引发了越界的访存。

这个问题的fix方案有几种,举例如下:

1.修改erlang代码,将configured赋予一个足够大的值,避免访存越界,然后通过启动时加入参数或设置环境变量sct强制控制cpu拓扑,

  如:export ERL_FLAGS="+sct L0-3c0-3";

2.修改erlang代码,在循环读取真实拓扑信息时,忽略超过configured数量的cpu的信息,同样,启动时加入参数或设置环境变量sct;

3.令额外的cpu信息对erlang虚拟机不可见。

这个坑比较容易误导,今后应避免。

 

分享到:
评论

相关推荐

    Erlang虚拟机内存管理

    Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例 根据siyao zheng博客上听写的资源进行的翻译,大致只翻译了80%但核心部分已经完整,希望对大家...

    hex, Erlang虚拟机的软件包管理器.zip

    hex, Erlang虚拟机的软件包管理器 十六进制 Hex是Erlang虚拟机的软件包管理器。这个项目目前提供了与混合。tcm 工具构建的任务。有关安装说明和其他文档,请参阅 hex.pm 。在本地安装十六进制以进行开发: mix ...

    Erlang编程指南

    Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,...

    基于Erlang VM的语言

    基于Erlang VM的语言基于Erlang基于Erlang VM的语言 VM的语言基于Erlang VM的语言

    erlang_版本24.3.4.4

    erlang 安装包

    erlang编程 Introducing Erlang

    erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent

    可在ubuntu上安装erlang的deb包

    6,安装失败,你骂我好了,并把你的ubunt版本、是否是在虚拟机和其下的虚拟机软件名称和版本与再其下的os名称和版本、硬件(cpu、memory、Mainboard、disk)等信息email给我,我帮你找能用的版本。 软件相关信息: ...

    Erlang(32,64)安装程序

    Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,...

    Erlang及其应用Erlang及其应用

    Erlang及其应用Erlang及其应用Erlang及其应用

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    erlang25.0 windows版本

    erlang25.0 windows版本

    erlang otp25 win安装包

    erlang otp25 win安装包

    erlang22最新下载包

    erlang22最新下载包 erlang22.1.tar.gz erlang22最新下载包 erlang22最新下载包

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便...4. erlang安装后要检查能否编译成功一个helloworld文件。 5. rabbitMQ无法安装插件时非常有可能是erlang出问题了。

    erlang 中文基础教程

    erlang 中文基础教程erlang 中文基础教程

    erlang21.1.2

    最新版本rabbitmq需要最新版本的erlang,但是rabbitmq官网不提供erlang的最新版本下载,经过四处寻找,找到此版本,经测试rabbitmq-server3.7.12可以正常启动,如果rabbitmq-server启动时报{"init terminating in do...

    erlang安装包.zip

    erlang安装包

    Erlang安装手册

    Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断的情况下更新。另外如果你需要更高效的话,字节代码也可以编译成本地代码运行。  ...

Global site tag (gtag.js) - Google Analytics