高性能服务器c开发库-minac工作笔记

背景
Gleasy部分高性能中间件(比如分布式nosql集群cloudRedis,使用JAVA),经过线上一段时间的验证,发现在CPU占用方面始终偏高,而且nosql集群本身并无复杂的业务逻辑,多数情况下都是直接PROXY到后端的redis。出于对性能的的严苛要求,决定使用C对cloudRedis进行重构。在重构的过程中,由于cloudRedis的java版基于mina2,特别是codec环节大量依赖于IoBuffer和IoSession这两个类,确实十分好用。因此衍生出来使用c语言实现完整的mina2接口的想法,借鉴MINA2本身的优秀设计,避免了很多弯路,最终实现了一套完整的开发库,为了对mina2致敬,取名为minac。

minac介绍
minac基于epoll,使用event-loop-per-thread结构,IO thread个数默认为Cpu的核数。
熟悉mina2的同学基本上拿过来就可以直接使用,没有任何学习成本。
以下是提供的一些基本类库
1. iobuffer
完整实现了java的IoBuffer类,所有方法跟java版兼容(所有写入buf的基本类型会被被转换为big endian的,读出时会转换回系统支持的endian模式)提供了以下方法:

extern iobuffer_t *iobuffer_create(int32_t);
extern void iobuffer_destroy(iobuffer_t *);
extern void iobuffer_set_auto_expend(iobuffer_t *,int flag);
extern void iobuffer_set_auto_shrink(iobuffer_t *,int flag);
extern void iobuffer_set_increment(iobuffer_t *,int32_t);

extern void iobuffer_flip(iobuffer_t *);
extern void iobuffer_compact(iobuffer_t *);
extern void iobuffer_clear(iobuffer_t *);
extern int32_t iobuffer_set_position(iobuffer_t *,int32_t);
extern int32_t iobuffer_get_position(iobuffer_t *);
extern int32_t iobuffer_set_limit(iobuffer_t *,int32_t);
extern int32_t iobuffer_get_limit(iobuffer_t *);
extern void iobuffer_skip(iobuffer_t *,int32_t);

extern int32_t iobuffer_remaining(iobuffer_t *);
extern int32_t iobuffer_put_int(iobuffer_t *,int32_t);
extern int32_t iobuffer_get_int(iobuffer_t *,int32_t *);
extern int32_t iobuffer_put_double(iobuffer_t *,double);
extern int32_t iobuffer_get_double(iobuffer_t *,double *);
extern int32_t iobuffer_put_long(iobuffer_t *,int64_t);
extern int32_t iobuffer_get_long(iobuffer_t *,int64_t *);
extern int32_t iobuffer_put(iobuffer_t *,char *,int32_t);
extern int32_t iobuffer_get(iobuffer_t *,char *,int32_t);
extern int32_t iobuffer_put_by_read(iobuffer_t *,int fd,int32_t);
extern int32_t iobuffer_get_and_write(iobuffer_t *,int fd,int32_t);
/**
 * 从src中获取内容写入另一个www.111cn.net dest
 * 注意:此函数不支持src和dest为同一个iobuffer的情况
 */
extern int32_t iobuffer_put_iobuffer(iobuffer_t *dest,iobuffer_t *src);

2. iosession
实现了mina2的IoSession基本功能,主要接口如下:

extern iosession_t *iosession_create(int connfd, mina_session_config_t *sessionConfig);
extern void iosession_destroy(iosession_t *session);
extern int iosession_write(iosession_t *session, iobuffer_t *buf);
extern int iosession_write_wait(iosession_t *session, iobuffer_t *buf,int seconds);
extern int iosession_close(iosession_t *session);
extern int iosession_flush(iosession_t *session);

3. socket_acceptor
实现了mina2的IoSocketAcceptor类,主要接口如下

extern mina_socket_acceptor_t* mina_socket_acceptor_create();
extern void mina_socket_acceptor_destroy(mina_socket_acceptor_t *acceptor);
extern int mina_socket_acceptor_bind(mina_socket_acceptor_t *acceptor,struct sockaddr_in *addr);
extern void mina_socket_acceptor_unbind(mina_socket_acceptor_t *acceptor);

4. socket_connector
实现了mina2的IoSockectConnector类,主要接口如下:

extern mina_socket_connector_t* mina_socket_connector_create();
extern void mina_socket_connector_destroy(mina_socket_connector_t *acceptor);
extern iosession_t *mina_socket_connector_connect(mina_socket_connector_t *acceptor,struct sockaddr *addr);
extern void mina_socket_connector_stop(mina_socket_connector_t *acceptor);

5. socket_handler
实现了mina2的IoSocketHandlerAdaptor,定义如下:

