免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7189 | 回复: 10
打印 上一主题 下一主题

[其他] erlang是如何模拟多线程的 [复制链接]

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-18 20:25 |只看该作者 |倒序浏览
本帖最后由 快乐的土豆 于 2013-07-18 20:30 编辑

同一台服务器,同一台运行测试程序的客户机,
用某个erlang写的工具测,它能够维持上10万个连接(具体什么连接我也不清楚,lz不会erlang,但是那个工具说那么多),
我用c语言写的一个小程序,用10000个线程去不断地请求,libcurl就疯狂的报告
curl_easy_perform() failed: Failure when receiving data from the peer
或者类似的错误

测试的客户机只有4个core.

erlang是怎么做到的?或者,c程序该怎么写才能达到erlang同样的效果?


===============================
另一个疑问,这个erlang的程序,运行的时候能够将负载均衡的分配到4个核上,能够看到4个核负载在任何时候都差不多,但是我写的那个破程序,只有一个核繁忙,其它的都空闲......
这个又该如何改进?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-07-18 21:34 |只看该作者
C实现的话要多线程才能使用多核, 单线程只会用1个核。

erlang是虚拟机执行的,进程是虚拟机之内的概念。

一个服务能承载多少连接取决于内核网络参数配置,服务器内存,与服务器性能没有关系,100万个连接一样能Hold住,关键看连接是不是空闲着,100万空闲连接可以轻松做到。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
3 [报告]
发表于 2013-07-18 22:45 |只看该作者
回复 1# 快乐的土豆

创建那么多线程,系统不用干别的了光线程间的切换就消耗了大半CPU, erlang的process和系统的process并不是一一对应的,其实可以理解为用户态线程与coprocess的组合体,erlang高效的实现了其process之间的通间与调度,至于具体对应多少个系统的thread or process是由erlang解释器决定的。

不管是服务器还是客户端连接数与进程或线程数不是一对一的关系,这是最低效且不可扩展的。
   

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
4 [报告]
发表于 2013-07-19 09:28 |只看该作者
当然,这道理我也懂,问题是,erlang或者它的解释器(虚拟机)或者啥的,如何将这10w个连接映射到有限的几个linux用户态线程,然后在4个物理core上面均衡的执行.

我的方法是1万个用户态线程,让linux去管理线程切换竞争,显然,从结果看,很差.
那么erlang怎么做的?难道是仅仅生成了4个用户态线程,然后自己去调度10w和这4个映射?如果真是这样的话,只能说明一点,erlang的调度算法写得比linux好很多,这个结论,我不觉得是真的.
要么,erlang使用了4个linux线程,然后每个线程里面打开了若干个tcp连接,事实上我也确实在服务器端看到了如此多的tcp连接,同样的问题是,如何管理这么多tcp连接,同样是一个调度的问题.

所以,我觉得,要么erlang的这个映射规则非常巧妙,要么erlang的调度算法真心nb.

还请更多熟悉erlang细节的朋友指点.

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-07-19 10:17 |只看该作者
回复 4# 快乐的土豆


    你那不叫用户态线程,NPTL的thread实现用户态线程和内核态线程是一对一的关系,就是说你使用pthread_create创建了一个线程那么用户态和内核态都会有一个绑定到一起的线程。用户态线程就是不使用系统的功能在用户态模拟的线程(一个系统线程下有N个用户态线程),如果你还搞不清楚你可以看看什么叫纤程,

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
6 [报告]
发表于 2013-07-19 12:20 |只看该作者
不管它叫什么名字,穿什么马甲,erlang程序能做的,也不过是 pthread_create(),或者fork()对吧,

感兴趣的是, erlang 用什么算法去映射或者调度.

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [报告]
发表于 2013-07-19 13:39 |只看该作者
回复 6# 快乐的土豆

non-SMP支持的Erlang VM只有1个运行在主处理线程中的调度器。该调度器从运行队列(run-queue)中取出可以运行的Erlang进程以及IO任务,而且因为只有一个线程访问他们所以无须锁定任何数据。

而带有SMP支持的Erlang VM可以有一个或多个调度器,每个调度器运行在一个线程中。调度器从同一个公共运行队列中取出可运行的Erlang进程和IO任务。在SMP VM中所有的共享数据结构都会由锁进行保护,运行队列就是这样一个由锁保护的数据结构。

从OTP R12B开始,如果操作系统报告有多于1个的CPU(或者核心)VM的SMP版本会自动启动,并且根据CPU或者核心的数量启动同样数量的调度器。

你可以从“erl”命令打印出来的第一行看到它选择了哪些参数。例如:

Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] …..
其中“[smp:4]”表示SMP VM运行了4个调度器。

默认值可以用“-smp [enable|disable|auto]”来替换,auto是默认的。如果smp被启用了(-smp enable),要设置调度器的数量可以使用“+S Number”其中Number是调度器的数量(1到1024)

注意1:运行多于CPU或核心总数的调度器不会有任何提升。

注意2:在某些操作系统中一个进程可使用的CPU或者核心的数量可以被限制。例如,在Linux中,命令“taskset”就可以实现这个功能。 Erlang VM目前还只能探测CPU或者核心的总数,不会考虑“taskset”所设置的掩码。正因如此,例如可能会出现(已经出现过了)即使Erlang VM运行了4个调度器,也只使用了2个核心。OS会进行限制因为它要考虑“taskset”所设置的掩码。

每个Erlang VM的调度器都运行于一个OS线程上,是OS来决定线程是否执行在不同的核心上。一般来说OS会很好地处理这个问题并且会保证线程在执行期间运行于同一个核心上。

Erlang进程会被不同的调度器运行,因为他们是从一个公共运行队列中被取出,由首先可用的调度器运行。

   
这儿有详细的说明:http://www.erlang.se/euc/08/euc_smp.pdf

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
8 [报告]
发表于 2013-07-19 13:54 |只看该作者
linux_c_py_php 发表于 2013-07-18 21:34
C实现的话要多线程才能使用多核, 单线程只会用1个核。

erlang是虚拟机执行的,进程是虚拟机之内的概念。 ...

这个语言真的这么牛吗? C都没他快?

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
9 [报告]
发表于 2013-07-19 13:55 |只看该作者
感觉你们都好渣啊, 人家用虚拟机都比你裸奔跑的快啊

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
10 [报告]
发表于 2014-06-30 12:32 |只看该作者
erlang是语言本身支持并发,每个连接一个用户态进程来维护的。 最多维护数除了操作系统本身的线之外, erlang本身的也有参数控制 process_limit

c写的话,用epoll 轻松可以hold 一万连接吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP