扼杀服务器性能的10条戒律(转,接前文)

服务器|性能

应该分配和释放多个对象

你应该尽量避免过量分配内存,因为内存分配可能是代价高昂的。释放内存块可能更昂贵,因为大多数分配算符总是企图连接临近的已释放的内存块成为更大的块。直到Windows NT? 4.0 service pack 4.0,在多线程处理中,系统堆通常都运行得很糟。堆被一个全局锁保护,并且在多处理器系统上是不可扩展的。

不应该考虑使用处理器高速缓存

大多数人都知道由虚拟内存子系统导致的hard 页错误代价很高,最好避免。但是许多人认为其他内存访问方法没有什么区别。自从80486以后,这一观点就不对了。现代的CPUs比RAM要快得多,RAM至少需要两级内存缓存 ,高速L1 缓存能保存8KB数据和8KB指令,而较慢的L2 缓存能保存几百KB的数据和代码,这些数据和代码混合在一起。L1 缓存中内存区域的一个引用需要一个时钟周期,L2 缓存的引用需要4到7个时钟周期,而主内存的引用需要许多个处理器时钟周期。后一数字不久将会超过100个时钟周期。在许多方面,缓存像一个小型的,高速的,虚拟内存系统。

至于和缓存有关的基本内存单元不是字节而是缓存列。Pentium 缓存列有32个字节宽。Alpha 缓存列有64个字节宽。这意味着在L1 缓存中只有512个slot给代码和数据。如果多个数据一起使用(时间位置)而并不存储在一起(空间位置),性能会很差。数组的空间位置很好,而相互连接的列表和其他基于指针的数据结构的位置往往很差。

把数据打包到同一个缓存列中通常会有利于提高性能,但是它也会破坏多处理器系统的性能。内存子系统很难协调处理器间的缓存。如果一个被所有处理器使用的只读数据,和一个由一个处理器使用并频繁更新的数据共享一个缓存 列,那么缓存将会花费很长时间更新这个缓存列的拷贝。这个Ping-Pong高速游戏通常被称为"缓存 sloshing"。如果只读数据在一个不同的缓存 列中,就可以避免sloshing。

对代码进行空间优化比进行速度优化效率更高。代码越少,代码所占的页也越少,这样需要的运行设置和产生的页错误也会更少,同时占据的缓存 列也会更少。然而,某些核心函数应该进行速度优化。可以利用profiler去识别这些函数。

决不要缓存频繁使用的数据。

软件缓存可以被各种应用程序使用。当一个计算代价很高时,你会保存结果的一个拷贝。这是一个典型的时空折中方法:牺牲一些存储空间以节省时间。如果做得好,这种方法可能非常有效。

你必须正确地进行缓存。如果缓存了错误数据,就会浪费存储空间。如果缓存得太多,其他操作可以使用的内存将会很少。如果缓存得太少,效率又会很低,因为你必须重新计算被缓存 遗漏的数据。如果将时间敏感数据缓存得时间过长,这些数据将会过时。一般,服务器更关心的是速度而不是空间,所以他们要比桌面系统进行更多的缓存。一定要定期去除不用的缓存,否则将会有运行设置问题。

应该创建多个线程,越多越好。

调整服务器中起作用的线程数目是很重要的。如果线程是I/O-bound的,将会花费很多时间用来等待I/O的完成-一个被阻塞的线程就是一个不做任何有用工作的线程。加入额外的线程可以增加通量,但是加入过多的线程将会降低服务器的性能,因为上下文交换将会成为一个重大的overhead。上下文交换速度应该低的原因有三个:上下文交换是单纯的overhead,对应用程序的工作没有任何益处;上下文交换用尽了宝贵的时钟周期;最糟的是,上下文交换将处理器的缓存填满了没用的数据,替换这些数据是代价高昂的。

有很多事情是依靠你的线程化结构的。每个客户端一个线程是绝对不合适的。因为对于大量用户端,它的扩展性不好。上下文交换变得难以忍受,Windows NT用尽了资源。线程池模型会工作得更好,在这种方法中一个工人线程池将处理一条请求列,因为Windows 2000提供了相应的APIs,如QueueUserWorkItem。

时间: 2024-08-30 19:55:29

扼杀服务器性能的10条戒律(转,接前文)的相关文章

扼杀服务器性能的10条戒律(3)

