Press "Enter" to skip to content

512M VPS上Apache性能和内存优化

最近廉价的VPS有越来越流行的趋势,但是很多廉价的VPS很多只有512M,甚至更少的内存,而Apache和MySQL这些建站必备的软件,又偏偏都是内存消耗大户,所以如何优化本来就不多的内存空间,就显得额外重要了。

注:本文是抓抓自己的经验之谈,没有什么权威性,欢迎理性的讨论和评价,拒绝出现诸如Nginx比Apache牛X很多之类的口水仗,谢谢。

虽然抓抓最喜欢和最熟悉的Linux发行版是Gentoo,但是通常在使用VPS时,我还是会安装主流的CentOS 5 32Bit版本。选择CentOS是因为CentOS是从Redhat演变而来,所以对大多数服务器软件的兼容性还算不错,比如Kloxo就可以在CentOS下面进行简易的一键安装,等等。而32Bit是因为可以避免使用64Bit的发行版而造成的诸多稀奇古怪的问题,相当稳定而且性能几乎没有什么差别,并且因为内存不超过4G而无需用到64Bit的寻址。

好了,言归正传。对于低端的VPS来说,因为内存本来就不是非常充足,所以如果你对Linux服务器平台的架设非常熟悉的话,完全可以不用什么控制面板;如果是一个初学者,出于方便的考虑,可以安装轻型的Kloxo控制面板,功能强大,内存占用少(大约4M~8M),除了功能排版有些混乱之外,其他该有的功能都有,不该有的功能也有,非常实用。

在优化Apache/MySQL之前,首先可以关掉一些不必要的后台守护进程,比如ClamAV(一个杀毒软件),你可以运行chkconfig –list查看哪些后台守护进程是不必要的,当然很多东西取决于你的具体应用。比如如果你不是经常登陆Kloxo,可以把Kloxo关闭;如果不发邮件,可以关闭QMail,等等。如果碰到一些自己不熟悉的进程,千万别忙着下手,先去Google一下,以免出现其他预料之外的问题。关闭自动启动可以使用chkconfig 守护进程名 off,但是内存中已经运行的守护进程不会被关闭,需要运行service 守护进程名 stop进行关闭。

接下来是Apache的优化。这个东西在VPS高效运行的时候,会占去至少一半以上的内存。通过修改/etc/httpd/conf/httpd.conf配置文件,用户可以进行内存占用和服务性能之间的微调以达到一个平衡的状态。

httpd.conf里面的几个关乎内存占用和性能的价格重要参数如下(仅用于常见的Apache Prefork模式):
StartServers Apache启动时创建的子进程数量
MinSpareServers 最小空闲子进程数量
MaxSpareServers 最大空闲子进程数量
ServerLimit (此参数只要不比MaxClients小就可以了)
MaxClients 最大同时能够处理的请求数
MaxRequestsPerChild 每个子进程处理多少请求之后自动结束,并且释放内存
KeepAlive 是否保持连接
MaxKeepAliveRequests 并发保持连接的最大数量
KeepAliveTimeout 保持连接超时设置

在Prefork工作模式下,Apache在启动之后会先创建StartServers设置的子进程数量,然后每隔一秒以指数形式(2^)创建更多的子进程,直到子进程的总数达到MinSpareServers设置的数量为止。在Prefork模式下面,Apache无需等到连接请求时才生成新的子进程,所以在响应速度上会有更好的性能。同时MaxSpareServers参数规定了Apache最多能够存在的空闲进程数量,在空闲进程数量超过MaxSpareServers设置后,Apache会自动关闭部分空闲进程,以避免过多的空闲进程占用大量的内存。所以将MinSpareServers和MaxSpareServers的参数改小,会减少VPS内存的占用,但同时也会降低VPS的性能。但是对于只有512M内存的低端VPS来说,服务器的稳定性远比性能更为重要,性能再好,打不开网站也是白搭。

MaxClients参数是对性能和内存占用影响最大的参数,直接关系到并发访问的数量,超过MaxClients设置的额外连接请求,需要等待现有连接断开之后,才能进行正常的连接。所以MaxClients如果设置的太小,会造成长时间的等待,进而会严重影响访问者的心情;但是如果设置的太大,在有大量并发访问的情况下,Apache会很快用光所有的VPS内存,导致VPS宕机。所以MaxClients参数需要进行仔细的计算。对于一台512M的VPS来说,通常CentOS启动后,加上Kloxo和MySQL,会占用大约80~100M的内存,所以能够供apache使用的内存不能超过400M。而通过top命令,可以看到一般一个httpd进程会占用大约4M的内存(在Prefork模式下面),所以在这样的情况下,MaxClients的设置不宜超过150。150个并发连接,对于普通的网站来说,已经是足够了,如果你的网站访问量非常之大,那么,直接入手高端服务器即可。

MaxRequestsPerChild参数同样会影响性能和内存。影响性能的地方在于,如果将MaxRequestsPerChild的值设置的太小,那么Apache需要不停的创建新的子进程来替代因为请求数达到限额的旧进程,而结束旧进程和创建新进程都需要消耗CPU时间,所以大量的结束、创建动作会让一个VPS消耗不少的CPU,而通常一个VPS的CPU也是有限制的,所以过多的CPU消耗会明显影响VPS的性能;反过来说,如果MaxRequestsPerChild设置成太大,或者干脆设置成0(不限制),那么如果在进程寿命结束前,碰到内存溢出之类的错误,VPS也会很快因内存消耗完毕而宕机。

KeepAlive参数,是否保持链接,通常设置成On(打开)会提高性能,但是同时将KeepAliveTimeout超时设置的小一点,比如5s,会让整个VPS显的更有效率。因为当KeepAliveTimeout设置的过大的时候,一个子进程在超时之前将无法服务更多的用户,这样势必Apache需要打开更多的进程,进行会消耗本来就不充裕的VPS内存。

附抓抓的512M VPS的httpd.conf相关参数供参考:
StartServers 5
MinSpareServers 5
MaxSpareServers 20
ServerLimit 128
MaxClients 128
MaxRequestsPerChild 1000
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

在设置完参数之后,还需要精简一部分的模块(LoadModule)以减少不必要的内存占用。根据俺目前在用的经验,除了下面这些模块,其他都不是必须的:
mod_authz_host.so
mod_log_config.so
mod_expires.so
mod_deflate.so
mod_headers.so
mod_setenvif.so
mod_mime.so
mod_autoindex.so
mod_negotiation.so
mod_dir.so
mod_alias.so
mod_rewrite.so
mod_proxy.so(网上其他人的经验是可以不加载这个模块,不过抓抓试过启动apache会出错。。。)

保存httpd.conf,重启Apache即可生效。

在优化完Apache之后,还需要进行MySQL的优化,主要是修改/etc/my.cnf来达到降低MySQL内存占用的目的。

在/etc/my.cnf的[mysqld]段里面添加:
skip-locking
skip-bdb
skip-innodb

同样,保存后重启MySQL生效。

参考文献:
http://www.blogfans.info/2010/512m-vps-cpu-ram-optimize/

2 Comments

  1. doubleyang 2014-04-18

    我用的阿里云 CentOS 6.3 64位 ECS 和 EZHTTP 的 LAMP 一键包,优化后依旧内存溢出… 现已转投 LNMP 了,目前感觉不错~

    • bear 2014-04-18

      EZHTTP听都没听过,这些小众的一键包我也是绝对不会去用的。如果有一天lnmp不更新了,我就自己更改作者的代码去更新

Leave a Reply

Your email address will not be published. Required fields are marked *