marioTcp
https://github.com/nicholaszj/marioTcp
MarioTCP
MarioTCP 是使用libevent模型来建立的一个性能强大的TCP服务器.
1:Getting Started
用MarioTCP来建立一个性能强大的TCP服务器非常简易.工程源码下有一个非常简洁的例子:
- mario.c:是简单的main程序:
- 1:直接make编译出maritcp,一个TCP服务器;
- 2:业务逻辑是:统计在线的socket的数量,每1分钟输出一次;
- test文件夹:简陋的客户端测试程序:
- 1:与服务器建立连接、发送LOGIN包登陆服务器;
- 2:maritcp服务器会使同时在线加1,客户端断开时服务器在线数减1;
###2:如何定制一个自己业务逻辑的tcp服务器 ### ####2.1 初始化Server####
- SERVER *server = init_server(conf->port, conf->workernum, conf->connnum, conf->timeout, conf->timeout);
- 参数
- port: 服务器Listen端口;
- workernum: 工作线程数;
- connnum: 每个线程支持的连接数;
- timeout: 读超时时间;
- timeout: 写超时时间。 ####2.2 实现业务逻辑函数并注册####
- 具体业务逻辑函数请见Function模块。可通过mario.h中定义的名为“regist_*”的函数来注册。
- 例子:
- 注册业务处理函数
void regist_akg_func(uint16 id, FUNC_PTR func);typedef enum _CMD { CMD_FUNCTION_BASE = 0x6100, CMD_FUNCTION_LOGIN = 0x6101 } CMDid可以是0-65535的任意数,此id封装在MarioTCP的协议中(见本文最后)。 id的范围,可以根据业务逻辑来定制,例如maritcp通过protocol.h中定义的CMD结构体来设定,如上代码.
- --你想为maritcp增加一个"say_hello"的服务
- 1)在CMD中增加:
CMD_FUNCTION_SAY_HELLO = 0x602 - 2)在function中增加函数:
sint32 say_hello(CONN c) { I)通过CONN来解析客户端发过来请求的参数 II)将“hello”设定到c->out_buf III)bufferevent_write(c->bufev, c->out_buf, hrsp->pkglen); IV)return 0; } - 3)在mario.c中增加:
regist_akg_func(CMD_FUNCTION_SAY_HELLO, say_hello);
####2.3 启动日志线程####
- maritcp增加一个线程start_log_thread()
####2.4 启动服务器####
- OK,一个可以支持100万甚至更多长连接的TCP服务器,诞生了!
为什么高效
1:网络服务用到的所有结构体和内存都是启动程序时初始化的,无销毁,无回收。无销毁好理解,不解释。无回收,是指所有内存单元拿来即用,用完及可,不用做reset操作。
2、一个master线程进行accept经过测试发现多进程或线程进行accept和一个进程或线程accept,在极限压力下区别不大。一个master比多个master好在不用再通过锁来解决同步问题。
3、master与worker时单一生产者消费者模式,完全无锁通信不光accept无锁,分配connection、后续的conncetion处理都是无锁的。甚至业务逻辑(见示例maritcp的统计在线数功能)、MarioTCP的日志系统(这也是日志系统抽象不够的一个原因,之前的设计太依赖于整体架构了)都是无锁处理的!
4、一个worker一套libevent环境libevent处理10万长连接的网络读写事件,其性能达到最大化了。每个worker都独立一套libevent,这个结构经过测试,发现开销很小、性能很高。
测试环境的搭建
单机百万长连接、四万CPS(连接每秒)如何做测试
1、设置系统最大文件数为unlimited
2、设置系统的tcp内存内核参数到256M以上
3、设置系统的ip到15个,那么可服务的长连接数理论上最少15*(65535-1024)个
4、用epoll或libevent开一个可同时连接5w的客户端程序;程序还要实现每秒随机挑选1000个连接断掉,并再新创建1000个连接。另外在随机挑选几千连接发包。
5、设置服务端可重用SYN_WAIT的连接;客户端断连接的方式是主动断掉(防止客户端程序端口堆积)
marioTcp的更多相关文章
- MarioTCP:一个单机可日30亿的百万并发长连接服务器
原文:http://blog.csdn.net/everlastinging/article/details/10894493 注:如果用此服务器做变长data的传输,请在业务处理函数中为input ...
- MarioTCP, take it..
MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩.同时他可以是一个很简洁的Linux C 开发学习工程.毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人:当然 ...
随机推荐
- Plus and Square Root
ZS the Coder is playing a game. There is a number displayed on the screen and there are two buttons, ...
- 优先队列底层实现是堆(heap)(操作系统进程调度)
只有一个CPU的情况下,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行(删除),并且也可以添加一个新的作业到作业的优先队列中(插入). 插入操作 ...
- k8s PersistentVolume hostpath 简单使用
kubernets host PersistentVolume 测试 因为yaml 格式的问题 ,我修改为了json 创建 pv pv.json { "kind": "P ...
- IT项目管理的十六个字心得体会
目标驱动,系统思维,风险意识,数据量化 凡事预则立,不预则废.如果你不知道要到哪里?给你一张地图也没有用.目标驱动首先要有最基本的计划管理和时间管理能力.对于一个项目,我们过程中做的所有工作都是为了要 ...
- 什么是HBase(六)性能调优
硬件层面 内存要大,最好是ECC(Error Checking and Correcting),实现内存的动态纠错:CPU要多路(每个路彼此隔离)每个路一个CPU,每个cpu上面一般都是2~12核. ...
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据 (转)
http://www.cnblogs.com/yukaizhao/archive/2010/05/13/linq_to_sql_1.html LINQ和 LINQ to SQL 都已经不是一个新事物了 ...
- angular指令的详细讲解,不断补充
独立作用域:就是在指令中设置了scope: **** ·false 共享父作用域 ·true 继承父作用域,并且新建独立作用域 ·object 不继承父作用域,创建新的独立作用域 一般来说我们会使用第 ...
- [转]Docker 为什么这么火
本文来自:Docker为什么这么火 以及此文:http://cloud.51cto.com/art/201408/447966_1.htm Docker 我的理解是,相对于 VMware 的一个分支. ...
- 1027代码审计平台 1-sonar scanner
1.代码审计 1.1综合性的代码分析平台 sonar支持自定义规则,较多的公司使用 360火线 1.2IDE辅助功能 Xcode.Android studio 阿里巴巴Java开发手机ide插件支持 ...
- Samba服务创建共享文件系统
Linux 系统中的Samba Linux系统中的Samba服务器又提供了另外一种技术来弥补这种安全性的不足的技术,那就是采用账户映射方式为Samba服务器提供虚拟账户(不与Linux系统中的用户账户 ...