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

ero*_*ppa 6 php mysql linux performance lamp

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

我知道一份完整的详细报告是很多值得研究的书籍,但是我可以得到一些快速的试金石,看看情况是否正常.

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

我的阿帕奇也一样.虽然我有一种感觉,DB会在apache之前死掉.


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

peu*_*feu 5

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

基本上,从我修复多个爆破的PHP网站的经验来看,通常是这样的:

1)人们使用MySQL

如果您知道以下的GOTCHAS,则可以完全使用MySQL,facebook和flickr来做到这一点(mysql迷们很喜欢):

  • 如果您有一个非只读的MyISAM表,并且查询时间超过100 us(甚至选择了),那么您就死定了

在我固定的一个站点上,那个人租用了一台双四核服务器,因为“他的站点需要电源”。我看了他的网站,看了我以前的站点,有超过10万名成员,并且在Via C7微型半披萨盒服务器上运行了一个洪流跟踪器,我告诉他,您的站点在我地下室的Celeron 300上运行良好,这甚至太过分了,我可以以至强至强价格的一半租给您。

原来,这个人是一个很好的开发人员,而且是一个真正的好人,但是他对MySQL十分满意,因此他的网站具有典型的“地狱搜索查询”,可以杀死任何网站:

  • 每秒来自地狱的10条搜索查询(他在非法的warez网站上拥有30万名成员)
  • 从地狱搜索查询大约需要0.1-0.2秒
  • 对同一MyISAM表进行少量并发更新,以使事情变得有趣

=>所有查询的总序列化(MyISAM写锁)。1个核心100%,7个核心空闲,loadavg> 1000(是的,他使用的是Apache),页面时间> 30秒,可以正常工作。

修复很容易:从地狱优化搜索查询,修复下面的问题2),切换到InnoDB,切换到lighttpd。负载下降到0.02

2)更新

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

3)全文

  • 由于锁定,MyISAM无法用于读写表。
  • MyISAM与ramdisk一样可靠(实际上,更少:您需要操作系统崩溃才能破坏ramdisk,破坏MyISAM表仅需要MySQL崩溃或只是同时发生太多崩溃,您就会得到“未知的表引擎错误”,我看过很多次了
  • FULLTEXT在InnoDB上不可用
  • 在FULLTEXT索引中的任何插入都会触发几乎完整的索引重建(当我插入论坛帖子时,它正在重建400 MB的索引)

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

我没有尝试过狮身人面像(人们对此说得很好),但是Xapian很快就愉快地搜索了4GB的文本。

4)人们使用apache。

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

与正常的服务器(如lighttpd)无法检测到CPU使用情况(笨拙的Via C7每秒提供100次HTTP命中,lighttpd使用的CPU少于1%)不同,apache会杀死您的机器。

当MySQL开始失效(很容易死亡)时,客户端开始遭受重创F5,很快您就会有大约1000个Apache进程,每个进程都拥有一个PHP解释器,并且每个PHP解释器都拥有一个空闲的MySQL连接,等待一个MyISAM锁,除了一个,它正在对页面视图计数器进行一些微不足道的更新,但这需要一些时间,因为服务器要进行午餐交换,这是因为有1000个apache,1000个php和1000个mysql进程。

Lighttpd不为静态页面使用cpu。lighttpd饱和CPU的唯一方法是,如果您用apachebench以20K请求/秒的速度对其进行重击。然后,Lighttpd与一些人进行对话,例如10个php-fcgi后端(每个内核2-4个是好的),它与一些MySQL连接进行对话。结果一切都快得多,并且在过载时,它会优雅地降级,而不是爆炸性的降级。

为了解决原始问题,您肯定要分析SQL查询。将查询日志添加到您的PHP应用程序中,该日志显示(仅向您显示),查询列表及其花费的时间,以及从PHP脚本开始到结束的时间(包括页眉/页脚是一个不错的选择)这个)。

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


ran*_*omx 4

对于当前负载,您可以执行以下操作。最昂贵但最详细的答案将通过“Gomez”等企业应用程序提供。

但是,如果您想自己执行此操作,请参阅下面我之前的答案或使用 shell 实用程序,例如:htop、top、w,并利用 Apache server-status

问题修改前的先前答案:

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

您需要创建一个粗略的记忆公式,例如:

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
Run Code Online (Sandbox Code Playgroud)

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

您可能需要混合使用 vmstat 或 top 或 iostat 或 ps 等诊断工具来获取系统中多个请求的需求快照。

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

这是IBM关于安装Xdebug的教程:

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