• 服务器开发


      最近一直在做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占用。来处理和运算。或者是交互。

    下班了。以后再写。未完待续。。。 

  • 相关阅读:
    python : 将txt文件中的数据读为numpy数组或列表
    ROS :为IDE配置环境变量
    ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin
    ROS 教程之 vision : 用各种摄像头获取图像
    ROS 教程之 network:多台计算机之间网络通信(2)
    MS sql 查询动态表名的方法
    把ocx打包成CAB,并签名
    DataSet 转换成List
    C# 反序列化datetime的处理
    PSP软件开发过程管理
  • 原文地址:https://www.cnblogs.com/xingyayang/p/1800912.html
Copyright © 2020-2023  润新知