WDCP中Apache的不合理配置与小内存VPS内存占用优化的一点经验

  • A+
所属分类:WDCP相关

小内存VPS指的是512MB内存或以下的VPS。现在apache2一般运行于perfork模式, 可以使用httpd -l来确定当前使用的MPM是prefork.c,还是Worker.c。prefork模式下的默认配置可能会使VPS内存的使用出现问题。本人在调试 一个512MB内存的VPS时开始时总是发现内存占用不断升高,并在很短的时间内最终耗尽内存。使用wdcp也是出现这样的问题,安装wdcp后并开通网 站后发现内存占用会逐步升高,最后直至耗尽。设置mysql优化的参数为“小内存VPS(256-512mb)”后并没有出现改观。中间又换了其他几个免 费控制面板,也不太好用。通过万能的搜索引擎,找到了问题 的解决方法,那就是对perfork模式参数进行调优,使其适应小内存环境。这个解决方法在安装wdcp面板的VPS上通过,方法分享出来,供参考:

调试方法:修改apache配置文件httpd.conf中mpm_prefork_module(不同的主机控制面板可能该配置文件所处的目录不同)各字段。

对于安装wdcp的VPS,修改的文件是/www/wdlinux/httpd-2.2.22/conf/httpd-wdl.conf

在httpd-wdl.conf中找到,这里就是apache在prefork模式下的参数段。

先来了解各字段的含义:

ServerLimit 最大客户数,2000是这个参数的最大值,要放到最前面才会生效

StartServers 服务器启动时建立的子进程数量,指定服务器启动时建立的子进程数量,prefork默认为5.

MinSpareServers 最小空闲子进程数,空闲子进程的最小数量,默认为5.如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程.此参数不要设的太大.

MaxSpareServers 设置空闲子进程的最大数量,默认为10.如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程.此参数 不要设的太大.如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″.

MaxClients 限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256.任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务.要增大这个值,你必须同时增大ServerLimit。

在有些地方这个参数解释为:可以启动的APACHE进程数量上限。上面三个都不是特别重要,apache会自动调节,这个最重要,数目多少取决于你的 vps配置,大概一个apache进程8-18m的样子,自己算吧。开多了,小心vps崩溃。

MaxRequestsPerChild 每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束.如果MaxRequestsPerChild为”0″,子进程将永远不会结束.

知道了各字段含义,就可以根据系统资源重要是内存资源来设置合适的参数。对于小内存,自然各个字段数值要小,这样才能使得内存不会轻易耗尽,保证系统可以正常运行。

我们来看看WDCP的默认httpd-wdl.conf各项参数设置如下:

<IfModule mpm_prefork_module>
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0
</IfModule>

WDCP不合理配置的地方在于MaxClients和MaxRequestsPerChild。

MaxClients指定的是可以启动的APACHE进程数量上限,对于小内存的主机,这个设置(150个)很容易把内存用光。

MaxRequestsPerChild指定的是每个APACHE进程可以处理的最多请求次数,达到次数之后这个进程就会退出,然后重新开启新的进 程。这一点的意义在于,进程会出现内存泄露的问题,就是进程使用的内存会越来越多,越来越多,越来越多,越来越多,无法释放。设置 MaxRequestsPerChild后,进程重启动则可以解决。而WDCP中设置的为0,0的意思为,永不退出。

WDCP的实例截图如下:

大小: 172.09 K<br /><br />
尺寸: 497 x 404<br /><br />
浏览: 0 次<br /><br />
点击打开新窗口浏览全图

VPS内存占用优化的一点经验:

一、削减模块以及计算调整可供APACHE使用的内存

影响WEB服务器最大的因素即为内存,所以我们把它放在最前面

在默认状态下,Apache会分配最大256个并发客户端连接,或者256个进程(每一个都对应一个请求)。按照这种设置,一个流量巨大的网站会在 顷刻间崩溃(即使你假设每个进程占用5MB内存,那也需要1.3GB的内存来满足请求的数量)。如果不采取其它措施,系统会通过硬盘来尝试使用交换空间以 处理它无法在物理内存中完成的任务。

所以,我们需要修改httpd.conf,使它使用最小的模块集
修改httpd.conf文件,保留
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so
LoadModule fastcgi_module modules/mod_fastcgi.so

去掉其它的模块

我们配置的VPS服务器,系统加LAMP程序启动后总共在300M左右的内存,你可能希望要求50%的物理内存都供Apache使用,这样,你需要确定可以让httpd真正使用的内存数。

首先准确计算出apache占用的进程数
# ps -ef|grep httpd
root     21678     1  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
vuser    21679 21678  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
vuser    21714 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
vuser    21855 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
看apache是以什么用户启动的,然后我们再用

