Linux下多核环境Erlang的SMP測试

目标

(1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响;

(2)       Erlang虚拟机的内存添加机理;

(3)       Erlang进程的调度情况;

(4)       Linux下监控cpu的使用状况

实验环境

联想小型机:操作系统:RedHat Enterprise LinuxServer release6.4(Santiago)

内核版本号:Linux server1 2.6.32-358.el6.x86_64#1 SMP

CPU型号:Intel(R)Xeon(R)CPU E7-4820 @2.00Ghz;

4颗cpu,每颗cpu物理核数为8,总物理核数为32,逻辑核数为64

内存:125G

磁盘:289G

Erlang OTP:Erlang/OTP 17[erts-6.0][source][64bit][smp:64:64][async-thread:10]

測试过程

Erlang并发进程

測试代码

-module(test).

-export([start_proc/1]).

start_proc(Num) ->

case Num =:= 0 of

true -> ok;

false -> spawn(fun()-> loop() end),start_proc(Num-1)

end.

loop() -> loop().

Cpu执行状况

test:start_proc(1000000)启动1000000个进程后,运行mpstat –PAll 2 10

并发IO

測试代码

-module(testio).

-export([start_proc/1]).

name() ->

{A,B,C} =erlang:now(),

Integer_to_list(A) ++Integer_to_list(B)++Integer_to_list(C).

io() ->

{ok,Fd} = file:open(“./data/”++name(),[write,raw,binary,append]),

file:write(Fd,”Hi zcc,nice to meet you”),

file:read(Fd,23),

file:close(Fd).

start_proc(Num) ->

IO = fun()-> io() end,

case Num =:= 0of

true ->ok;

false-> spawn(IO),timer:sleep(1),start_proc(Num-1)

end.

Linux下查看内核相关信息

vmstat –n 3每隔3s刷新一次

利用sar进行cpu利用率的分析  sar  –u  2  10

分析执行进程队列长度sar  –q  2   10

cpu %usr %nice%sys %iowait %irq %soft %steal %guest %idle

mpstat  –P  1:查看1号cpu的信息

%steal:虚拟cpu无意识等待时间百分比

%nice:cpu处在带有nice值的user模式下时间百分比

top –M 后按下F键,然后按j,回车,可看到进程在哪个核上执行

结论

(1)             在默认情况下Erlang的smp的调度进程schedualer是与cpu的核相应的,而不是与cpu的个数相应的,就如本环境下有4个cpu,32个物理核,开启超线程后为64个逻辑核,调度进程数为64;

(2)             当erlang并发多个进程后,通过cpu的负载能够看出,各个进程会均匀的分布在各个核上执行,而不会是某个核负载过大,某个核负载过小的情况发生,此件事情是有操作系统来做的,程序猿无须关心;

(3)             Erlang虚拟机的内存会随着进程数的添加,自己主动从主机内存中申请添加,这与java虚拟机不同,jvm1.6曾经内存不会自己主动添加内存,仅仅能手动配置添加jvm内存,从1.7以后才可以共享物理主机内存;Erlang虚拟机没有抑制内存增长机制。虚拟机不断的分配内存,迫使系统不得不使用交换区,直到虚拟机内存耗尽,变得很迟钝。Erlang虚拟机设计的‘私有堆’和基于队列的编程模型是长处也是缺点,当在生产环境下执行erlang虚拟机时,要配备一个系统级的检測,以便在erlang内存使用量飞涨时,可以杀死进程。

(4)             Erlang调度器执行于一个OS线程,由OS决定其是否执行在一个核上,一般来说,OS会保证线程在执行期间执行于一个核上;

(5)             估算一个系统的进程数上限=内存总量/erlang:process_info(self(),memory),得到erlang的wordsize=erlang:system_info(wordsize).Erlang中一个进程所占内存大概为2667字节。

(6)             測试结果


启动进程数


虚拟机内存


启动时间


10万


299M


12.3s


100万


2.7G


6.8s


1000万


27.2G


57.6s


55164851


132G


400s

时间: 2024-10-01 05:16:13

Linux下多核环境Erlang的SMP測试的相关文章

Linux下多核环境Erlang的SMP测试

目标 (1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响: (2)       Erlang虚拟机的内存增加机理: (3)       Erlang进程的调度情况: (4)       Linux下监控cpu的使用状况 实验环境 联想小型机:操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本:Linux server1 2.6.32-358.el6.x86_64#1 SMP CPU型号

hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. vi /etc/profile 在profile文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_H

Linux下的环境变量

1,何为环境变量 用户成功登录后,启动shell的过程中,定义一些和用户的工作环境有关的变量 2,查看Linux的环境变量可以使用命令:env 常用的环境变量有以下几个: HOME:用户的家目录的完整路径名. LOGNAME:登录用户名. IFS:命令行内部域分隔符,即白空格. PATH:由冒号分隔的路径名.shell将按PATH变量中给出的顺序搜索这些目录,从中查找要执行的命令.找到的第一个与命令 名称一致的可执行文件将被执行. OLDPWD:刚刚离开的目录. TERM:终端的类型. PWD:

Linux下PHP环境安装具体步骤

Linux下 PHP环境安装 您需要以下安装包: 1.     字体引擎,freetype-2.1.10.tar.gz 2.     JPEG 图形库,jpegsrc.v6b.tar.gz 3.     PNG图形库,libpng-1.2.8-config.tar.gz 4.     数据压缩库,zlib-1.2.3.tar.gz 5.     加密算法扩展库,libmcrypt-2.5.7.tar.gz 6.     PHP的源码包,php-5.3.3.tar.gz6 确保您的安装linux环

Linux下设置环境变量

setenv(set environment variable) 功能说明:查询或显示环境变量.语 法:setenv [变量名称][变量值]补充说明:setenv为tsch中查询或设置环境变量的指令. 对于bash shell关 于环境变量命令介绍:1.echo 显示某个环境变量值 echo $PATH2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号)3.env 显示所有环境变量4.set 显示本地定义的shell变量5.unset 清除环

linux下java环境变量的设置,形参个数可变的方法

首先我们执行jdk二进制文件: 生成一个jdk目录,将这个目录mv到/usr/loca/jdk # vim /etc/profile export JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PAT# vim Varargs.java #source /etc/profile 例子: #vim test.java 这个例子中test方法形参个数可变,在形参列表中,最后一个形参

14行脚本配置Linux下Java环境变量

对于Java初学者而言,可能在Java开发环境的配置上要花一番功夫,而在Linux下,配置Java的环境变量,这个功夫可能又会增加.为此,我编了一个bash脚本来实现自动配置Java的环境变量.你只需要将如下脚本和你下载的jdk压缩包放到一个文件夹下,执行该脚本,并依据提示输入一些信息即可. config_java.sh #!/bin/bash jdkpath=/usr/lib/java/ sudo mkdir $jdkpath read -p "Please input the name of

linux下配置环境变量方式

linux下配置环境变量有多种方式,下面简述之 方式1.编辑 /etc/profile 文件,增加如下内容 JAVA_HOME=/usr/local/jdk1.8 export JAVA_HOME PATH=$PATH:$JAVA_HOME/bin export PATH 方式2:编辑 /etc/bashrc 文件,方式同上 方式3:在 /etc/profile.d 目录增加文件,例如:jdk.sh,内容同上 方式4:在用户目录/root下修改.bash_profile文件或者修改.bashrc

linux 下PATH环境变量

环境变量简介 什么是环境变量呢?简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件. 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现"command not found"的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了.这涉及到环境变量 PATH 的设置问题. 查看当前系统下有哪些环境变量的方法: echo $PATH 环境变量设置 注意: 添加多个环境变量时,不同的环境变量之间使用冒号分隔开: l