技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

Apache性能优化

 Apache是目前Internet上使用最为广泛的Web服务器。它具有比商业Web服务器不遑多让的功能与速度,同时安装与设置也十分简单,正是这些特性让它成为市场占有率最高的Web服务器软件。不过Apache安装简单,并不意味着简单地安装就可以适用于绝大多数应用环境,在高负荷的Web站点,Apache还需要进行调整、优化......  优化方法  Apache的配置文件是httpd.conf。Windows下该文件位于Apache安装目录的Conf子目录下,RedHat Enterprise Linux AS 3.0 Update 2位于/etc/httpd/conf。通过调整该文件的某些参数,可以优化Apache的运行效率。  为了验证后文Apache参数的调整是否起作用,我们通常用Apache附带的ab(Apache Bench)对其进行压力测试。  ab最常用的语法格式是这样的:  ab -n XXX -c YYY -k http://hostname.port/path/filename  其中:  -n XXX: 表示最多进行XXX次测试。也就是下载filename文件XXX次。  -c YYY: 客户端并发连接个数。  -k:    启用HTTP KeepAlive功能。默认不启用KeepAlive功能。  比如我们要对http://hostname:port/file.com下载10000次进行测试,并发访问为60个,启用HTTP KeepAlive功能,则访问指令为:  ab -n 10000 -c 60 -k http://hostname:port/file.htm  测试平台  在本次优化过程中。笔者采用了两台电脑进行压力测试。其中一台为客户端,运行ab发送请求,另外一台为服务器,安装有Apache提供Web服务。  1.服务器配置  服务器端,笔者采用了较低端的配置。这样更容易通过ab测试看来调整参数后的效果:  CPU:      Intel Celeron 1.0GHz 内存:    512MB SRAM 100MHz 硬盘:    Maxtor 4D040H2 网卡:    D-Link DFE 530TX  服务器端笔者安装两种操作系统:Windows Server 2003 Enterprise Edition并升级到最新的Hotfix。Apache服务器版本为2.0.50;或者RedHat Enterprise Linux AS 3.0 Update 2。  2.客户端配置  为了使评测的瓶颈不在客户端,笔者客户端配置要比服务器端好,具体硬件配置如下:  CPU:      P4 3.0GHz 533MHz 打开了HT支持 内存:    512MB DDR 400 硬盘:    WD1200JB-00CRA1 网卡:    D-Link DFE 530TX  客户端安装有RedHat Enterprise Linux AS 3.0 Update 2。并利用其中的ab来进行性能测试。  通用优化技巧  对于Apache服务器来说,为了提高性能需要进行的某些参数调整具有通用性,也就是说只要采用了就可以使其性能更好。  1.关闭DNS和名字解析  * HostnameLookups on | off | double  Apache 1.3之前HostnameLookups默认是打开的。这样客户端在访问服务器时,服务器将要解析客户端的主机名,并将其保存在日志文件中。对客户端进行域名反向解析会大幅降低服务器速度,所以最好将其设置为Off。关闭指令如下:  HostnameLookups off  * UseCanonicalName on | off | dns  打开UseCanonicalName是Web服务器的标准做法。这是因为客户发送的大部分请求都是对本服务器的引用,打开该项设置就能使用ServerName和Port选项的设置内容构建完整的URL。如果将这个参数设置为Off,那么Apache将使用从客户请求中获得服务器名字和端口值,重新构建URL。  如果你不需要在Apache中架设虚拟主机,建议设置为:  UseCanonicalName on  2.关闭多余模块  Apache采用了模块化设计,管理员可以有选择地加载一些模块来加强服务器的功能。这些模块,可以在创建服务器时静态编译到服务器的二进制代码中,也可以编译成一些独立服务器程序的Dynamic Shared Objects(DSO)文件,在Apache启动的时候根据需要,动态加载。事实证明,不加载多余的模块总是可以提高Apache的性能。  Apache的DSO模块是在httpd.conf中以:  LoadModule access_module modules/mod_access.so  方式加载。当不需要某个模块时,只要在其前添加“#”,注释掉该行。  一般来说,不需要加载以下模块:  mod_include.so: 服务器端包含,是一种已经过时的技术。  mod_autoindex.so: 如果不希望Apache列目录显示,可以删除。  mod_access.so、mod_auth.so: 如果你不需要进行安全验证,也没有必要加载。  最好加载以下模块:  mod_dir.so: 用于定义缺省文档index.php、index.jsp等。  mod_log_config.so: 用于定义记录文件格式。  mod_mime.so: 定义文件类型的关联。  最后需要说明一点的是,并不是加载所有的模块都会降低Apache性能。比如mod_zip可以把文件压缩之后再传给客户端,这样就可以减少40%左右的网络流量,而mod_expires则可以减少10%左右的重复请求。  3.取消.htaccess验证  除非你确定需要使用.htaccess文件来控制客户端对相应目录的访问权限,否则设置“AllowOverride None”,可以免除Apache在每个目录搜索.htaccess文件之苦。  4.取消符号链接  FollowSymLinks允许使用符号连接,这将使用浏览器有可能访问文档根目录(DocumentRoot)之外的内容,并且只有符号连接的目的与符号连接本身为同一用户所拥有时(SymLinksOwnerMatch),才允许访问,这个设置将增加一些安全性,但将耗费Apache大量的资源。  笔者建议:  Options FollowSymLinks  但是不要启用SymLinksOwnerMatch。  5.打开KeepAlive支持  在HTTP 1.0中和Apache服务器的一次连接只能发出一次HTTP请求,而KeepAlive参数支持HTTP 1.1版本的一次连接,多次传输功能,这样就可以在一次连接中发出多个HTTP请求。从而避免对于同一个客户端需要打开不同的连接。很多请求通过同一个TCP连接来发送,可以节约网络和系统资源。  在Apache的配置文件httpd.conf中,设置:  KeepAlive on KeepAliveTimeout 15  这样就能限制每个连接的保持时间是15秒。在我们的评测中发现,打开KeepAlive之前,ab测试的数据为:  Requests per second:    201.32 [#/sec] (mean) Time per request:      298.031 [ms] (mean) Time per request:      4.967 [ms] (mean, across all concurrent requests) Transfer rate:          839.49 [Kbytes/sec] received  而打开KeepAlive支持之后,ab测试数据为:  Requests per second:    341.70 [#/sec] (mean) Time per request:      175.594 [ms] (mean) Time per request:      2.927 [ms] (mean, across all concurrent requests) Transfer rate:          1437.04 [Kbytes/sec] received  最能反应Apache服务器性能的Requests per second,即每秒完成的请求次数从201.32提升到341.70,提升幅度为70%。虽然在现实环境中,不可能有这么多的同一连接发出的请求,但启用KeepAlive确实在一定程度上可以提高Apache服务器的吞吐量和反应速度。  另外,可以设置:  MaxKeepAliveRequests 100  把MaxKeepAliveRequests设置的尽量大,可以在一次连接中进行更多的HTTP请求。但在我们的测试中还发现,把MaxKeepAliveRequests设置成1000,则评测的客户端容易出现“Send requesttimed out”的错误,所以具体数值还要根据自己的情形来设置。  参数决定性能  Apache除了可以通过一些常规方式进行优化外,还需要调整其运行参数,这样才能构建一个适合相应网络环境的Web服务。这些指令从两个级别对Apache进行了优化。  * 进程级(Process-level)  进程级的参数用来控制Apache相应的客户端请求的进程数Process(在Windows下称之为线程数,threads)。  * 协议级(Protocol-level)  协议级的指令则用来控制Apache与客户端的连接多久才自动断开。  由于Windows和Linux/UNIX设计原理的不同,所以进程级的指令根据Apache是工作在Linux/UNIX或者Windows下,而分成两种。  1.Linux下Apache性能优化  Linux下的Apache预设工作在prefork模式下(由每个进程处理连接请求),这种工作模式也是Apache 1.3系列的工作模式。如果你需要其工作在其他模式下,则需要手工编译源代码来实现:  ./configure --prefix=/usr/local/apache-2.0.50 --with-mpm=worker --enable-include && make && make install  Linux下进程级的Apache调整参数包括以下五个。  * StartServers  该参数决定Linux启动时,自动打开的Apache服务器的数目。它对Apache服务器的性能没有太大的影响。因为如果MinSpareServers设置的比较大,Apache服务器进程数会马上调整到不小于MinSpareServers的数目。  在Linux下,我们可以通过:  ps aux |grep httpd  来查看当前打开的Apache服务进程数。  * MinspareServers  该参数用于配置在任何时候可用的最小Apache进程个数。一般情况下,当目前可用的Apache进程数不能满足需求时,Apache会自动打开新进程以服务客户。所以设置MinspareServers为较大的值只是为了让在比较繁忙的Web环境,让Apache可以尽快地满足客户端的访问需求。对于每天有百万访问量的网站来说,下面的数值是比较合适的:  MinspareServers 32  * MaxSpareServers  较大的MinSpareServers可以保证Apache有较快的反应速度,过大的MinSpareServers又会占用更多的系统内存。如果你的系统内存不是很充足或者运行有其他的服务,把MaxSpareServers设置小一些可以为其他服务空出一些内存。当空闲Apache进程超过MaxSpareServers指定的数值时,Apache主进程会杀掉多余的空闲进程而保持空闲进程在MaxSpareServers指定的数值。  对于每天百万访问量的网站来说,配置大容量的内容,并且设置如下的值是比较合适的:  MaxSpareServers 64  * MaxClients  服务器的处理能力毕竟是有限的,不可能同时处理无限多的连接请求。参数MaxClients就用于规定服务器支持的最多并发访问的客户数。  如果MaxClients设置得过大,系统在繁忙时不得不在过多的进程之间来回切换为更多的客户服务。这样对每个客户的反应就会变慢;如果设置得过小,系统繁忙时就会拒绝客户连接请求。  我们的设想原则是,当服务器性能较高时,可以适当增加这个值的设置。如果繁忙出现拒绝访问现象,说明需要升级服务器硬件了。  如果你不在意访问速度,或者认为反应速度慢也总比拒绝连接好,可以把该值设置大一些。  * MaxRequestsPerChild  当设置KeepAlive为off时,Apache服务器是用单独的子进程为一次连接服务,这样,每次连接都需要生成、关闭子进程,这些额外的操作浪费了计算机的大量处理能力。最好的方式是一个子进程可以为多次连接请求服务。  但子进程在接受访问请求时,需要不断地申请和释放内存,次数多了就会造成内存垃圾,影响系统稳定性。为了解决这个问题,可以规定每一个子进程处理的最大请求数,超过此数值,就让该子进程退出,再从原始的httpd进程中重新复制一个干净的副本,从而提高系统的稳定性。  第个子进程能够处理服务请求的最大次数由MaxRequestsPerChild定义。RedHat Enterprise Linux AS 3.0 Update 2缺省的设置值为1000这个值比较适合(设置为0支持每个副本进行无限次的服务处理)。  在我们的测试过程中发现,RedHat Enterprise Linux AS 3.0 Update 2下默认配置的Apache并不能很好地应付大负荷站点。我们需要打开KeepAlive,并加大StartServers、MinSpareServers、MaxSpareServers和MaxClients的数值。这些参数对于Apache性能的改善有很大的影响。  小知识: RedHat Enterprise Linux AS 3.0 Update 2最大MaxClients只能设置到256。如果你需要设置其为更高,需要在MaxClients前面添加: ServerLimit xxx 其中xxx不能少于MaxClients的数值。该设置方法适用于Apache 2.0系列。  2.Windows下Apache优化  Windows下,Apache 2.0经过了全新的设计,采用多线程的方式(work)运行。这种运行方式,理论上比Linux/UNIX的Perfork运行模式有更好的性能。  Work模式下由单个控制进程负责子进程的建立。每个子进程可以建立由ThreadsPerChild指定的固定数量的线程。由独立的线程监听并处理到来的连接。  在Windows下可以执行“Apache -l”。查看当前工作模式,如果显示“mpm_winnt.c”,则表示Apache工作在多线程模式下;在Linux下执行“httpd -l”看到“prefork.c”表示工作在子进程模式下。  其配置语句是:   StartServers          2 MaxClients          150 MinSpareThreads      25 MaxSpareThreads      75          ThreadsPerChild      25 MaxRequestsPerChild    0   Apache力图维持一个备用的服务线程池,让客户端无须等待线程/进程的建立即可得到处理。最初建立的进程数由StartServers指定。然后Apache会不停地检测所有Apache进程中空闲线程的总数,并新建或结束进程使总数维持在MinSpareThreads和MaxSpareThreads所指定的范围以内。但同时可以得到处理的客户端的最大数量又取决于MaxClients指令,而进程建立的最大数量取决于ServerLimit指令。三者之间的关系为:  ServerLimit*ThreadsPerChild >=MaxClients ... 全文

