关于优化一个VPS有512m内存的apache / mysql服务器的问题。 在正常的负载下,一切运行速度都很快,没有连接延迟 但是,当我们得到我们繁忙的交通日(50k +访问)的网站爬行,并需要30秒+从apache获取内容。
该网站运行在expression式引擎(CMS)(在PHP),我已经遵循他们的重载优化指南。 我已经search了一些,并跟随了一些运气阿帕奇,让它到现在,但我需要得到不断的响应时间。
我认为这是不同于'优化低内存'的问题在这里,因为我有足够的内存(我正在做什么),我只需要让服务器不要在重负载下窒息。
任何推荐?
对于PHP来说,有两件重要的事情会增加容量:
对于Apache:
你也可以考虑从Apache转换到Lighttpd或Nginx 。 我爱Apache。 我用它的许多先进function中的傻瓜。 我接受它的开销,因为我需要它提供的东西。 对于常见的LAMP堆栈来说,这是多余的,浪费资源。
对于MySQL:
其他值得考虑的工具是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全是一点点,但给你很多地方看。 祝你好运。
在低内存情况下(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的稳定性和可靠性而牺牲性能,当然还有许多需要这种环境的用例。