介绍两个封装erlang网络模块的项目,gs_tcp和ranch并且提供一些测试数据。

项目主页

gs_tcp

这个项目没有提供太多什么有用功能,纯粹就是封装了erlang启动listen的过程,将这些细节做了隐藏,使用方只要提供一个回调start_reader(Sock)即可。

ranch

从cowboy的项目代码看到这个网络底层的,功能完善方面,远远大于gs_tcp,支持ssl和socket连接池(gs_tcp只实现了accept的连接池,连接的管理交给用户,默认是建议使用sup管理即可),模块化。ranch的作者认为socket连接池使用sup比较重,可能是指短连接。经过我的测试,发现如果只是10W规模的连接管理的话,sup还是绰绰有余的,并不是瓶颈所在,作为游戏服务器,单机跑到10W在线的时候,内存或者其他(如数据库读写)会先暴露出瓶颈。

其他具体可以看看官方项目说明。

echo测试

测试环境是100M LAN,i5 4核,8G内存的PC,测试代码就不公开了,在公司现有的项目做了些小改动,直接测试,网络底层用的是ranch(已经放弃gs_tcp了),提供一些数据仅供参考就是了。

频率低

60000连接
每秒一个10字节的包
300% cpu
上下行流量总和 55Mb

频率高

12000连接
每0.1秒一个10字节的包
300% cpu
上下行流量总和 96Mb

结论

看到这个数据之后,我觉得我们超级飞侠单机撑个三万并发应该问题不大了,作为一款休闲游戏,我们的交互频率没有高到每秒一次交互。但是实际运行数据,只能过段时间再看看了。

不过,意外看到有人用erlang测试C1500k,感觉碉堡了。不过我们并不是做推送的,而且暂时手上并没有24核的服务器可以拿来做测试,所以看看作者提供的数据就好了。

只能说Erlang做网络IO,在正确使用下,在大多数情况下,是完全够用的。万一有性能问题,就要怀疑自己是不是打开方式不对。

沿伸阅读