最近一直在做C++(windows sdk)的服务器开发。项目的主要性能指标为100个客户端,每隔50ms发送一个数
据包,持续发送10000个数据包。100个终端的启动间隔为50ms,测试通过。接收数据没有性能瓶颈,在进行解码的时
侯也没有性能瓶颈,最后发现在数据库的插入操作上出现了性能瓶颈。测试100个客户端发送完成时间为9分钟左右,解
码时间 基本持平。但是数据库插入时间滞后5到7分钟。数据库的插入操作采用的是odbc。目前采用线程池。启动10个
线程。服务器能达到7*24小时的连续运行要求。
针对两个月的服务器开发进行回顾。并做了一下总。
1,服务器的接收模型分为tcp,udp两种。针对这两种一般的可以考虑如果是udp可以采用循环接收加上线程池处理
来进行处理。基本可以达到较高的接收性能。多用于数据包比较小。对数据敏感度不高的情况。对于tcp可以采用循环加
线程池的方式也可以处理小数据包。这种情况多见于数据包小,密集,数据比较敏感的情况。
2,针对服务器的处理可以分为io密集型和计算密集型。当出现io密集型的时候io就成为主要的性能压力。可以考虑
两种方式来处理(针对windows)。一,采用windows的iocp模型。这种模型的原理基于异步io操作和系统线程池组合。
具体的实现在网上有很多的例子。但是需要注意一下几点:
a;对于用户自定义的数据Per_io_Data的第一项为overlapped。可以通过指针的转换来获取到更多的数据。数据包可以
通过这个自定义结构传递。但是要求在线程池处理完成之后不能释放这个结构,可以采用GlobalAlloc来申请。
b;乱序的问题。需要在协议中加序号。
c;恶意攻击问题。需要及时的检测。暂时未处理。
这种模型据说是windows的最优化的高性能服务器。还有一种方法。个人认为性能上可以还能提升。就是通过直接获取
网卡的数据进行处理。也就是用winwcap来进行处理,这需要自己写线程池,自己做整个的架构。在windows和*iux下
都可以实现。
针对计算密集型需要的是简单的接收但是要求长时间的cpu占用。来处理和运算。或者是交互。
下班了。以后再写。未完待续。。。