Apache Apache优化 Apache性能优化

Apache安装apr和apr

安装Apache的时候,为什么要安装apr和apr-util呢  要测APR给tomcat带来的好处最好的方法是在慢速网络上(模 拟Internet),将Tomcat线程数开到300以上的水平,然后模 拟一大堆并发请求。如果不配APR,基本上300个线程狠快就会 用满,以后的请求就只好等待。但是配上APR之后,并发的线 程数量明显下降,从原来的300可能会马上下降到只有几十, 新的请求会毫无阻塞的进来。 APR对于Tomcat最大的作用就是socket调度。  你在局域网环境测,就算是400个并发,也是一瞬间就处理/传 输完毕,但是在真实的Internet环境下,页面处理时间只占 ... 全文

Apache安装apr和apr-util作用 休闲 Apache性能优化 tomcat性能优化 职场

apache和tomcat性能优化

一、Apache优化修改httpd-mpm.conf文件KeepAlive ON<IfModule prefork.c> StartServers       200  MinSpareServers    5  MaxSpareServers   20 ServerLimit     6500  MaxClients       6000  MaxRequestsPerChild  8000 </IfModule># worker MPM # StartServers: initial number of server processes to start # MaxClients: maximum number of simultaneous client connections # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule worker.c> StartServers         400  MaxClients         300  MinSpareThreads     40  MaxSpareThreads     150 ThreadsPerChild     50  MaxRequestsPerChild  6000 </IfModule> 根据自己网站的实际能力修改,后续会有参数的具体意义!二、Tomcat优化:1.java虚拟机性能优化     可以给java虚拟机设置使用的内存,如果你选择不对,虚拟机不会自动补偿.可通过命令行的方式改变虚拟机使用内存的大小:    -Xms<size>  JVM初始化堆的大小   -Xmx<size>  JVM堆的最大值 我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存.一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务,崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%. Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大. Windows下,在文件/bin/catalina.bat中,Unix下,在文件/bin/catalina.sh的前面,增加如下设置(也许Solaris的设置和Unix类似,不太清楚,研究过再说): JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】' 需要把这个两个参数值调大.例如:         JAVA_OPTS='-Xms256m  -Xmx512m'         表示初始化内存为256MB,可以使用的最大内存为512MB. 另外需要考虑的是Java提供的垃圾回收机制,虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度,如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低.如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁.调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求 ... 全文

