优化设计:
程序优化涉及到很多方面,一般有开发语言优化(随着开发语言不断升级,会有很多新语法的优化)、程序逻辑的优化(算法优化,使用不同的数据结构等)、设计的优化(比如使用某种设计模式,提高程序的可扩展性)还有一些通用做法(异步并发、并行等),
这里只总结常用优化手段:
1、异步并发(回调、协程)充分利用cpu时间分片,充分利用cpu的能力
2、并行(线程池、多进程)利用cpu多核的性质
一般服务器开发的瓶颈都是在IO(socket收发、访问磁盘、访问数据库等)、大量计算(矩阵运算等)
(1)socket 收发一般使用epoll+消息缓存,解析消息并根据设置消息命令+处理函数进行回调处理
(2)访问磁盘比如说写日志:一般会写入消息队列,然后开辟多个线程同时操作队列,如何进行日志落地
(3)访问数据库,数据库请求端会封装成一个work,绑定消息处理回调函数 mAsynCallBack<workid, functor>
(4)数据库处理端: 一般会设置连接池,一个保存工作队列(保存增删改查),一个完成队列,等待发送给请求端
socket通信、访问磁盘、访问数据库 这些通常都是慢操作,一般需要内存队列+线程池+异步(绑定回调)的方式处理信息
(5)大量计算:一般是算法的优化,或者利用内存,都在内存中运算,优化存储结构 ,cache 上行或者下行请求(禁止多次快速重发消息)。
网络游戏服务器注意事项,优化措施
1:IO操作是最大的性能消耗点,注意优化余地很大。
2:算法数据结构。排序寻路算法的优化。list,vector,hashmap的选择。大数据寻址,不要考虑遍历,注意考虑hash.
3:内存管理。重载new/delete,内存池,对象池的处理。
4:数据的提前准备和即时计算。
5:CPU方面的统计监视。逻辑帧计数(应当50ms以内)。
6:预分配池减少切换和调度,预处理的线程池和连接池等。
7:基与消息队列的统计和信息监视框架。
8:CPU消耗排名:第一AOI同步,第二网络发包I/O操作,第三技能/BUFF判定计算处理,第四定时器的频率。
9:内存泄露检测,内存访问越界警惕,内存碎片的回收。
10:内存消耗排名:第一玩家对象包括其物品,第二网络数据缓冲。
11:注意32位和64位的内存容错。
12:减少不必要的分包发送。
13:减少重复包和重拷贝包的代价。
14:建议分紧急包(立刻发送)和非紧急包(定时轮训发送)。
15:带宽消耗排名:第一移动位置同步,第二对象加载,第三登陆突发包,第四状态机定时器消息。
16:客户端可做部分预判断机制,部分操作尽量分包发送。
17:大量玩家聚集时,部分非紧急包进行丢弃。
18:注意数据库单表内key数量。
19:活跃用户和非活跃用户的分割存取处理。
20:控制玩家操作对数据库的操作频率。
21:注意使用共享内存等方式对数据进行安全备份存储。
22:注意安全策略,对内网进行IP检查,对日志进行记录,任意两环点内均使用加密算法会更佳。
23:实时注意对网关,数据库等接口进行监察控制。
24:定时器应当存储一个队列,而非单向定位。
25:九宫格数据同步时,不需要直接进行九宫格的同步,对角色加一个AOI,基于圆方碰撞原理,抛弃不必要的格信息,可大幅节省。
26:客户端做部分的预测机制,服务器检测时注意时间戳问题。
27:定期心跳包,检查死链接是必要的。
28:为了实现更加负责多种类的AI,AI寻路独立服务器设计已经是必须的了。其次需要考虑的是聊天,同步。
29:服务器内网间可以考虑使用UDP。
30:注意所有内存池,对象池等的动态扩张分配。
1:以内存换取CPU的理念。
2:NPC不死理念。(只会disable)
3:动态扩展理念,负载均衡理念。
4:客户端不可信理念。
5:指针数据,消息均不可信理念。
6:尽量在客户端进行最严格的校验,挡住无谓的请求
7:能放在客户端的功能,放在客户端实现,服务器进行校验即可
附上一个博主写的很好的linux服务器性能优化的地址:https://blog.csdn.net/hguisu/article/details/39373311