优化运行在VPS上的apache / php / mysql的重负载

关于优化一个VPS有512m内存的apache / mysql服务器的问题。 在正常的负载下,一切运行速度都很快,没有连接延迟 但是,当我们得到我们繁忙的交通日(50k +访问)的网站爬行,并需要30秒+从apache获取内容。

该网站运行在expression式引擎(CMS)(在PHP),我已经遵循他们的重载优化指南。 我已经search了一些,并跟随了一些运气阿帕奇,让它到现在,但我需要得到不断的响应时间。

我认为这是不同于'优化低内存'的问题在这里,因为我有足够的内存(我正在做什么),我只需要让服务器不要在重负载下窒息。

任何推荐?

对于PHP来说,有两件重要的事情会增加容量:

  1. 先进的PHPcaching (APC)如上所述。 这是我们在雅虎使用的。 还有其他类似的项目,但这个是Rasmus的宝贝。
  2. FastCGI而不是mod_php。 关于这个问题有争论,因为mod_php通常是最快的。 但是,我认为你有一个Apache服务器提供dynamicPHP内容和静态资产(JS,CSS,Flash,图像,PDF等)。 对这些静态资产的请求不需要消耗尽可能多的内存,但是因为PHP是一个模块,所以它在每个Apache线程中。

对于Apache:

  1. 使用工人MPM
  2. 启用KeepAlive

你也可以考虑从Apache转换到Lighttpd或Nginx 。 我爱Apache。 我用它的许多先进function中的傻瓜。 我接受它的开销,因为我需要它提供的东西。 对于常见的LAMP堆栈来说,这是多余的,浪费资源。

对于MySQL:

  1. 花在分析和纠正查询上时,您的优化工作将得到10倍的回报,而不是调整您的my.cnf值。 我并不是说让caching,连接等正确无关,但对大多数人来说,这只是问题的9%。
  2. 在您的QA期间,打开暂存/ dev mysqld上的常规查询日志以捕获所有发送的查询。 (不要这样做你的生产MySQL服务器!)
  3. 使用EXPLAIN分析查询。 特别是如果你正在使用一个带有ORM的框架(抽象出数据库并且不让你编写你自己的SQL),你将需要清除多余的JOIN,没有WHERE子句的SELECT,引发'使用filesort'的ORDER BYs和查询不使用索引。
  4. 如果您正在使用MySQL 5.1, 请利用查询分析器 。

其他值得考虑的工具是mk-visual-explain

我列举了10个很好的参考。 这些事情应该让你哼唱。 请让我们知道如何结果。

移动你的PHP会话文件到一个tmpfs ,使用APC(或其他),并删除所有你不需要的PHP模块。 删除所有不需要/使用的Apache模块。

创build一个tmpfs(RAM中的一个目录!)

mkdir /tmpfs; chmod 777 /tmpfs mount -t tmpfs -o size=256M tmpfs /tmpfs 

/ etc / fstab中添加下面的行以在重新启动时创build它!

 tmpfs /tmpfs tmpfs size=256m,mode=0777 0 0 

/etc/apache2/php.ini中调整以将会话存储在RAM(tmpfs)中!

 session.save_handler = files session.save_path = "/tmpfs" 

注意:将您的PHP文件和会话文件放在RAM中,您几乎不会碰到磁盘!

在Apache中使用expires_module ,所以浏览器会caching大部分的东西。

 ExpiresActive On ExpiresDefault "access plus 90 days" ExpiresByType image/gif "access plus 90 days" ExpiresByType image/ico "access plus 90 days" ExpiresByType image/png "access plus 90 days" ExpiresByType image/jpeg "access plus 90 days" ExpiresByType image/x-icon "access plus 90 days" ExpiresByType text/css "Access plus 90 days" ExpiresByType text/html "Access plus 90 days" ExpiresByType application/x-shockwave-flash "Access plus 90 days" ExpiresByType application/x-javascript "Access plus 90 days" 

不要使用.htaccess文件! 相反,硬编码他们在虚拟主机configuration文件! 将彻底消除/减less每个HTTP请求的磁盘检查…它真的加起来。

 Options FollowSymLinks AllowOverride None 