休闲 apache和tomcat性能优化 职场

关于优化需要永远牢记的原则

1.尽量不要去搞什么性能优化,因为十有八九你会失望的 首先,不要指望调节系统参数就能带来性能的大幅提升,这永远都不可能,因为如果能大幅提升,那组参数早就成默认参数或者写进文档了,即使不一定这样,起码有对技术比较痴迷的家伙会把类似的经验分享出来,轮到你来做这件事的几率很低很低。正如你能想到电梯的创意,可那玩意儿都已经存在100年了。 其次,如果一个参数的微调能引起性能数量级级别的变化,那就是内核的bug了,你需要的是提交修复补丁而不是引以为成果! 再次,仅仅通过优化的方式希望得到性能大幅提升,那你是过分依赖软件了,这种可能性正如你大幅度被加薪的可能性一样大。虽然不乏通过跳槽使薪资翻倍的可能,但其中也不乏欺世盗名之徒,他们依赖的是面试技巧,学历,资历等,而不是“自身性能的翻倍”。调节薪水一次肯定不会调太多,你需要在一个薪水档次慢慢沉淀一下自己,明白了这一点,就不要急于做优化了,1.6G主频的cpu在没有换成2.4G主频cpu之前,不要指望通过软件的方式大幅提高性能,即使到了2.4G主频的cpu,也不要指望性能能提高2.4/1.6倍,这个道理正如你一天能写160行代码,你的薪资为1.6k,然后半年后你一天能写的代码数量达到了240行,难道你的薪资就一定能自动到达2.4k吗?我看难。 因此,性能优化和你自身的优化一样,你需要稳扎稳打,而绝对不能指望一夜之间脱胎换骨,搅和起来N多的因素需要考虑,软件只是一种将硬件组织起来的东西,如果你的硬件有“硬伤”,那还是先治疗硬伤为好。所以说,程序员们不要一味的整天“代码,代码,代码,我用了效率最高的算法,为何不能更快一些”,深入下去,从整体上考虑会更好一些 2.所谓的优化只是统计意义上的优化而已。 因此能不优化尽量不要优化 3.不要过分依赖负载均衡,有时候负载均衡并不适合你的场合 Intel的千兆网卡支持多个队列,可以将负载均衡到所有cpu上,每个cpu处理一个队列,然而测试后你会发现,大多数情况下,将绑在一个cpu上性能或许会更好些。实际上学过基础理论的都知道负载均衡是个好东西,然而对于Intel的千兆卡,它大多数还是用于虚拟化的,而不是普通的主机环境。我们需要考虑的是cpu拓扑,中断绑定,cpu缓存拓扑等综合因素的影响,而不是过分依赖一个很时髦的名词。 4.看代码是看不出什么东西的 现在很多的guo书,blog上都在大量剖析代码,Linux源码分析,Apache源码分析,XX源码分析...可是看代码究竟能提高自己吗?能是肯定的,但是很难! 我觉得在软件技术领域-当然不单单只软件开发,有所谓7个层次: a.数量使用和配置软件 b.剖析优秀软件代码或者了解其实现原理 c.调试优秀软件 d.部署复杂软件,使之成为一个可用的复杂系统且能迅速故障定位 e.整体系统性能调优,能找到瓶颈,且能准确选型 f.对各种软件技术触类旁通 g.hacker 处于a级别的太多了,你我ta都是,处于b级别的也不少,科班出身的几乎都有这爱好,并且有大批的人停留在此级别,c级别的呢,windows程序员比较多,他们喜欢搞反汇编之类的,而且还喜欢炫耀ringX的知识...处于d阶段,你就很厉害了,毕竟软件是来使用的,可能d级别的人根本就不懂c语言,也没看过什么代码,然而我觉得它们一下子能搞定复杂系统的部署和定位故障,这本身就是一种超级武器,e阶段的人总的来讲和d阶段是并列的,只是方向不同,e阶段的家伙一般是忠于单点的,而d阶段的家伙一般忠于整体。f阶段的就不必说了,这种人本身肯定对技术很痴迷,并且能胜任几乎一切工作,g阶段的家伙们很随意,他们是真正的自由人,他们想做的事情总是干得很漂亮,他们不想干的事情,... 以上分类并不是一个顺序的分类,可能a级别的人一辈子也不会到达b,然而却可以到达g,这只是学习方向不同,也是自身品位不同。 5.优化自身的原则 为了提高逻辑思维能力和条理性,需要学习数学和逻辑学,我高中时有一个物理老师,他讲的所有内容中,我觉得有一点很有用,那就是“你必须要有大段大段整理数学式子的能力”; 作为一名软件研发人员,3年前在长春的一家公司,那里的一个很牛的人说了一句话,我现在都记得,他说“你要有大量整理字符串的能力”,整理字符串的过程中体现的是你的组织能力和,折射出的是你的算法思想。 如今,从业5年了,前不久又学了一句话,那是“只要是没有人为因素的纯技术问题,是一定一定有解决办法的!”... 全文

