资源描述:
《《高性能服务器架构》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、高性能服务器架构高性能服务器架构2011-06-0221:44任何一行都有自己的军规,我想这篇著名的文章就是游戏服务器程序员的军规.也许你认为游戏服务器程序员日常并不涉及这样底层的实现,而只是去完成策划提出的需求,我觉得也有道理,毕竟这些是我们的工作,下面的译文就不太适合你.但是对于想改进现有系统,在服务器方面给予更好的技术支持,那么你在开始工作之前必须了解一些禁忌,并且给出了一些解决方向上的真知灼见.把它发在这里,供随时复习.下面给出一个我阅读的摘要和感受:1)数据拷贝DataCopies--技巧什么的2)环境切换ContextSwitches--理性创建线程3)内存分配
2、Memoryallocation--内存池4)锁竞争Lockcontention--没有好的办法,和具体的业务特点以及软件的设计结构有密切的联系可以看出,1~3问题通过软件技术,分析是比较容易解决的,并且已经有一些成熟的现成的解决方案和实现.但是问题4完全不是这个样子的.本质上,前3个问题都比较精确的描述了具体问题,可以针对性解决.而第四个问题的麻烦之处是它是一个元问题,但是真正的问题只有在设计和编码的时候才由这个元问题制造出来.除非你已经设计和实现了自己的软件系统,否者问题只是存在于理论中.而引发它出现的原因是你的设计,这时你想解决这个问题只有推翻你自己的设计,这通常是不
3、可接受的.但是现实就是这样,这就是为什么4号问题是最难解决的.现在的编程语言都是串行模型,连编译器都是认为:我编译的源码肯定是串行的,以至于它会将inti=1;while(i){do;}优化成while(true){do;}呵呵,除非你用一个volatile来修饰i.这给编写并发程序带来特别特别多的困难.现在的新语言go,erlang已经开始慢慢在语言层面原生支持并发,我相信这就像以前的gc一样,在以后的不久,将成为主流:)但是上面的4号问题是嵌入在问题域本身的,它和软件工程想解决的问题是在一起的,也就是说对4号问题,很可能也没有银弹.下面是从网上转的译文,文中重要点用不同
4、的颜色标记出来了.High-PerformanceServerArchitecture引言本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或者请求的服务程序,网络服务器更符合这种情况,但并非所有的网络程序都是严格意义上的服务器.使用"高性能请求处理程序"是一个很糟糕的标题,为了叙述起来简单,下面将简称为"服务器".本文不会涉及到多任务应用程序,在单个程序里同时处理多个任务现在已经很常见。比如你的浏览器可能就在做一些并行处理,但是这类并行程序设计没有多大挑战性.真正的挑战出现在服务器的架构设计对性能产生制约时,如何
5、通过改善架构来提升系统性能.对于在拥有上G内存和G赫兹CPU上运行的浏览器来说,通过DSL进行多个并发下载任务不会有如此的挑战性.这里,应用的焦点不在于通过吸管小口吮吸,而是如何通过水龙头大口畅饮,这里麻烦是如何解决在硬件性能的制约.(作者的意思应该是怎么通过网络硬件的改善来增大流量)一些人可能会对我的某些观点和建议发出置疑,或者自认为有更好的方法,这是无法避免的.在本文中我不想扮演上帝的角色;这里所谈论的是我自己的一些经验,这些经验对我来说,不仅在提高服务器性能上有效,而且在降低调试困难度和增加系统的可扩展性上也有作用.但是对某些人的系统可能会有所不同.如果有其它更适合于
6、你的方法,那实在是很不错.但是值得注意的是,对本文中所提出的每一条建议的其它一些可替代方案,我经过实验得出的结论都是悲观的.你自己的小聪明在这些实验中或许有更好的表现,但是如果因此怂恿我在这里建议读者这么做,可能会引起无辜读者的反感.你并不想惹怒读者,对吧?本文的其余部分将主要说明影响服务器性能的四大杀手:1)数据拷贝DataCopies--技巧什么的2)环境切换ContextSwitches--理性创建线程3)内存分配Memoryallocation--内存池4)锁竞争Lockcontention--没有好的办法,和具体的业务特点,软件的设计结构有密切的联系在文章结尾部分
7、还会提出其它一些比较重要的因素,但是上面的四点是主要因素.如果服务器在处理大部分请求时能够做到没有数据拷贝,没有环境切换,没有内存分配,没有锁竞争,那么我敢保证你的服务器的性能一定很出色.数据拷贝DataCopies本节会有点短,因为大多数人在数据拷贝上吸取过教训.几乎每个人都知道产生数据拷贝是不对的,这点是显而易见的,在你的职业生涯中,你很早就会见识过它;而且遇到过这个问题,因为10年前就有人开始说这个词。对我来说确实如此.现今,几乎每个大学课程和几乎所有how-to文档中都提到了它.甚至在某些商业宣传册中,"零