服务器|性能 不要进行测量 当你能够测量你所谈论的事情并用数字表达它时,这就表示你对他有了一定的了解:但是如果你不能用数字表达时,你的知识是贫瘠的不能令人满意的:这可能是知识的开始,但这时你简直不可能将你的思想提高到科学的水平.- Lord Kelvin (William Thomson) 如果不测量你就不能了解应用程序的特性.你在黑暗中摸索,一半是靠猜测.如果不识别性能问题,你就不能做任何改进或做出工作量计划. 测量包括黑匣子测量和profiling.黑匣子测量的意思是收集由性能计数器(内存使

扼杀服务器性能的10条戒律(2)

服务器|性能 应该对数据结构使用全局锁 使数据线程安全的最简单方法是把它套上一把大锁.为简单起见,所有的东西都用同一把锁.这种方法会有一个问题:序列化.为了得到锁,每一个要处理数据的线程都必须排队等候.如果线程被一把锁阻塞,它没有在做任何有用的事.当服务器的负载较轻时,这个问题并不常见,因为一次可能只有一个线程需要锁.在负载很重的情况下,对锁的激烈争夺可能就会成为一个大问题. 设想在多车道高速公路上发生了一个意外事故,这条高速公路上的所有车辆都被转向一条狭窄的道路.如果车辆很少,这一转换对交通流

站长必读:Web创业的10条戒律

web|站长 Evan Williams是Blogger的创始人,也是podcast服务网站Odeo的创始人和CEO.他根据自己的体会,列出了Web创业应该遵循的10条戒律(Ten Rules for Web Startups),摘录并评注如下: 收缩:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题.不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者.小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场.不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用

Web创业应该遵循的10条戒律

Evan Williams是Blogger的创始人,也是podcast服务网站Odeo的创始人和CEO.他根据自己的体会,列出了Web创业应该遵循的10条戒律(Ten Rules for Web Startups),摘录并评注如下: 1.专注:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题.不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者.小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场.不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用户的一部分

很受用的Web创业的10条戒律_网站运营

很受用的Web创业的10条戒律建议大家都看下1.收缩:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题.不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者.小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场.不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用户的一部分需求,就足够你玩儿的. 2.差异:要记住很多人都在做着跟你一样的事情,而其中一个是Google.在这个市场上,专才比通才有用.不一定要做多么领先的事情,寻常的事情你同样可以做得跟别人不一样,

成长型公司发展的10条戒律

1.合作前协定将最初的参与者限制于那些对企业要完成的目的,为了谁以及什么时候完成自觉同意并能够作出直接贡献的人.只考虑那些不只是能够带来金钱还能带来其他东西,例如:联系.市场技巧.专门技术等的投资者. 2.顾客就是上帝 买什么,谁会买,以及为什么买?根据这些问题对企业的业务进行定义.通过在产品开发前对市场进行调查来避免巨大的损失. 3.用来复枪不要用散弹猎枪 将所有可利用的资源集中于在给定时间内完成两到三件可行的特定目标. 4.没有计划好就等于计划失败 准备一个书面计划描述整个团体中谁应该做什么

[转]服务器性能和可伸缩性杀手

服务器|伸缩|性能 服务器性能和可伸缩性杀手George V. Reilly微软公司2月22, 1999 目录 序言 应用程序服务器 IIS的灵活性和性能 扼杀服务器性能的十条戒律 结论 -------------------------------------------------------------------------------- 序言 现在,服务器性能问题是许多书写桌面应用程序的人所要面对的问题.组件对象模型(Component Object Model,COM)和Compon

Web创业的10条定律

Evan Williams是Blogger的创始人,也是podcast服务网站Odeo的创始人和CEO.他根据自己的体会,列出了Web创业应该遵循的10条戒律(Ten Rules for Web Startups),摘录并评注如下:1.专注:专注于一个尽可能小的可能存在的难题,而你又能够解决这个难题.不要想着什么都做,贪多嚼不烂,搞不好就成了模仿者.小可以变大,船小好调头,小可以带给你很多优势,缝隙市场可以变成一个大市场.不要试图把1亿上网用户都当成你的用户,没用,能真正解决一部分用户的一部分需

扼杀IIS服务器性能的十条规则

iis|服务器|性能 下面的每一条戒律都将有效地影响代码的性能和可伸缩性.换句话说,尽可能不要照着戒律去做!下面,我将解释如何破坏他们以便提高性能和可伸缩性. 1.应该分配和释放多个对象 你应该尽量避免过量分配内存,因为内存分配可能是代价高昂的.释放内存块可能更昂贵,因为大多数分配算符总是企图连接临近的已释放的内存块成为更大的块.直到Windows NT? 4.0 service pack 4.0,在多线程处理中,系统堆通常都运行得很糟.堆被一个全局锁保护,并且在多处理器系统上是不可扩展的. 2