如何提升服务器系统性能(转)
众所周知,在服务器系统的开发上,对性能要求是很高的,特别在大批量并发中,服务器系统的性能就体现的尤为重要,常常会有人问:为啥我的CPU消耗那么大,为啥我的事务处理那么慢,执行效率无法提高等等此类的问题。那怎么提高系统的性能呢,联系目前的工作,对此谈谈看法。
1、服务器系统架构的不合理。
服务器在设计时,必须考虑整个系统架构的高效、稳定,高的可靠性和可用性。这点我深有体会,在最近的一个项目中,由于服务器需要接受大批量小数据的多客户端并发请求,对服务器的业务处理提出了挑战。原先的设计采用的了串行业务处理流程,结果导致服务器大量业务堆积,造成丢包现象异常严重。经过讨论后,为了提高服务器的业务处理能力,采用了生产者——消费者模型,在业务上来时,直接进队,然后返回,继续接受下一个请求,缩短通信的滞留时间。然后多条业务线程从队列取业务,加快业务处理速度,这样就有效的提高了服务器处理业务的能力。
2、通信协议的不合理。
对于大批量小数据多客户端并发,可以考虑用UDP协议,由于UDP是一种无连接传输协议,可以有效的降低系统开销,特别对大批量小数据的请求,效果明显,而TCP在这种情况对系统的消耗是很大的,往往会导致连接被拒绝,或者socket句柄已经存在的错误。有人可能就会问了,在服务端可以采用短连接,这样就可以节约资源。其实不然,大量socket的创建与销毁本来就是一种对系统性能的极度消耗,有时这种还没有直接使用长连接来的效率高。
在目前的P3项目就有体现,原本我们采用的就是TCP连接,当时并发量一直提不上去,而且在大量并发下,系统出现Socket的错误,资源消耗及其大,所以之后采用UDP协议,而TCP作为备用方案,来防止UDP的不可靠性。
3、大批量的内存创建、销毁,以及一切有关内存的操作都会影响到系统性能
这点对小量的并发,体现的并不明显,但是在大量并发下,这就会性能造成严重影响,这种内存的创建,销毁,以及内存的COPY等会消耗掉系统50%~60%的性能。对这种情况,尽量在系统启动时,创建好内存资源,然后再业务处理完后,回收资源,重新利用,切忌在大量业务处理时,new新的内存,处理完后,又delete内存资源,这样对系统性能消耗及其大。
另外,对于自定的协议包处理,尽量少用涉及到内存copy操作的函数或者类型,比如memset,string等,这样在打包与解包时,都会对系统性能造成影响。