目标

(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

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

  1. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...

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

    Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种 ...

  3. 记一次Linux下JavaWeb环境的搭建

    今天重装了腾讯云VPS的系统,那么几乎所有运行环境都要重新部署了.过程不难懂,但是也比较繁琐,这次就写下来,方便他人也方便自己日后参考参考. 我采用的是JDK+Tomcat的形式来进行JavaWeb初 ...

  4. 实验二:Linux下Xen环境的安装

    实验名称: Linux下Xen环境的安装(centOS7) 实验环境: 本次实验基本是在centOS7的环境下完成,系统内核和系统版本如下: 实验要求: 为centOS7的环境下安装Xen的平台,能够 ...

  5. linux下php环境的装配以及php storm的链接

    linux下php环境的装配以及php storm的链接 本次安装在deepin系统下完成 一.安装LAMP组合 Linux+Apache+Mysql+php 直接命令 sudo apt-get in ...

  6. linux下配置环境变量方式

    linux下配置环境变量有多种方式,下面简述之 方式1.编辑 /etc/profile 文件,增加如下内容 JAVA_HOME=/usr/local/jdk1. export JAVA_HOME PA ...

  7. linux 下PATH环境变量

    环境变量简介 什么是环境变量呢?简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件. 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现&quo ...

  8. linux下LAMP环境搭建

    ++++++++++++++++++++++++++++++++++++++++++++++ linux下LAMP环境搭建 ++++++++++++++++++++++++++++++++++++++ ...

  9. 环境变量解释以及在Linux下的环境变量设置

    一.环境变量解释 环境变量是什么? 引用百度百科里面的解释:环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows系统中的path环境变量,当要求 ...

随机推荐

  1. MySql 取一天的开始时间和结束时间

    -- 取一开的开始时间 SELECT str_to_date(DATE_FORMAT(NOW(),'%Y-%m-%d'),'%Y-%m-%d %H:%i:%s'); -- 取第二天的开始时间 sele ...

  2. 【转】【漫画解读】HDFS存储原理

    根据Maneesh Varshney的漫画改编,以简洁易懂的漫画形式讲解HDFS存储机制与运行原理. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下: Client:客户端,系统使用者,调用 ...

  3. Centos6.4在配置Tomcat7工作文件夹和虚拟路径

    写在前面:网上博文非常多复制粘贴.我试过很不可能.所以我写了下面的测试版本. 1.tomcat设备 非常easy只需要下载tomcat7 tar包裹 运行命令:tar -zxvf tomcat-7.5 ...

  4. CSS入门教程——定位(positon)

    CSS入门教程——定位(positon) CSS定位在网页布局中是起着决定性作用.   定位 CSS的定位功能是很强大的,利用它你可以做出各种各样的网页布局.本节就介绍一些CSS常用的定位语句. 1. ...

  5. Android studio教程:[5]活动的生命周期

    想要学好安卓开发,就必须理解安卓软件的生命周期,明白一个活动的创建.启动.停止.暂停.重启和销毁的过程,知道各个阶段会调用什么函数进行处理不同的情况,这里我就通过一个简单的例子让大家明白一个活动的生命 ...

  6. java面对对象 关键字this super

    this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象 其实this主要要三种用法: 1.表示对当前对象的引用! 2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是 ...

  7. org.springframework.beans.factory.BeanCreationException

    org.springframework.beans.factory.BeanCreationException 这个是创建bean的异常. 我所遇到的情况是由下面这个引起的: @Resource an ...

  8. Android Studio默认产生Fragment

    package com.edaixi.fragment; import android.content.Context;import android.net.Uri;import android.os ...

  9. python GUI学习——Tkinter

    支持python的常见GUI工具包: Tkinter 使用Tk平台 很容易得到 半标准 wxpython 基于wxWindows.跨平台越来越流行 Python Win 只能在Windows上使用 使 ...

  10. I/O事件

    I/O事件 最近在研究tornado和gevent,里面涉及了非阻塞I/O.在了解非阻塞I/O之前,需要先了解I/O事件 我们知道,内核有缓冲区.假设有两个进程A,B,进程B想读进程A写入的东西(即进 ...