如何粗略估算LAMP应用容量?

时间:2009-09-30 15:56:38

标签: php mysql linux performance lamp

我的LAMP应用程序正常运行,但每天的用户数量都在增加。一天早上我不想惊讶地发现一切因为超载而破裂。有没有办法粗略估计LAMP的容量是多少?

我知道一份完整的详细报告是很多值得研究的书籍,但我可以通过一些快速的试金石来判断事情是否正常。

所以说对于mysql组件,我怎么知道它需要多少负载呢?是30%的容量,50%?等。

我的阿帕奇相同。虽然我有一种感觉,DB会在apache之前死掉。


也许我原来不太好,因为英语不是我的母语。我真正想要的是一种衡量当前负载的方法。然后有一种方法来估计基于该负载,在失败之前我还能走多远。 (这应该针对每个组件单独完成,mysqld,httpd)

2 个答案:

答案 0 :(得分:5)

如果您的网站需要cookie等,ab会有点烦人,ab太简单了。

基本上,根据我修复几个爆炸性PHP网站的经验,它通常是这样的:

1)人们使用MySQL

你可以完全使用MySQL,facebook和flickr吗(mysql粉丝喜欢那些)如果你知道GOTCHAS是:

  • 如果你有一个非只读的MyISAM表,任何长于100 us的查询(甚至选择)你已经死了

在我修复的一个网站上,这家伙租用了一个双四核服务器,因为“他的网站需要电源”。我看看他的网站,我用>看看我以前的网站100K成员和一个在Via C7微型半pizzabox服务器上运行的洪流跟踪器,我告诉他,你的网站在地下室的Celeron 300上运行正常,这甚至是矫枉过正,我可以把它租给你一半Xeon的价格,哈哈。

事实证明这个家伙是一个优秀的开发人员和一个真正的好人,但他吮吸MySQL,所以他的网站有典型的搜索查询从地狱可以杀死任何网站:

  • 来自地狱的每秒10个搜索查询(他的非法warez网站上有300K成员)
  • 从地狱搜索查询需要大约0.1 - 0.2秒
  • 对同一个MyISAM表进行并发更新的一小部分流,以增添趣味性

=>所有查询的总序列化(MyISAM写锁定)。 1核100%,7核闲置,loadavg> 1000(是的,他使用的是apache),页面时间> 30秒,作品。

修复很简单:从地狱优化搜索查询,修复下面的点2),切换到InnoDB,切换到lighttpd。 loadavg下降到0.02

2)更新

没有人对页面计数器感兴趣。 每个页面视图的问题1更新,你已经死了。 添加一些MyISAM以获得更多效果。也是InnoDB的杀手,不是关于锁定,而是关于同步磁盘IO等待。

3)FULLTEXT

  • 由于锁定,MyISAM无法用于读写表。
  • MyISAM和ramdisk一样可靠(事实上,更少:你需要一个操作系统崩溃来破坏ramdisk,破坏MyISAM表只需要一个MySQL崩溃或只是同时击中它太多,你会得到“未知的表引擎错误“,我多次看到这个)
  • InnoDB上没有FULLTEXT
  • FULLTEXT索引中的任何插入都会触发几乎完整的索引重建(当我插入一个 论坛帖子正在重建400 MB的索引)

==>如果您需要全文索引,性能和可靠性,请使用Sphinx或Xapian。

我没有尝试过Sphinx(人们对它说好话),但Xapian很乐意快速搜索4GB文本。

4)人们使用apache。

这很好地结合了以上几点。

与像lighttpd这样的CPU使用率不可检测的正常服务器不同(糟糕的Via C7服务100个HTTP点击/ s而lighttpd使用的CPU不到1%),apache会杀死你的盒子。

当MySQL开始死亡(它很容易死亡)时,客户端开始疯狂地攻击F5,很快就会有大约1000个apache进程,每个进程都有一个PHP解释器,每个PHP解释器都有一个空闲的MySQL连接,等待一个MyISAM锁定,除了一个,它正在对页面视图计数器进行一些简单的更新,但这需要一些时间,因为服务器已经进行午餐交换,因为1000 apache和1000个php和1000个mysql进程。

Lighttpd对静态页面不使用cpu。 lighttpd使你的CPU饱和的唯一方法是使用apachebench以20K请求/ s的速度点击它。然后Lighttpd与一些人交谈,比如10个php-fcgi后端(每个核心2-4个好),它与一些MySQL连接进行通信。结果一切都快得多,当超载时,它会优雅而不是爆炸性地降级。

要了解原始问题,您肯定想要分析您的SQL查询。将查询日志添加到您的PHP应用程序中(仅显示给您),查询列表和时间,以及从PHP脚本开始到结束的时间(页眉/页脚包含是一个很好的地方)这一点)。

对于一个复杂的页面(不包括搜索),你期望大约3毫秒的MySQL和3毫秒的PHP,这是一个很好的目标。当然,您需要一个PHP编译的代码缓存。

答案 1 :(得分:4)

对于当前的负载,您可以做几件事。最昂贵但最详细的答案将通过诸如“Gomez”之类的企业应用程序提供。

但是,如果您希望自己执行此操作,请参阅下面的我之前的答案或使用shell实用程序,例如:htop,top,w,并使用Apache服务器状态

问题修订前的前一个答案:

您要求的有时称为应用程序分析。

您需要创建一个粗略的内存公式,如:

httpd ram + php内存使用量+ mysql进程使用量=总请求内存占用量

您还需要一个CPU配方,但您也可以在负载测试期间看到顶部。

Apache有'ab'命令。

“ab是用于对Apache超文本传输​​协议(HTTP)服务器进行基准测试的工具。它旨在让您了解当前Apache安装的执行情况。这特别显示了您的Apache安装能够达到每秒的请求数量服务。“ http://httpd.apache.org/docs/2.0/programs/ab.html

这是一个通用的'ab'基准命令行:

ab -n 10 -c 1 http://www.yoursite.com/
# qty 10 total requests, 1 request at a time

策略是从网页请求到完成测试应用程序上的每个进程(用户)负载。如果您可以确定每个请求使用多少内存Apache,PHP和MySQL,那么您可以快速识别系统容量。

您可能必须使用混合的诊断工具(如vmstat或top或iostat或ps等)来快照系统要求的系统请求。

最后,您将要安装Xdebug。此工具将帮助您分析应用程序的php端。 http://xdebug.org/

以下是IBM关于安装Xdebug的教程:

http://www.ibm.com/developerworks/opensource/library/os-php-fastapps2/

相关问题