erlang节点间通信使用erlang send 和使用gen_tcp socket性能的对比(
2013-06-21 11:51
423 查看
在erlang开发中使用erlang send是比较方便的,但是性能相比使用socket会有多大的损失呢。
测试程序:
客户端:
1.使用erlang send 发送1M次数据,每次一个整数
2.使用gen_tcp连接,发送1M次数据,每次一个整数
服务器端:
基于ranch socket框架,开发简单的socket server (https://github.com/extend/ranch)
测试结果:
erlang send 大概在15k op/t
socket大概在40k op/t
从测试结果看,性能还是有比较大的差异,真是没有免费的午餐,erlang socket直接是使用port dirver,而erlang send在port driver前加了一层,使用ltrace跟踪发送10000数据的结果:
使用socket:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
27.13 10.751451 228754 47 poll
27.08 10.732349 2683087 4 syscall
12.53 4.963527 1328 3735 pthread_mutex_unlock
12.25 4.853343 435 11146 pthread_getspecific
6.66 2.640606 660151 4 read
6.30 2.496726 1277 1955 memcpy
5.06 2.005021 100251 20 strlen
2.37 0.939892 258 3639 pthread_mutex_lock
使用:
erlang send:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
19.17 10.809368 5404684 2 syscall
19.15 10.797144 568270 19 poll
18.84 10.620922 1034 10262 pthread_mutex_lock
13.93 7.851441 1082 7250 pthread_getspecific
8.96 5.049468 422 11948 pthread_mutex_unlock
8.89 5.010258 5010258 1 read
5.88 3.316019 642 5162 memcpy
4.31 2.431020 1441 1686 pthread_mutex_trylock
从数据看,erlang send比直接使用socket在锁的开销方面大了很多。
结论:
erlang节点通信,erlang rpc在一般情况下性能是足够的,如果要更强的性能,可以考虑使用
socket,多点开发量,能带来不少的性能提升。
测试程序:
客户端:
1.使用erlang send 发送1M次数据,每次一个整数
2.使用gen_tcp连接,发送1M次数据,每次一个整数
服务器端:
基于ranch socket框架,开发简单的socket server (https://github.com/extend/ranch)
测试结果:
erlang send 大概在15k op/t
socket大概在40k op/t
从测试结果看,性能还是有比较大的差异,真是没有免费的午餐,erlang socket直接是使用port dirver,而erlang send在port driver前加了一层,使用ltrace跟踪发送10000数据的结果:
使用socket:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
27.13 10.751451 228754 47 poll
27.08 10.732349 2683087 4 syscall
12.53 4.963527 1328 3735 pthread_mutex_unlock
12.25 4.853343 435 11146 pthread_getspecific
6.66 2.640606 660151 4 read
6.30 2.496726 1277 1955 memcpy
5.06 2.005021 100251 20 strlen
2.37 0.939892 258 3639 pthread_mutex_lock
使用:
erlang send:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
19.17 10.809368 5404684 2 syscall
19.15 10.797144 568270 19 poll
18.84 10.620922 1034 10262 pthread_mutex_lock
13.93 7.851441 1082 7250 pthread_getspecific
8.96 5.049468 422 11948 pthread_mutex_unlock
8.89 5.010258 5010258 1 read
5.88 3.316019 642 5162 memcpy
4.31 2.431020 1441 1686 pthread_mutex_trylock
从数据看,erlang send比直接使用socket在锁的开销方面大了很多。
结论:
erlang节点通信,erlang rpc在一般情况下性能是足够的,如果要更强的性能,可以考虑使用
socket,多点开发量,能带来不少的性能提升。
相关文章推荐
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
- iOS -- Socket (TCP 、UDP)即时通信 -- (XMPP使用更为广泛)
- 使用TCP/IP的套接字(Socket)进行通信
- 使用JAVA实现Socket通信,TCP、UDP简析。
- Socket通信——TCP、UDP区别总结、使用场景
- nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置
- nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
- erlang gen_tcp 聊天室(holl节点)
- 使用TCP/IP的套接字(Socket)进行通信
- Socket使用TCP/IP如何实现通信
- python网络编程之TCP通信实例和socketserver框架使用例子
- nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置
- CocoaAsyncSocket网络通信使用之tcp连接(一)
- Python网络编程之TCP通信实例和socketserver框架使用例子
- 使用TCP/IP的套接字(Socket)进行通信
- CocoaAsyncSocket网络通信使用之tcp连接(一)
- tcp通讯的方式并使用socket建立客户端与服务器的通信的过程
- python网络编程之TCP通信实例和socketserver框架使用例子
- 使用TCP/IP的套接字(Socket)进行通信