欢迎来到天天文库
浏览记录
ID:30396903
大小:95.22 KB
页数:14页
时间:2018-12-29
《【转】高性能服务器架构》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、【转】高性能服务器架构【转】高性能服务器架构2011-07-0212:09原文名字叫做High-PerformanceServerArchitecture写的非常不错的文章,在"thec10kproblem"那个文章也有提到,估计很多人都看过了。我觉得里面说的很多东西都是很多价值的,至少我之前不了解这方面的东西,这种好文章应该早点看到才好啊!因为我那个项目结束了,周五有点空闲时间,本着能够加深理解以及仔细阅读的目的(我经常看东西都是刷刷扫一下,然后学一下基本概念),就尝试着翻译一下。结果发现翻译文章真是太费劲
2、了,花了好多时间,集中精力忙乎了好几次才能弄完,下次再也不搞这种东西了,精力有限,水平有限啊,没看一下不懂得单词还要去查一下字典。在公司里面,因为水平太菜了。老被叫去参加英语培训,还要做翻译作业,我这也算是响应公司的号召吧。这篇文章应该网上早有人翻译过了,不过我翻译的时候没有去核对他的。个人水平有限,可能会有些地方理解的不是很到位,有能力的尽量去看英文原文吧,我这只是为了好玩顺便消磨一下时间而已。另外,希望这种翻译不会引起什么版权问题什么的,看看作者文章的第一句话,应该会放过我吧^_^简介写这篇文章的目的是为
3、了分享我在多年积累起来的一些关于如何为服务器开发各种应用程序的见解,在这里"服务器"这个术语仅仅是一个近似的说法。更准确的说,我要写的是关于各种为了每秒要处理大量消息/请求而设计的程序.通常大多数网络服务器都符合这个定义,但有些程序并不是真正意义上的服务器。虽然是这样,但为了简单起见,同时因为"高性能请求处理程序"是一个糟糕的标题,我们下面就只说"服务器"了。我要写的不是关于"优雅并行处理"应用,虽然在一个程序中实现多任务现在已经非常常见了。你用来阅读这篇文章的浏览器就是并行的例子,但是这样底层的并行概念没有
4、什么吸引人的挑战。吸引人的挑战发生在那些影响整体性能的处理请求的基础设施上,所以改进这些设施就改进了性能。通常不是指一个浏览器运行于千兆赫的处理器和一G内存的机器上通过DSL线同时进行6路下载的情况。我们关注的不是那种通过吸管一小口的喝而是使用消防管畅饮的应用,在那种快要达到硬件容量极限的时候,你如何去做是至关重要的。肯定会有些人对我的解释和建议有不同的看法,或者他们有更好的做法。好了,我不是在这里传递上帝的旨意,这只是我自己找到的可行的办法,不仅仅是一些影响性能的方面也有关于影响代码可调试性和扩展性的方面。
5、你有你自己的想法。如果你有更好的办法,那非常好,不过我想告诉你的是,我在这文章里面的所有建议都是通过比较其他糟糕办法的结果得出来的。你那些奇技淫巧也许在某些地方有着显著的作用,但如果你要我也把那些也说出来的话,那些读者一定无聊到死。你也不想伤害读者,不是吗?文章的剩下部分主要就是说我把它叫做造成低劣性能的"四大骑士"。数据复制上下文切换内存申请锁竞争最后有个总结,不过最大的性能杀手就是这几个了。如果你处理大多数请求时不复制数据、不用上下文切换、不用申请内存、不用为了锁而竞争,那么你就拥有一个性能不错的服务器了
6、,即使你在其他小的方面做得差一些。数据复制这可以是非常短的一节,有个简单的原因:大多数人都已经学过这一课了。所有人都知道数据复制是糟糕的,很明显,不是吗?但,实际上,它只是看起来明显因为你在计算机的生涯的很早时候,几十年前就听一些人提到过。我自己也是这样,有点跑题了。当前,所有的学校课程、非正式的how-to文档都会覆盖到这个了。甚至"零拷贝"都成为一个流行词了。虽然重申复制的坏处显而易见只是马后炮,但还有一些微妙之处被人漏掉了。最重要的是数据复制往往被隐藏和掩盖起来了。你知道你调用的那些驱动或者库里面是如何
7、做数据复制的吗?比如在PC机上的"ProgrammedI/O"指的是什么呢。另外一个数据复制被掩盖而不是隐藏的例子是散列函数(译注:哈希函数?都对吧),它不但有复制一样的内存开销而且还有一些额外的计算。一旦指出散列实际上是"复制外加"(译注:就是说做的比单纯的复制要还多的工作),好像很明显应该避免使用它,但我知道有相当的一部分人还是很难理解这一点。如果你想完全摆脱数据复制,不管是因为它真正影响了性能还是你想把"零拷贝操作"写到你的黑客会议的演讲稿里面去,你都要去统计所有的真正的做了数据复制的操作,而不是到处做
8、广告。真正可靠的避免复制数据的办法是间接使用,用传递内存描述符(或者是内存描述符的链)来取代单单的内存指针。典型的描述符有下面这些组成:一个指向整块内存的指针和一个指针指向内容的长度,两个属性指针加长度,或者偏移加长度,用来描述真正占用内存的部分前向和后向的指向其他描述符链表指针引用计数现在,不用复制一段数据以确保它是在内存里面的,代码可以简单的改为增加相应内存描述符上面的引用计数。这在一些情况下可
此文档下载收益归作者所有