typedef void (*_messageReceived)(iosession_t *,iobuffer_t *);
typedef void (*_messageSent)(iosession_t *,iobuffer_t *);
typedef void (*_sessionCreated)(iosession_t *);
typedef void (*_sessionOpened)(iosession_t *);
typedef void (*_sessionClosed)(iosession_t *);
typedef void (*_exceptionCaught)(iosession_t *,mina_exception_t *);
typedef void (*_sessionIdle)(iosession_t *,mina_iosession_idle_t );

typedef struct mina_socket_handler_t{
 _messageReceived messageReceived;
 _messageSent messageSent;
 _sessionCreated sessionCreated;
 _sessionOpened sessionOpened;
 _sessionClosed sessionClosed;
 _exceptionCaught exceptionCaught;
 _sessionIdle sessionIdle;
}mina_socket_handler_t;

6. session_config
实现了mina2的SessionConfig,主要接口如下:

typedef struct mina_session_config_t{
 int readBufferSize;
 int minReadBufferSize;
 int maxReadBufferSize;
 int writeBufferSize;
 int minWriteBufferSize;
 int maxWriteBufferSize;

 int tcpNoDelay;
 int sendBufSize;
 int revBufSize;

 int readerIdleTime;//time in sec
 int writerIdleTime;//time in sec
}mina_session_config_t;

extern mina_session_config_t *mina_session_config_create();
extern void mina_session_config_destroy(mina_session_config_t *);

7. 使用例子:
用几句代码就轻松实现服务器程序:

#include "minac.h"
#include "common.h"
#include <zlog.h>

static void messageReceived(iosession_t *session,iobuffer_t *buf){
 //dzlog_info("接收到一行,size:%d",iobuffer_remaining(buf));
 int32_t remaining = iobuffer_remaining(buf);
 if(remaining>0){
  iobuffer_t *rbuf = iobuffer_create(remaining);
  iobuffer_compact(rbuf);
  iobuffer_put_iobuffer(rbuf,buf);
  iobuffer_flip(rbuf);
  iosession_write(session,rbuf);
  iobuffer_destroy(rbuf);
 }
}

static void messageSent(iosession_t *session,iobuffer_t *buf){
 //dzlog_info("写了www.111Cn.net数据,size:%d",iobuffer_remaining(buf));
}
static void sessionClosed(iosession_t *session){
 //dzlog_info("session is closed.%d",session->connfd);
}
static void sessionOpened(iosession_t *session){
 //dzlog_info("session is opened.%d",session->connfd);
}
static void exceptionCaught(iosession_t *session,mina_exception_t *exception){
 dzlog_info("exception met, code:%d, messag:%s",exception->errorCode,exception->errorMessage);
 iosession_close(session);
}
static void sessionIdle(iosession_t *session,mina_iosession_idle_t idleType){
 //dzlog_info("session idle, fd:%d, idleType:%d",session->connfd,idleType);
}
static void exit_handler(void *arg){
 mina_socket_acceptor_t *acceptor = (mina_socket_acceptor_t *)arg;
 mina_socket_acceptor_unbind(acceptor);
}
extern void test_acceptor(){
 mina_socket_acceptor_t *acceptor = mina_socket_acceptor_create();
 acceptor->sessionConfig->tcpNoDelay = 1;
 acceptor->sessionConfig->readerIdleTime = 2;
 acceptor->sessionConfig->writerIdleTime = 2;

 acceptor->socketHandler->messageReceived = messageReceived;
 acceptor->socketHandler->messageSent = messageSent;
 acceptor->socketHandler->sessionOpened = sessionOpened;
 acceptor->socketHandler->sessionClosed = sessionClosed;
 acceptor->socketHandler->exceptionCaught = exceptionCaught;
 acceptor->socketHandler->sessionIdle = sessionIdle;

 register_exit_handler(exit_handler,(void *)acceptor);

 struct sockaddr_in servaddr;
 servaddr.sin_family = AF_INET;
 servaddr.sin_port = htons(6666);
 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

 mina_socket_acceptor_bind(acceptor,&servaddr);
}

熟悉mina2的人,基本上对上面的代码极为熟悉了。

性能如何
功能上面是好用了,性能如何呢?以echo server为例,性能测试结果如下:

熟悉mina2的人,基本上对上面的代码极为熟悉了。

性能如何
功能上面是好用了,性能如何呢?以echo server为例,性能测试结果如下:
1. 实验1(400客户端)

400并发客户端,TPS最大41万,平均18万,CPU占用164%

2. 实验2(1000客户端)

1000并发客户端,TPS最大55万,平均30万,CPU占用169%

原文来自:Gleasy团队博客

 

时间: 2024-09-01 23:22:34

高性能服务器c开发库-minac工作笔记的相关文章

服务器-开发Android游戏类型不一样是不是用的Qp_lib开发库也不一样啊

问题描述 开发Android游戏类型不一样是不是用的Qp_lib开发库也不一样啊 开发Android游戏类型不一样是不是用的Qp_lib开发库也不一样啊,我现在导入一个斗地主手游但是登陆不进去,显示服务器链接超时,而且只有qp_lib和qp_net很小,是不是没有QP_lib库的原因