# ps -U vuser -u vuser u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vuser    29838  0.0  0.0 200404  5580 ?        S    11:29   0:00 /usr/local/apache//bin/fcgi- -k start
vuser    29845  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
vuser    29851  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
(注:一般是用# ps -U apache -u apache u察看,但我这里运行apache的是vuser用户)

我们看到单个httpd进程使用了7.6 MB的RSS(驻留集大小)内存以及最大为88M左右的VSZ(虚拟内存),这当然在很大程度上取决于你在Apache里加载和运行的模块数量。这决不是 一个固定的数字。由于这个数字里还包含了共享库包,所以不是100%的准确。我们可以认为RSS数字的一半是httpd线程真正使用的内存数,这可能还有 点保守,但是离我们的目的已经非常接近了,这样,我们HTTPD线呈使用的内存数即为8M/2=4M

说明:MinSpareservers和MaxSpareServers分别设置空闲子进程的最小和最大数量,StartServers设置了服务器启动时建立的子进程数量。

ServerLimit则是控制MaxClients所能使用的最大值。缩减MaxClients能让运行动态内容(比如:Drupal)的服务器 有很大的改变。如果你的VPS遭遇到流量的大幅增加,而你的MaxClients设置的太高的话,你的服务器将会无限循环工作于从物理内存交换页面到虚拟 内存中,最终导致宕机。一般计算适当的MaxClients值取决于你总共可用的系统内存除于每个Apache进程使用的内存。

计算MaxClient
MaxClients=(总内存-预留内存)/单个APACHE子进程使用的内存。
那么我们的1GRAM的VPS服务器的MaxClient即为:
MaxClients=(1024-512)/4=128个

设置MaxRequestsPerChild

MaxRequestsPerChild设置的是每个子进程可以处理的请求数。每个子进程在处理了MaxRequestsPerChild个请求后 将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:

1、可防止意外的内存卸漏;
2、在服务器负载下降的时侯会自动减少子进程数。

因此,可根据服务器的负载来调整这个值,如果非零的话,vps上个人认为1000左右是比较合适的。事实上这个值对Apache的性能影响不是很大。

下面来进行具体的配置修改。在httpd.conf中找到<IfModule mpm_prefork_module>,这里就是apache在prefork模式下的参数段。以下是本人在1G内存的VPS上常用的配置,该段各值修改为以下数值:

<IfModule mpm_prefork_module>
ServerLimit                    128
StartServers                  5
MinSpareServers            5
MaxSpareServers           20
MaxClients                      128
RequestsPerChild           1000
</IfModule>

最重要的占用内存的参数是标红的几个。

过上述设置之后,httpd子进程数保持在最小5个,多余的进程在处理请求超过1000销毁释放内存(这个数值不要设为0,否则http进程会一直不销毁),从而保证在正常流量下内存得以及时释放。这些数值可以根据需要适当调整,以适应内存大小。512MB内存VPS可适当减半。它们要根据你的VPS的大小和你的Apache进程大小等来决定。如果你的1个httpd占用20MB内存,则更需要降低MaxClients的数值修改后重启apache服务生效。

备注:
HostnameLookups最好设置为off,否则会带来延迟,因为对每一个请求都需要作一次DNS查询。如果你使用了任何”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主机名而不是IP地址),则代价是要进行两次DNS查询(一次正向和一次反向,以确认没有作假)。所以, 为了得到最高的性能,应该避免使用这些指令(不用域名而用IP地址也是可以的)。如果网站空间中没有使用 Options FollowSymLinks,Apache就必须执行额外的系统调用以验证符号连接。为了避免这种情况应该在所有地方都设置 FollowSymLinks。如果设置AllowOverride all,则Apache会试图对文件名的每一个组成部分都打开.htaccess,如无必要应该对文件系统中所有的地方都使用 AllowOverride None。在Apache2.0能够忽略将要被发送的文件的内容的时候(比如发送静态内容),如果操作系统支持sendfile() ,则Apache将使用内核提供的sendfile()来发送文件。使用sendfile可以通过免除分离的读和写操作来提升性能。我们可以通过设置 EnableSendfile on来开启它。

二、优化KeepAlive

KeepAlive允许你的访问者在同一个TCP连接上完成多个请求,理论上它有助于提升反应时间,因为你的访问者可以在同一个连接上请求你的网 页,图片和javascripts。遗憾地是,Apache对于每个请求都需要一个工作进程去处理。默认的每个工作进程将持续打开15秒来处理每个请求, 即使你的访问者已经不再使用它了!这也就意味着你的系统在任何时间都是缺少工作进程的。我们都希望我们那只有有限资源的小VPS能有确实在工作的工作进 程。实现的方法之一是关闭KeepAlive。在你的httpd.conf文件中找到下面的一行:

KeepAlive On
然后将它改变为:
KeepAlive Off

如果你的网站有大量的图片和javascripts,通常最好还是让KeepAlive保持打开,然后做些调整。
如果你决定让KeepAlive保持打开状态,改变默认的KeepAliveTimeout值就显得很重要了。它能避免连接没有在使用时仍然打开。在你的httpd.conf文件中找到下面一行:

KeepAliveTimeout 15
你只希望连接打开5秒钟,这已经足够用户打开大部分必须的文件。所以改变此行为:
KeepAliveTimeout 5

如果你希望让KeepAlive保持打开状态,同时应该增加MaxKeepAliveRequests。设置它为更大的值让每个连接可以处理更多的请求,从而增加效率。找到这行:

MaxKeepAliveRequests 100
改变为:
MaxKeepAliveRequests 200

三、调整Timeout

另一个较小的调整是改变TimeOut指令,这个调整可以得到小的性能提升和减小DDOS攻击的效果。这个指令用于设置Apache当接收新请求,处理请求和返回响应前需等待多少秒。找到这行:

Timeout 120
改变为:
Timeout 60

重启Apache,感受VPS的性能吧!即节约了建站成本,又提升了服务器质量,何乐而不为。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: