??xml version="1.0" encoding="utf-8" standalone="yes"?>
apache 2.2Q用默认配|,默认最大连接数?50
1.首先在httpd.conf中加载httpd-mpm.conf配置Q去掉前面的注释Q:
# Server-pool management (MPM
specific)
Include conf/extra/httpd-mpm.conf
2.可见的MPM配置?usr/local/apache/conf/extra/httpd-mpm.confQ但里面Ҏhttpd的工作模式分了很多块Q哪一部才是当前httpd的工作模式呢Q可通过执行
apachectl -l 来查看:
[root@zh888 extra]# /usr/local/apache/bin/apachectl
-l//因ؓ采用静态编?br />Compiled in
modules:
core.c
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c
mod_cache.c
mod_disk_cache.c
mod_mem_cache.c
mod_include.c
mod_filter.c
mod_deflate.c
mod_log_config.c
mod_env.c
mod_expires.c
mod_headers.c
mod_setenvif.c
mod_version.c
mod_proxy.c
mod_proxy_connect.c
mod_proxy_ftp.c
mod_proxy_http.c
mod_proxy_scgi.c
mod_proxy_ajp.c
mod_proxy_balancer.c
prefork.c//才用prefork所以在httpd-mpm.conf中找到mpm_prefork_module
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c
所以修改连接数在/usr/local/apache/conf/extra/httpd-mpm.confq个文g了,打开它就扑ֈprefork模式的默认配|是Q?br />
StartServers
5
MinSpareServers 5
MaxSpareServers 10
MaxClients
150
MaxRequestsPerChild 0
prefork
控制q程在最初徏?#8220;StartServers”个子q程后,Z满MinSpareServers讄的需要创Z个进E,{待一U钟Ql创Z个,再等待一U钟Ql创建四?#8230;…如此按指数增加创徏的进E数Q最多达到每U?2个,直到满MinSpareServers讄的gؓ止?/p>
q种模式可以不必在请求到来时再生新的进E,从而减了pȝ开销以增加性能。MaxSpareServers讄了最大的I闲q程敎ͼ如果I闲q程数大于这个|Apache会自动kill掉一些多余进E。这个g要设得过大,但如果设的值比MinSpareServers,Apache会自动把其调整ؓ
MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers?/p>
MaxRequestsPerChild讄的是每个子进E可处理的请求数。每个子q程在处理了“MaxRequestsPerChild”个请求后自动销毁?意味着无限Q即子进E永不销毁?br />虽然~省设ؓ0可以使每个子q程处理更多的请求,但如果设成非零g有两炚w要的好处Q?br />1、可防止意外的内存泄漏?br />2、在服务?/span>负蝲下降的时侯会自动减少子进E数。因此,可根?span>服务?/span>?/span>负蝲来调整这个倹{MaxClients是这些指令中最为重要的一个,讑֮的是 注意Q虽焉过讄ServerLimitQ我们可以把MaxClients加得很大Q但是往往会适得其反Q系l耗光所有内存。以我手头的一?span>服务?/span>ZQ内?GQ每个apacheq程消耗大U?.5%Q可通过ps q接数理Z当然是支持越大越好,但要?span>服务?/span>?/span>能力范围内,q跟服务?/span>?/span>CPU、内存、带宽等都有关系?/p> 查看当前的连接数可以用: ׃基本都是静态页面,CPU消耗很低,每进E占用内存也不算多,大约200K?/p> 假如服务?/span>内存?GQ除d规启动的服务大约需?00MQ保守估计)Q还?.5G可用Q那么理Z可以支持1.5*1024*1024*1024/ U?K个进E,支持2W人同时访问应该是没有问题的(能保证其?K的h讉K很快Q其他的可能需要等??U才能连上,而一旦连上就会很畅Q?/p> 控制最大连接数的MaxClients Q因此可以尝试配|ؓQ?br /> 注意QMaxClients默认最大ؓ250Q若要超q这个值就要显式设|ServerLimitQ且ServerLimit要放在MaxClients之前QD不小于MaxClientsQ不焉启httpd时会有提C?/p> 重启httpd后,通过反复执行pgrep httpd|wc -l (MaxRequestsPerChild不能讄?Q可能会因内存泄露导?span>服务?/span>崩溃Q?/p> 更佳最大D的公式Q?/p> apache_max_process_with_good_perfermance < (total_hardware_memory / 4.?usr/local/apache/bin/ab来测试压力不q还有一个工具叫webbench也可以测试?/p> [root@zh888 bin]# /usr/local/apache/bin/ab -n 100 -c This is ApacheBench Version 2.3 Benchmarking 192.168.100.1 (be patient).....done Server Hostname: 192.168.100.1//服务?/span>L?/p> Server Port: 8000//端口 Document Path: /index.php//试的页面文?/p> Document Length: bytes//文档大小 Time taken for tests: 4.482 seconds//整个试持箋的时?/p> Complete requests: 100//完成的请求数?/p> Failed requests: 0//p|的请求数?/p> Write errors: 0 HTML transferred: bytes Time per request: 4481.929 [ms] (mean)//大家最兛_的指标之二,相当?LR 中的 q_事务响应旉 Q后面括号中? Transfer rate: 793.68 [Kbytes/sec] min mean[+/-sd] median max Percentage of the requests served within a certain time ulimitQ显C(或设|)用户可以使用的资源限? 5最后补充一下apache的知识: Apache2.0这U模块化的设计g伸到?span>web服务?/span>?/span>基础功能上。这个版本带有多路处理模?MPM)的选择以处理网l端口绑定、接受请求ƈ指派钟进E来处理q些h?/p> 模块化设计延到这一层次主要有以下两大好处: * 从用戯度来看,MPM更像其他的Apache模块。主要的不同在于Q不ZӞ必须有且仅有一个MPM被蝲入到服务?/span>中。现有的MPM列表可以在模块烦引中扑ֈ?/p> 选择一个MPM 你可以在使用configure脚本时用 --with-mpm=NAME 选项指定MPMQNAME是你想使用的MPM的名U?/p> 一?span>服务?/span>~译完成Q就可以?./httpd -l 我们主要阐述prefork和workerq两U和性能关系最大的产品UMPM?/p> q个多\处理模块(MPM)实现了一个非U程型的、预z的web服务?/span>Q它的工作方式类gApache q个MPMh很强的自我调节能力,只需要很的配置指o调整。最重要的是MaxClients讄Z个够大的数g处理潜在的请求高峎ͼ同时又不能太大,以致需要用的内存出物理内存的大?/p> 工作方式 一个单独的控制q程(父进E?负责产生子进E,q些子进E用于监听请求ƈ作出应答。ApacheL试图保持一些备用的(spare)或者是I闲的子q程用于q接卛_到来的请求。这样客L׃需要在得到服务前等候子q程的生?/p> StartServers MinSpareServers MaxSpareServers 在Unixpȝ中,父进E通常以rootw䆾q行以便邦定80端口Q而Apache产生的子q程通常以一个低Ҏ的用戯行。User和Group指o用于讄子进E的低特权用戗运行子q程的用户必要对它所服务的内Ҏd的权限,但是Ҏ务内容之外的其他资源必须拥有可能少的权限?/p> MaxRequestsPerChild指o控制服务?/span>杀Lq程产生新进E的频率?/p> Apache MPM worker 概述 此多路处理模?MPM)使网l?span>服务?/span>支持混合的多U程多进E。由于用线E来处理hQ所以可以处理v量请求,而系l资源的开销于Zq程的MPM。但是,它也使用了多q程Q每个进E又有多个线E,以获得基于进E的MPM的稳定性?/p> 控制q个MPM的最重要的指令是Q控制每个子q程允许建立的线E数的ThreadsPerChild指oQ和控制允许建立的ȝE数的MaxClients指o?/p> 工作方式 每个q程可以拥有的线E数量是固定的?span>服务?/span>会根据负载情况增加或减少q程数量。一个单独的控制q程(父进E?负责子进E的建立。每个子q程可以建立ThreadsPerChild数量的服务线E和一个监听线E,该监听线E监听接入请求ƈ其传递给服务U程处理和应{?/p> ApacheL试图l持一个备?spare)或是I闲的服务线E池。这P客户端无ȝ待新U程或新q程的徏立即可得到处理。初始化时徏立的q程数量由StartServers指o军_。随后父q程所有子q程中空闲线E的LQƈ新徏或结束子q程使空闲线E的Ll持在MinSpareThreads和MaxSpareThreads所指定的范围内。由于这个过E是自动调整的,几乎没有必要修改q些指o的缺省倹{可以ƈ行处理的客户端的最大数量取决于MaxClients指o。活动子q程的最大数量取决于MaxClients除以ThreadsPerChild的倹{?/p> 有两个指令设|了zd子进E数量和每个子进E中U程数量的硬限制。要x变这个硬限制必须完全停止服务?/span>然后再启?span>服务?/span>(直接重启是不行的)QServerLimit是活动子q程数量的硬限制Q它必须大于或等于MaxClients除以ThreadsPerChild的倹{ThreadLimit是所有服务线EL的硬限制Q它必须大于或等于ThreadsPerChild指o。这两个指o必须出现在其他workerMPM指o的前面?/p> 在设|的zd子进E数量之外,q可能有额外的子q程处于"正在中止"的状态但是其中至有一个服务线E仍然在处理客户端请求,直到到达MaxClients以致l束q程Q虽然实际数量会很小。这个行够通过以下止特别的子q程中止的方法来避免Q?/p> * MaxRequestsPerChild设ؓ"0" 一个典型的针对workerMPM的配|如下: MaxRequestsPerChild指o用于控制服务?/span>建立新进E和l束旧进E的频率?/p> 常用指oQ?/p> StartServers MinSpareServers MaxSpareServers MaxClients MaxRequestsPerChild 注意Q?br />对于KeepAlive链接Q只有第一个请求会被计数。事实上Q它改变了每个子q程限制最大链接数量的行ؓ?/p> ThreadsPerChild ThreadLimit ServerLimit 配置apache使用workerMPMQ?/p> cd httpd-2.0.55
Apache可以同时处理的请求,是对Apache性能影响最大的参数。其~省?50是远q不够的Q如果请求L已达到这个|可通过ps -ef|grep
httpd|wc
-l来确认)Q那么后面的hp排队Q直到某个已处理h完毕。这是pȝ资源q剩下很多而HTTP讉K却很慢的主要原因。虽然理Zq个D大,可以处理的请求就多Q但Apache默认的限制不能大?56。ServerLimit指o无须重编译Apache可以加大MaxClients?/p>
aux来确认)的内存,也就?0MQ这P理论上这?span>服务?/span>最多跑200个apacheq程׃耗光pȝ所有内存,所以,讄MaxClients要慎重?/p>
3.要加到多?
ps aux | grep httpd | wc -l
计算httpd占用内存的^均数:
ps
aux|grep -v grep|awk '/httpd/{sum+=$6;n++};'
= 8053.
StartServers 5
MinSpareServers
5
MaxSpareServers 10
ServerLimit 5500
MaxClients
5000
MaxRequestsPerChild 100
来观察连接数Q可以看到连接数在达到MaxClients的设值后不再增加Q但此时讉K|站也很畅Q那׃用贪心再讄更高的gQ不然以后如果网站访问突增不心׃耗光服务?/span>内存Q可Ҏ以后讉K压力势及内存的占用变化再逐渐调整Q直到找C个最优的讄倹{?/p>
apache_memory_per_process ) * 2
apache_max_process =
apache_max_process_with_good_perfermance * 1.5
100http://192.168.100.1:8000/index.php//参数很多一般我们用 -c ?-n
参数可以了q个表示同时处理100个请求ƈq行100ơindex.php文g.
Copyright 1996 Adam Twiss Zeus Technology
Ltd
Licensed to The Apache Software Foundation
Server Software: Apache/2.2.19//q_apache 版本2.0.54
Concurrency Level: 100//q发?/p>
Total transferred: bytes//整个场景中的|络传输?/p>
Requests per second: 22.31 [#/sec]
(mean)//大家最兛_的指标之一Q相当于 LR 中的 每秒事务?Q后面括号中?mean 表示q是一个^均?/p>
mean 表示q是一个^均?br />Time per request: 44.819 [ms] (mean across all concurrent
requests)//每个h实际q行旉的^均?/p>
received//q_每秒|络上的量Q可以帮助排除是否存在网l流量过大导致响应时间g长的问题
Connection Times (ms)//|络上消耗的旉的分解?/p>
Connect: 0 73 24.5 79 96
Processing: 252
2542 1291.7 2590 4386
Waiting: 252 2541 1292.5 2590 4384
Total: 253 2615
1311.0 2671 4482
(ms)//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时_其中50Q的用户响应旉于1093 毫秒Q?0Q?的用户响应时间小?247
毫秒Q最大的响应旉于7785
毫秒
׃对于q发hQcpu实际上ƈ不是同时处理的,而是按照每个h获得的时间片逐个轮{处理的,所以基本上W一个Time per
request旉U等于第二个Time per request旉乘以q发h?/p>
50% 2671
66% 3351
75% 3923
80% 4095
90% 4358
95%
4441
98% 4472
99% 4482
100% 4482 (longest request)
4.是在使用Apache2.2的abq行试旉到的问题Q?br />使用ab试的时候当-cq发数超q?024׃出错Q?br />windows下提C:apr_pollset_create
failed: Invalid argument (22)
linux?/span>提示Qsocket: Too
many open files (24)
解决办法Q?br />linux?/span>Qulimit -n
Q设|系l允许同时打开的文件数Q系l默认是1024Q,可以用ulimit -a查看open files,# lsof |wc -l
可以查看pȝ所有进E的文g打开数?/p>
ulimit -a 昄用户可以使用的资源限?
ulimit unlimited
不限制用户可以用的资源Q但本设|对可打开的最大文件数Qmax open filesQ?
和可同时q行的最大进E数Qmax user
processesQ无?
ulimit -n 讄用户可以同时打开的最大文件数Qmax open filesQ?br />例如Qulimit -n 8192
如果本参数设|过,对于q发讉K量大的网站,可能会出现too many open files的错?
ulimit -u
讄用户可以同时q行的最大进E数Qmax user processesQ?
例如Qulimit -u 1024
?/p>
Apache
HTTP服务?/span>被设计ؓ一个强大的、灵zȝ能够在多U^C及不同环境下工作?/span>服务?/span>。不同的q_和不同的环境l常产生不同的需求,或是Z辑ֈ同样的最x果而采用不同的Ҏ。Apache凭借它的模块化设计很好的适应了大量不同的环境。这一设计使得|站理员能够在~译时和q行时凭借蝲入不同的模块来决?span>服务?/span>?/span>不同附加功能?/p>
Apache可以更简z、更有效地支持各U操作系l。尤其是在mpm_winnt中用本地网l特性代替Apache1.3中用的POSIX模拟层后QWindows版本的Apache现在h更好的性能。这个优势借助特定的MPM同样延C其他各种操作pȝ?br />*
服务?/span>可以为某些特定的站点q行定制。比如,需要更好~性的站点可以选择象worker或eventq样U程化的MPMQ而需要更好的E_性和兼容性以适应一些旧的Y件的站点可以用prefork
?/p>
MPM必须在编译配|时q行选择Qƈ静态编译到服务?/span>中。如果编译器能够定U程功能被启用,它将会负责优化大量功能。因Z些MPM在Unix上用了U程Q而另外一些没有用,所以如果在~译配置旉择MPMq态编译进ApacheQApache会有更好的表现?/p>
命o来查看用了哪个MPM。这个命令将列出所有已l被~译?span>服务?/span>中的模块Q包括MPM?/p>
Apache MPM prefork
一个非U程型的、预z的MPM
概述
1.3。它适合于没有线E安全库Q需要避免线E兼Ҏ问题的pȝ。它是要求将每个h怺独立的情况下最好的MPMQ这栯一个请求出现问题就不会影响到其他请求?/p>
MaxClients指o用于调节父进E如何生子q程。通常情况下Apacheh很强的自我调节能力,所以一般的|站不需要调整这些指令的默认倹{可能需要处理最大超q?56个ƈ发请?span>?/span>服务?/span>可能需要增加MaxClients的倹{内存比较小的机器则需要减MaxClients的g保证服务?/span>不会崩溃。更多关于调整进E生的问题请参见性能斚w的提C?/p>
支持混合的多U程多进E的多\处理模块
* MaxSpareThreads和MaxClients设ؓ相同的?/p>
ServerLimit 16
StartServers 2
MaxClients
150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild
25
在Unix中,Z能够l定80端口Q父q程一般都是以rootw䆾启动Q随后,Apache以较低权限的用户建立子进E和U程。User和Group指o用于讄Apache子进E的权限。虽然子q程必须对其提供的内Ҏ有读权限Q但应该可能给予它较少的特权。另外,除非使用了suexec
Q否则,q些指o讄的权限将被CGI脚本所l承?/p>
指o
StartServers指o讄?span>服务?/span>启动时徏立的子进E数量。因为子q程数量动态的取决于负载的轻重Q所有一般没有必要调整这个参数?/p>
指o
MinSpareServers指o讄I闲子进E的最数量。所谓空闲子q程是指没有正在处理h的子q程。如果当前空闲子q程数少于MinSpareServers
Q那么Apache以最大每U一个的速度产生新的子进E?br />只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏L?/p>
指o
MaxSpareServers指o讄I闲子进E的最大数量。所谓空闲子q程是指没有正在处理h的子q程。如果当前有过MaxSpareServers数量的空闲子q程Q那么父q程杀d余的子进E?br />只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏L。如果你该指o的D|ؓ比MinSpareServers,Apache会自动其修改?MinSpareServers+1"?/p>
指o
MaxClients指o讄了允许同时伺服的最大接入请求数量。Q何超qMaxClients限制的请求都进入等候队列,直到辑ֈListenBacklog指o限制的最大gؓ止。一旦一个链接被释放Q队列中的请求将得到服务?br />对于非线E型的MPM(也就是prefork)QMaxClients表示可以用于伺服客户端请求的最大子q程数量Q默认值是256。要增大q个|你必d时增大ServerLimit
?br />对于U程型或者合型的MPM(也就是beos或worker)QMaxClients表示可以用于伺服客户端请求的最大线E数量。线E型的beos的默认值是50。对于合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要MaxClients增加到超q?6个进E才能提供的时候,你必d时增加ServerLimit的倹{?/p>
指o
MaxRequestsPerChild指o讄每个子进E在其生存期内允怼服的最大请求数量。到达MaxRequestsPerChild的限制后Q子q程会l束。如果MaxRequestsPerChild?0"Q子q程永q不会结束?br />不同的默认?br />在mpm_netware和mpm_winnt上的默认值是"0"?br />MaxRequestsPerChild讄成非零值有两个好处Q?br />*
可以防止(偶然?内存泄漏无限q行Q从而耗尽内存?br />*
l进E一个有限兽命,从而有助于?span>服务?/span>负蝲减轻的时候减活动进E的数量?/p>
指o
q个指o讄了每个子q程建立的线E数。子q程在启动时建立q些U程后就不再建立新的U程了。如果用一个类gmpm_winnt只有一个子q程的MPMQ这个数D_大,以便可以处理可能的请求高峰。如果用一个类gworker有多个子q程的MPMQ每个子q程所拥有的所有线E的L要够大Q以便可以处理可能的h高峰?br />对于mpm_winntQThreadsPerChild的默认值是64Q对于其他MPM?5?/p>
指o
q个指o讄了每个子q程可配|的U程数ThreadsPerChild上限。Q何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效?br />使用q个指o时要特别当心。如果将ThreadLimit讄成一个高出ThreadsPerChild实际需要很多的|会有过多的׃n内存被分配。如果将ThreadLimit和ThreadsPerChild讄成超q系l的处理能力QApache可能无法启动Q或者系l将变得不稳定。该指o的值应当和ThreadsPerChild可能辑ֈ的最大g持一致?br />对于mpm_winntQThreadLimit的默认值是1920Q对于其他MPMq个值是64?br />注意Q?br />Apache在编译时内部有一个硬性的限制"ThreadLimit
"(对于mpm_winnt?ThreadLimit ")Q你不能越q个限制?/p>
指o
对于preforkMPMQ这个指令设|了MaxClients最大允讔R|的数倹{对于workerMPMQ这个指令和ThreadLimitl合使用讄了MaxClients最大允讔R|的数倹{Q何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效?br />使用q个指o时要特别当心。如果将ServerLimit讄成一个高出实际需要许多的|会有过多的׃n内存被分配。如果将ServerLimit和MaxClients讄成超q系l的处理能力QApache可能无法启动Q或者系l将变得不稳定?br />对于preforkMPMQ只有在你需要将MaxClients讄成高于默认?56的时候才需要用这个指令。要此指o的g持和MaxClients一栗?br />对于workerMPMQ只有在你需要将MaxClients和ThreadsPerChild讄成需要超q默认?6个子q程的时候才需要用这个指令。不要将该指令的D|的比MaxClients
和ThreadsPerChild需要的子进E数量高?br />注意Q?br />Apache在编译时内部有一个硬限制"ServerLimit
"(对于preforkMPM?ServerLimit ")。你不能越q个限制?/p>
make clean
vi server/mpm/worker/worker.c
修改define
DEFAULT_THREAD_LIMIT 64 ?00
?你要讄的ThreadsPerChild的|修改默认ThreadsPerChild
Q?br />修改define
DEFAULT_SERVER_LIMIT 16 ?25
?你要讄的ServerLimit|修改默认ServerLimit|
:wq
./configure
--prefix=/usr/local/apache --with-mpm=worker
make
make install
cd
/usr/local/apache/conf
vi httpd.conf
修改
StartServers
2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads
75
ThreadsPerChild 25
MaxRequestsPerChild 0
内容?br />
StartServers
3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads
200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
修改
serveradmin servername{信息ؓ正确配置
:wq
/usr/local/apache/bin/apachectl
start
vi /etc/rc.loacl
d /usr/local/apache/bin/apachectl
start
PS:
用netstat -an|grep ESTABLISHED|grep 202.100.85.249:80 |wc -l
看连接数Q用worker模式后,httpdq程数变不能反映tcpq接?/p>