腾讯互娱技术总监:不止于思路,谈高性能服务器架构之道

在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖点而广为人知.然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及.本文正式希望介绍服务器端解决性能问题的基本策略和经典实践,并分为几个部分来说明:   缓存策略的概念和实例 缓存策略的难点:不同特点的缓存数据的清理机制 分布策略的概念和实例 分布策略的难点:共享数据安全性与代码复杂度的平衡     1 缓存  1)缓存策略的概念   我们提到服务器端性能问题的时候,往往会

第十八章-Delphi客户服务器应用开发(二)(2)

BDE在设计上是面向对象的.在运行时,数据库应用通过建立各种类型的BDE 对象与BDE交互,这些运行的对象用于操作数据库实体如数据库表.查询.BDE的扩展的API支持C.C++.Delphi等对数据库引擎的访问. 在Delphi应用程序中访问数据库是通过调BDE的API函数.Delphi在库单元BDE中提供了大约三十多个API函数和各种BDE消息和结构.由于Delphi应用程序的开发是基于部件的,有关BDE API的调用都嵌入了Delphi可视部件类库,因此,建立数据库应用时可以不必管BDE A

分享十款最出色的PHP安全开发库中文详细介绍

  1. PHP入侵检测系统 开发库中文详细介绍-芭提雅6996详细介绍"> PHP IDS(即PHP-入侵检测系统)是一套易于使用.结构良好.速度出色且专门面向PHP类Web应用程序的先进安全层.这套入侵检测系统既不提供任何缓和及杀毒机制,也不会对恶意输入内容进行过滤,其作用单纯为识别出攻击者们针对站点进行的恶意活动.并以大家需要的方式作出及时提醒.凭借着一整套经过实践检验及相当严格的过滤规则,该检测系统会针对任何攻击活动给出一个影响评级数值,从而帮助用户更轻松地了解应如何应对当前出现的

《Linux高性能服务器编程》——导读

前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的知识,基本没有自己的观点,甚至连一点自己的总结都没有.反观大师们的经典书籍,整本书只专注于一个问题,而且对每个技术细节的描述都是精雕细琢.最关键的是,我们在阅读这些经典书籍时,似乎是在用心与一位编程高手交流,这绝对是一种享受. 我们把问题缩小到计算机网络编程领域.关于计算机网络编程的相关书籍,不得不

linux socket高性能服务器处理框架

思考一种高性能的服务器处理框架 1.首先需要一个内存池,目的在于: ·减少频繁的分配和释放,提高性能的同时,还能避免内存碎片的问题: ·能够存储变长的数据,不要很傻瓜地只能预分配一个最大长度: ·基于SLAB算法实现内存池是一个好的思路:分配不同大小的多个块,请求时返回大于请求长度的最小块即可,对于容器而言,处理固定块的分配和回收,相当 容易实现.当然,还要记得需要设计成线程安全的,自旋锁比较好,使用读写自旋锁就更好了. ·分配内容的增长管理是一个问题,比如第一次需要1KB空间,随着数据源源不断

想做高性能web应用开发,求大神指导

问题描述 本人大学生,学习javaweb开发,掌握了Struts.springmvc.springsecurity.spring核心和hibernate等开发框架.并且掌握了一些web前段开发技术.目前想着手学习开发高性能的web应用,有一下问题请教各位大神:1.10万并发量以下的web应用,要优化性能,主要应该专注哪方面?钻研java语言机制,提高代码质量?钻研数据库,优化数据库访问?还是专注http.tcp方面?2.听老师说,nginx对静态资源访问的性能提升明显.我想知道,对于没有做高性能

高性能服务器的分布式设计

何为高性能服务器 服务器分类 目前的高性能服务器,大家耳熟能详的有很多,这里对通用的做了分类:http服务器:nginx, apachejava http容器:tomcat, jettyjava 服务器框架: jetty, mina 其中nginx/apache/tomcat已被用于各大在线业务,按各使用场景来看功能,可概览如下: 也可将这些功能分为基本与扩展.基本功能:请求过滤,静态处理,长短连接,规则配置,动态容器,内容压缩.扩展功能:负载均衡,反向代理, 容器. 为什么需要扩展功能 概括一

第十八章-Delphi客户服务器应用开发(一)(1)

客户/服务器的开发工作涉及定义客户/服务器的体系结构, 然后再将该结构与其它一些对于客户/服务器的实现至关重要的系统结构和技术集成起来.Delphi 2.0的Client/Sever版支持用户开发客户/服务器结构的应用程序.本章中我们将阐述客户服务器体系结构原理.如何用Delphi构建客户/服务器的环境和Delphi存取远程SQL服务器的编程和注意事项. 18.1 Delphi客户/服务器应用开发原理 18.1.1 客户/服务器体系结构 18.1.1.1 体系结构概述 客户/服务器系统的体系结构