vhost.conf文件中使用的.htaccess 示例

 <Directory /home/user/www/site.com/secure> Order Allow,Deny Deny from All </Directory> 

一些事情浮现在脑海中。

操作码caching总是一个好主意。 我更喜欢通过APC http://eaccelerator.net/ 。 如果你一直没有用APC来开发,那么尝试添加它几乎总是很痛苦的。 Eaccelerator虽然不像花式似乎工作。

反向代理也是一个好主意,但是你需要观察RAM的使用情况。 我发现Apache 2.2与mpm-worker自己占用相当数量的RAM。 在你的情况下,我会推荐一些像Nginx一样轻的东西,并用PHP运行Apache作为FASTCGI,或者按照stream程离开它。 使用Varnish,Squid,Nginx等的想法是让它们为静态内容提供服务,处理用户连接,只将PHP请求传递给你认为是应用服务器的Apache。

如果您运行的是最新版本的Mysql 5.1,至less5.1.24版本,您现在可以访问第二个慢速日志。 我会开始long_query_time在1或2,然后把它下降到0.5,因为你得到一个真正长的句柄。 Mysql的networking上也有很多一般的调优信息,但是你没有RAM做太多。 你是否增加了默认设置? 大多数默认的my.cnf文件被configuration为使用大约64MB的RAM。 至less我会把key_buffer从16MB提高到64MB。

另外你使用Myisam或Innodb表? 如果你保持会话在数据库中,你会想要将会话表更改为Innodb(或者改为使用cookie),而不是保留一个Mysiam表,该表执行表级locking而不是行级locking。 基本上任何超过20%的表格写入80%的读数是迁移到Innodb的候选人。 请记住,您需要平衡Myisam表和Innodb表之间的RAM数量,因为每个表的缓冲区都是单独configuration的。

最后,如果价格更便宜或价格大致相同,另一个512MB的内存将在您的设置中有很长的路要走,甚至还有另外512MB的VPS来运行Mysql。 我实际上倾向于第二个实例,因为这会使可用磁盘IO增加一倍。 VPS服务器的问题之一是您的IO不受同一物理服务器上的其他人的保护。

嗯,我的post全是一点点,但给你很多地方看。 祝你好运。

  • 使用一个操作码caching为PHP像APC。
  • 使用像乌贼或清漆的http加速器。

在低内存情况下(512Mb较低,对于高stream量的服务器),值得考虑您select的Web服务器和数据库引擎。

Lighttp比起平常经常调整的Apache而言更加轻便,而且甚至还有更轻的select。 如果您所依赖的Apachefunction在其他服务器中不受支持,则这当然是不可能的。

sqlite比mySQL更紧密,并且在很多条件下也更快。 检查你正在使用的引擎是否支持这个以及如果它尝试。

另一个选项,简单的select是,如果你能负担得起,在虚拟机中获得更多的内存。

除了这里的伟大build议之外,应该指出的是,所有的VPS都不是一成不变的。 根据我的经验,PHP变成CPU很重。

在EC2上的nginx / apc / phpfpm / mysql(本地)的Wordpress AB基准testing(ab -n 500 -c 25 http://domain.com/index.php )在入门级产生了2个请求/秒“2GB RAM / 1计算单元服务器“。

在512MB Rackspace Cloudserver上运行相同的基准testing(与脚本部署到相同的操作系统)相同,返回约80次/秒。 因此,在这个基本的实验中,4倍的内存,40倍的性能。

在AB期间查看顶部,你会发现EC2根本无法处理并发性,并立即触发100%的CPU负载并locking。 在512MB服务器(虚拟化四核CPU)的顶部,在相同的基准testing中,核心会达到~60%的负载,并顺利处理基准。

VPS是非常容易旋转起来,没有承诺closures,这不会伤害到你的虚拟机/ VPS驻留在基础设施的testing!

编辑1:另外,EC2的“高CPU”小实例只能够产生〜10 / req秒,CPU仍然是瓶颈。 我的结论是,为了EC2的稳定性和可靠性而牺牲性能,当然还有许多需要这种环境的用例。