2015/08/21

来源:互联网 发布:ajax json 提交 java 编辑:程序博客网 时间:2024/05/22 20:51

隔了很久没有写博客,其中一个原因是项目任务比较多,大量的精力和时间都花在理解业务,完成需求上, 必须一心专用。另一个原因就是自己觉得有些技术原理的理解还很不成熟,觉得写出来似乎并不能给不别人带来多大的帮助。但其实博客是一个不断累积自己技术的地方,将记录和心得都记录下来,可以借助写博客来让自己思考,反思这段时间所做的事情,这样坚持的时间久了,形成一种习惯,对以后的成长非常有利的。


最近项目处于性能优化期,这个时期对于开发者的要求其实还是蛮高的,不仅仅要求开发者仅仅只是了解皮毛,如果仅限于功能的实现,更深入的优化是很难做到的。该游戏服务器的六个分布式的服务器,底层的socket网络架构其实可以归结为一类,一套网络架构在不断的复用,封装底层的socket接口后,去掉阻塞态,利用select或者epoll事件触发机制,完成对socket的数据传输,然后数据在业务层进行解析,整个过程实现得非常巧妙,但底层的socket数据发送和接受过程,却必须要非常小心,里面包含了大量的容易导致隐晦错误的地方。因为在发送数据的时候,先在一帧里将业务层的数据写到一个缓冲区中,然后将缓冲区内记录到的数据进行发送,这样就节省了read和write的次数,对于服务器的连接数和负载都有提升。


但在底层的socket封装层,有头坐标和尾坐标指定一个窗口,在这窗口中的数据是有效的,头坐标和尾坐标在缓冲区中循环移动,一旦出现头坐标和尾坐标重合,那么接受到的参数,将被赋值为0, 在socekt通信中,在recv的时候,一旦接收的参数为0,该线程将陷入死循环,一直在接收。日志记录里,曾记录有超越十分钟的死循环数据,然后被管理线程强行断开。这种错误是非常隐晦的,必须对socket函数簇以及tcp/ip协议都非常了解。linux系统发生socket错误,机制是对全局的errrno变量进行赋值,errno中记载了内核的错误信息,但是该错误信息包含的信息量非常的少,用strerror打印出后,仍然不足以定位真正的问题所在。argument out of domain, broken pipe, unreachable pipe, 以及诸如此类的,属于tcp/ip协议的报错,errno返回的还都是0, 尤其是当客户端主动断开socket时,服务器端仍然会再次接收到一次数据,但这次接收到的数据长度为0, strerror后,显示的是success,属于主动断开连接,但这种情况依然占据了大量的错误记录,但可以认为这种报错是正常范围内的,例如玩家主动关闭浏览器,就会对页游服务器造成这种后果。


在做物理引擎的环境模拟时,因为要分割出不同线程,然后才能模拟出客户端和服务器的不同处理,算是把整个服务器的架构又搭建了一遍。趁着这个机会,把posix的多线程处理又重新温习了一遍,上学时候虽然也针对线程同步做了大量的练习,但毕竟都处于小demon阶段,这次将线程同步机制引入了项目,互斥量、条件变量、原子锁,信号量暂时没有引入,信号量的机制,其实与项目的需求不太相符,值得一提的是原子锁,如果另一个线程无法获取原子锁,该线程并不会进入阻塞状态,而且依然保存在就绪队列里,参与下一次调度,但互斥量和信号量,如果无法获取锁,则会引发进入阻塞态,当获得锁的条件符合后,再从阻塞队列中移入就绪队列,这个过程会有状态切换的性能损失。


从这段时间开始,算是一个回朔的过程吧,把以前的知识都串联起来,结合现在的项目经验,对以前学过的知识加深理解。计算机网络,网络机制,socket协议族,这些理解得更深刻了,尤其值得一提的是对于linux内核的解读,虽然从大二起就对着0.11版本的源码和相应的《 linux内核源码解析》的书不断的分析,而且将linux网络源码解析相关的书都拿来看,但随着时间的流逝,细节已经开始模糊起来,但处理整个服务器之后,从linux内核角度看服务器的运行,对于linux的内核机制有了非常清晰的认识,对于内核的进程调度,内存管理,结合着服务器的运行,能够从理论走向实际,这都是很宝贵的经验。


算法导论现在开始重读第三遍了,中间了掺杂了很多别的关于算法分析的书,像《实用算法分析与程序》这样赤裸裸的刷题的书,倒是很实用,但是算法导论对于算法的推导过程非常详细和看重,而这才是算法和数据结构的精髓,知其然并且知其所以然。并且,算法导论的习题,设计得都相当精彩,多思考多练习,对于算法的功力会不断提升的。


至于大厅服务器用到的NoSql型数据库MongoDB, 目前还处于会用阶段,对于内部的机制,性能调优,以及更高的进阶,都还需要不断的学习和锤炼,但千里之行始于足下,不断的反思和总结,对这种NoSql的驾驭水平会达到另一个高度的。


似乎只有在探讨技术的时候才能感觉到内心的平静,可能这也是我对linux如此狂热的原因吧,像一个宝藏一样能源源不断的获取对技术更深层次的实现,虽然经过了这么久的磨砺,但依然是怀有宗教般的狂热,奥耶~

0 0
原创粉丝点击