为了测试下erlang的多smp能够每秒并发发起多少系统调用,这个关系到erlang作为网络程序在高并发下的评估。
首先crack下otp_src,因为erlang:now() 是调用了clock_gettime这个系统调用,但是遗憾的是这个now里面设计到很多mutex会导致不可预期的futex调用,所以需要做如下修改,
调用最廉价的getuid系统调用:
emacs otp_src_R13B/erts/emulator/beam/erl_bif_info.c
BIF_RETTYPE statistics_1(BIF_ALIST_1)
{
Eterm res;
Eterm* hp;
if (BIF_ARG_1 == am_context_switches) {
Eterm cs = erts_make_integer(erts_get_total_context_switches(), BIF_P);
hp = HAlloc(BIF_P, 3);
res = TUPLE2(hp, cs, SMALL_ZERO);
BIF_RET(res);
} else if (BIF_ARG_1 == am_ok) { /* Line 2713 */
getuid();
BIF_RET( am_ok);
} else if (BIF_ARG_1 == am_garbage_collection) {
...
}
重新make下otp_src
[root@localhost ~]# cat tsmp.erl
-module(tsmp).
-export([start/1]).
loop(I, N)->
%% erlang:now(),
%% os:timestamp(),
erlang:statistics(ok), %% call getuid
case N rem 100000 of
0 ->
io:format("#~p:~p~n", [I, N]);
_->
skip
end,
loop(I, N + 1).
start([X])->
N = list_to_integer(atom_to_list(X)),
[spawn_opt(fun () -> loop(I, 0) end, [{scheduler, I}]) || I <-lists:seq(1, N)], %%未公开参数 把进程绑定到cpu上 亲缘性
receive
stop ->
ok
after 60000 ->
ok
end,
init:stop().
#otp_src_R13B02/bin/erl -sct db -s tsmp start 8
。。。
#7:226500000
#1:228000000
#8:152600000
#5:150200000
#4:225600000
#3:222000000
#2:224000000
#6:226400000
#7:226600000
#1:228100000
#4:225700000
#8:152700000
#3:222100000
对其中一个调度器线程的trace
[root@wes263 ~]# /usr/bin/strace -c -p 4667
Process 4667 attached - interrupt to quit
PANIC: attached pid 4667 exited with 0
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.87 0.230051 0 3979319 getuid
0.08 0.000189 0 1924 poll
0.05 0.000116 0 1924 clock_gettime
0.00 0.000000 0 147 48 futex
------ ----------- ----------- --------- --------- ----------------
100.00 0.230356 3983314 48 total
调用序列是非常的合理的
机器配置是:
[yufeng@wes263 ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Xeon(R) CPU E5450 @ 3.00GHz
stepping : 10
cpu MHz : 1998.000
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
bogomips : 5988.98
clflush size : 64
cache_alignment : 64
address sizes : 38 bits physical, 48 bits virtual
power management:
8个核心。
1分钟 erlang发起了getuid()系统调个数 ecug的8核心机器 222,100,000 × 8个核心 = 1700M 合每秒30M个系统调用
结论是:如果合理安排的话 erlang的性能是非常高的 同时可以利用到erlang的smp的巨大优势。
分享到:
- 2009-08-26 13:50
- 浏览 4107
- 评论(2)
- 论坛回复 / 浏览 (2 / 2100)
- 查看更多
相关推荐
Erlang是一门专为并发计算设计的编程语言,提供了高效的轻量级进程模型以支持高并发应用。... 在《Erlang并发编程》一书...对于希望深入理解Erlang并发模型和构建可靠并发系统的开发者来说,这是一本不可或缺的参考资料。
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和容错系统。在Erlang中实现客户端服务器模型是其广泛应用的关键之一,尤其是在大规模并发场景下,如网络通信...
解耦:A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的...
Erlang是一种并发性极强的函数式编程语言,常用于构建分布式系统。 博文链接提供的内容可能是一个关于Erlang中Socket编程的实例,其中遇到了一些错误。首先,我们来看一下`chat_client.erl`,这很可能是客户端的...
Erlang是一种函数式编程语言,特别适合用于并发、分布式计算和容错系统。Erlang以其轻量级进程、消息传递机制和强大的错误恢复能力著称,这使得它在构建高可用性、高并发的网络服务时表现出色。 ### RCP客户端与...
Erlang是一种并发和实时系统设计语言,常用于构建高可用性的分布式系统。`generic_server`很可能是一个行为模块,它定义了服务器的行为模式,如接收连接、处理请求和返回响应等。 2. `echo_server.erl`:这个名字...
Erlang 是一种面向并发的编程语言,因其在分布式系统、容错和实时通信方面的优秀特性而被广泛应用,尤其是在电信和互联网基础设施领域。 在深入探讨 http-erl 的知识点之前,先来理解一下 Erlang 的核心概念。...
Erlang的并发模型和轻量级进程特性,使得gen_http在处理大量并发请求时表现优秀。同时,Erlang的简洁语法和强大的字符串处理能力,使得处理HTTP协议变得相对简单。 然而,需要注意的是,由于gen_http是实验性的,其...
然后,`riffed`会自动生成Elixir代码,这些代码可以被引入到服务端(处理Thrift请求)和客户端(发起Thrift调用)中。开发者可以按照Elixir的惯用法来调用Thrift服务,就像操作本地函数一样。 **总结** `riffed`是...
- **使用Erlang语言**:Erlang具有高并发性能,适用于构建实时通信应用的服务器。 - **准备工作**:安装Erlang环境,了解Erlang语言基础。 - **具体实现**:设计信令流程,实现消息收发功能。 - **使用Java语言*...
Elixir是一种基于Erlang VM(BEAM)的函数式编程语言,以其并发性、容错性和可扩展性而闻名。选择Elixir作为实现Binance API包装器的语言,是因为它能够高效地处理大量并发请求,这对于高频交易和实时数据处理非常...