优化 负载均衡 性能优化 算法 apache 汇编

Web开发者必知的25个Apache性能优化技巧

Apache部分:1. 移除不用的模块。2. 使用 mod_disk_cache NOT mod_mem_cache 。3. 扁平架构配置mod_disk_cache。4. 安装恰当的Expires, Etag, 和 Cache-Control Headers 。5. 将缓存放在独立的磁盘6. 使用管道日志替代直接记录7. 将日志放在不同的磁盘8. 使用 mod_gzip/mod_deflate 。9. 将HostnameLookups关闭.10. 避免在configs中使用主机名。11. 使用持久连接。12. 不要设置KeepAliveTimeout太高。13. 禁用.htaccess。14. 允许symlinks。... 全文

Web服务器

Apache 2.0性能优化—MPM的选择与配置

  Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。相比于Apache 1.3,2.0版本做了大量的优化来提升处理能力和可伸缩性,并且大多数改进在默认状态下即可生效。但是在编译和运行时刻,2.0也有许多可以显著提高性能的选择。本文不想叙述那些以功能换取速度的指令,如HostnameLookups等,而只是说明在2.0中影响性能的最核心特性:MPM(Multi -Processing Modules,多道处理模块)的基本工作原理和配置指令。   毫不夸张地说,MPM的引入是Apache 2.0最重要的变化。大家知道,Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求。扩展模块化设计有两个重要好处:   ◆ Apache可以更简洁、有效地支持多种操作系统;   ◆ 服务器可以按站点的特殊需要进行自定制。   在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。   指定MPM的方法   下面以Red Hat Linux 9为平台,说明在Apache 2.0中如何指定MPM (Apache采用2.0.45)。先解压缩源代码包httpd-2.0.45.tar.gz,生成httpd-2.0.45目录(Apache 1.3源代码包的命名规则是apache_1.3.NN.tar.gz,而2.0版则是httpd-2.0.NN.tar.gz,其中NN是次版本号)。   进入httpd-2.0.45目录,运行以下代码: $ ./configure --help|grep mpm?   显示如下: --with-mpm=MPM Choose the process model for Apache to use. MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}   上述操作用来选择要使用的进程模型,即哪种MPM模块。Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级MPM ( 有关其它的MPM详细说明,请参见Apache官方文档:[url]http://httpd.apache.org/docs-2.0/mod/[/url])。   prefork的工作原理及配置   如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。   若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。再查看缺省生成的httpd.conf配置文件,里面包含如下配置段: <IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>   prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。   MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。   MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:   ◆ 可防止意外的内存泄漏;   ◆ 在服务器负载下降的时侯会自动减少子进程数。   因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。   MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么 Apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改为要增大的值(如4000),然后重新编译Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段: <IfModule prefork.c> StartServers 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 10000 </IfModule>   上述配置中,ServerLimit的最大值是20000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可: #define DEFAULT_SERVER_LIMIT 256 #define MAX_SERVER_LIMIT 20000   worker的工作原理及配置   相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。   在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段: <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>   worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。   MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。   ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行: #define DEFAULT_THREAD_LIMIT 64 #define MAX_THREAD_LIMIT 20000   这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。   Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行: #define DEFAULT_SERVER_LIMIT 16 #define MAX_SERVER_LIMIT 20000   需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的 worker配置段: <IfModule worker.c> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>   通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。... 全文

职场 休闲

1