优化在VPS上运行的apache / php / mysql以减轻负载


17

有关在具有512m RAM的VPS上优化apache / mysql服务器的问题。在正常负载下,所有组件运行速度很快,没有连接滞后。但是,当我们遇到交通繁忙的日子(访问量超过5万)时,网站就会爬行,并且需要30秒以上的时间才能从apache取回内容。

该站点在Expression Engine(CMS)(PHP)上运行,我遵循了它们的繁重优化指南。我已经在Google上搜索并跟踪了很多运气,使其运到现在,但是我需要获得恒定的响应时间。

我认为这与此处的“优化低内存”问题有所不同,因为我有足够的RAM(用于我要执行的操作),我只需要使服务器在高负载下不会阻塞即可。

有什么建议吗?


1
只是后续操作-切换到Lighttpd,已经很不同了,处理负载要好得多。我敢肯定,还会有更多的优化,但这很有帮助。而且,由于有人问我,我使用的是我从APC那里挑选的加速器。
鹦鹉

Answers:


18

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

  1. 如前所述,高级PHP缓存(APC)。这就是我们在Yahoo!上使用的。还有其他类似的项目,但这是拉斯莫斯的孩子。
  2. FastCGI而不是mod_php。由于mod_php通常是最快的,因此存在争议。但是,我假设您有一台Apache服务器,可同时提供动态PHP内容和静态资产(JS,CSS,Flash,图像,PDF等)。对这些静态资产的请求不需要消耗那么多的内存,但是由于PHP是一个模块,因此它在每个Apache线程中都存在。

对于Apache:

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

您可能还会考虑从Apache切换到LighttpdNginx。我爱Apache。我使用了许多高级功能中的傻瓜功能。我接受它的开销,因为我需要它提供的东西。对于普通的LAMP堆栈,它远远超出了需要,而且浪费了资源。

对于MySQL:

  1. 当花费在分析和纠正查询上时,您的优化工作将获得10倍的回报,而无需调整my.cnf值。我并不是说正确设置缓存,连接等并不重要……但是对于大多数人来说,这只是问题的9%。
  2. 在进行质量检查时,请在登台/ dev mysqld上打开常规查询日志,以捕获所有发送的查询。(不要在您的生产mysql服务器上这样做!)
  3. 使用EXPLAIN分析查询。特别是如果您使用的是带有ORM的框架(抽象了数据库,使您无法编写自己的SQL),则需要清理无关的JOIN,不带WHERE子句的SELECT,诱导“使用文件排序”的ORDER BY和查询不使用索引。
  4. 如果您使用的是MySQL 5.1,请利用查询分析器

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

我引用了10篇很棒的参考书。这些东西应该让你嗡嗡作响。请让我们知道结果。


6

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

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

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

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

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

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

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

注意:在RAM中使用PHP文件和会话文件时,您几乎不会碰磁盘!

在Apache中使用expires_module,这样浏览器将缓存大多数内容。

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文件!相反,将它们硬编码在vhost配置文件中!会彻底消除/减少所有http请求的磁盘检查...的确加起来。

Options FollowSymLinks 
AllowOverride None

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

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

5

我想到了几件事。

操作码缓存始终是一个好主意。与APC相比,我更喜欢http://eaccelerator.net/。如果您一直没有使用APC进行开发,那么尝试添加它几乎总是很痛苦的。加速器虽然不那么花哨,但似乎起作用。

反向代理也是一个好主意,但是您需要注意RAM使用情况。我发现带有mpm-worker的Apache 2.2自己占用了大量RAM。在您的情况下,我建议使用诸如Nginx之类的较轻的东西,并以FASTCGI的形式运行带有PHP的Apache或按进程保留它。使用Varnish,Squid,Nginx等的想法是让它们提供静态内容,处理用户连接,并仅将PHP请求传递给您视为应用服务器的Apache。

如果您运行的是MySQL 5.1的较新版本,例如至少5.1.24,则现在可以访问亚秒级的慢日志。我将在1或2处开始long_query_time,然后在真正长的句柄上将其降低到0.5。网上也有很多关于MySQL的常规调整信息,但是您没有太多的RAM。您是否增加了默认设置?大多数默认的my.cnf文件配置为使用大约64MB的RAM。至少我会将key_buffer从16MB提高到64MB。

另外,您是否使用Myisam或Innodb表?如果要将会话保留在数据库中,则需要将会话表更改为Innodb(或改为使其成为cookie),而不是将其保留为Mysiam表,该表执行表级锁定而不是行级锁定。基本上,任何表写入量超过80%的读取都超过20%的表都可以迁移到Innodb。请记住,您需要在Myisam表和Innodb表之间平衡RAM的数量,因为每个缓冲区都是单独配置的。

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

嗯,我的帖子有点混乱,但是给了您很多看的地方。祝好运。


2
  • 对apc这样的php使用操作码缓存。
  • 使用http加速器(如鱿鱼或清漆)。

1

在内存不足的情况下(对于高流量服务器,512Mb较低),值得考虑选择Web服务器和DB引擎。

Lighttp开箱即用,比经过大量调整后通常可以制作的Apache更轻巧,甚至还有更轻巧的选择。如果您依赖的Apache其他服务器不支持的功能,这当然是不可能的。

sqlite比MySQL更紧密,在许多情况下也更快。检查您使用的引擎是否也支持此功能,是否可以尝试。

另一个选项(简单选项)是,如果您愿意的话,可以在VM中获得更多RAM。


1

除了此处的出色建议之外,还应注意,并非所有VPS都是平等的。根据我的经验,PHP占用大量CPU资源。

EC2上的nginx / apc / phpfpm / mysql(local)的Wordpress AB基准测试(ab -n 500 -c 25 http://domain.com/index.php)导致入门级“ 2GB”每秒收到约2个请求RAM / 1计算单元服务器”。

在512MB Rackspace Cloudserver上针对相同的确切堆栈(通过脚本部署到相同的OS)运行相同的Benchmark,返回〜80 req / second。因此,此基本实验的RAM减少了4倍,性能提高了40倍。

在AB期间查看顶部,您会发现EC2根本无法处理并发,并且会立即达到100%CPU负载并锁定。如果在相同的基准测试期间查看512MB服务器(虚拟四核CPU)的顶部,这些核心将达到约60%的负载并顺利地处理基准测试。

VPS极易旋转,无需承诺即可关闭,将您的VM / VPS所驻留的基础架构进行测试也无济于事!

编辑1:另外,EC2的“ High CPU”小型实例只能产生大约10 / req秒的速度,而CPU仍然是瓶颈。我的结论是,为了牺牲EC2的稳定性/鲁棒性,您会牺牲性能,当然,有许多用例需要这种环境。


另外,请考虑使用nginx(今天发布的v.1)。wordpress.com与nginx交换了litespeed配置,因此它显然是一个功能强大的Web服务器。
iainlbc 2011年

Nginx确实令人印象深刻。我只希望它可以从.htaccess文件读取mod_rewrite规则。
马丁·海姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.