登录站点

用户名

密码

c/c++ 高性能服务器开发工程师应该注意的几点。

已有 1467 次阅读  2013-07-01 14:12
工作几年,总结的做高性能兵发服务器的时候需要注意的几点内容。以下内容不限定于一个平台。WINDOWS LINUX都是通用的。转载请注明出处。

1.性能除了代码,硬件水平,系统平台也可决定。甚至差别很大。
   我做个这样一次测试,为了验证我们内存池性能,我机器是 CORE I3 双核心4线程,系统是UBUNTU 12.04LTS,服务器是至强处理器4核心8线程,用的是CENTOS5.4,内存一样,1亿次申请内存和释放,普通的系统MALLOC FREE 服务器用时9秒多,而我机器只用4秒多。所以,别只追求稳定性而认为新版本有问题就放弃用,新版本正是为了解决这写问题而出的。
2.鱼和熊掌不可兼得,我们应该如何选择-时间复杂度与空间复杂度。
    这里已经是2013年下半年了,对于内存条来说,已经是按斤来买了。内存对于我们来说,真不是问题,在服务器硬件上,早就是几G或者几十G内存了。对于我们来说,我们不用考虑嵌入式内存很吃紧的情况,没有谁会把服务器放到嵌入式下运行,如果你要这样说,那我只能说你写的不是服务器程序。只是一个简单的应用。内存效率快,在很多时候,我们快速相应的服务,或者游戏服务器都需要做到同步响应机制。所以,别在为了那点内存空间让用户等太久。
3.文件操作全部映射到内存。
   这里和上面那条其实差不多,写在这里,主要还是看各位的需求。但是一般的,数据库查询操作,文件都写操作,你都需要映射到内存中在操作,能不与文件IO打交道就尽量不要打交道。文件IO是跟不上我们内存效率的,如果你直接操作文件IO,会导致你的线程阻塞,导致响应变慢。
4.服务器不需要睡觉,所以抛弃SLEEP吧。
  很多年前,我们在学习网络开发或者多线程的时候,我们总会看到在线程函数内部WHILE末尾有个SLEEP,书上说这是为了防止CPU占用100%的情况,这也的确能解决。但是SLEEP会让我们的程序让出CPU资源,这在服务器开发是忌讳,我们的服务器不可能有休眠的时间。你SLEEP,会阻塞下一条任务,导致用户响应问题。
5.池很重要,永远优先选择
  LINUX和WINDOWS的内存管理机制有很大区别,在WINDOWS下不用内存池,运行一两天,你可能看不出什么差别,在LINUX下,你可能运行一天就挂了。LINUX FREE并不会真正回收给系统,这样会导致你系统内存占用出现恐怖的情况,甚至导致OUT OF MEMORY等错误。
  线程池同样,所以,内存池和线程池是服务器开发当中必然存在的。
6.慎重选择开源库
  选择XML解析库,那么多,你应该怎么选择,很多人可能会大呼,TINYXML啊,那我只能告诉你,你的选择会影响你的系统运行。
  TINYXML使用的确方面,面向对象的C++接口,所以操作的高度封装,方便了我们这些懒程序员。但是TINYXML的效率很慢,永远不要听从别人所说的,每一个,你都应该亲自验证,选择适合的。不要盲目跟随。
7.诶,这里多线程操作一个资源,需要加锁。
  对于服务器多线程共同访问一个资源,我们习惯了pthread_mutex_t 或者 WINDOWS临界区来加锁。但是很多时候,根据我们代码或者业务流程,数据结构等不同,很多时候可以不用加锁,甚至不应该用保护区的方式来加锁,什么时候用原子锁,什么时候用读写锁,我们都应该区分开来,不要为了图个方便,全部使用保护区的方式来加锁,这会让我们程序效率极端慢,甚至有的初级程序员加锁导致多线程犹如单线程一样。我们需要对锁有个深刻的认识,并且了解我们的业务流程,选择最适合的锁才能帮助你提升系统性能!
8.如果你实在没法完全明白前辈们留下的代码且性能很差,请你重写。
   服务器开发需要对你的服务器底层逻辑,业务处理流程有深刻的认识,甚至你可以随便打开一段代码都能清楚的知道他的输入和输出是什么,它这里是做的什么动作。如果不是,你改的代码只会让服务器程序性能更差,问题更多。
分享 举报