6

我有一个运行良好的 LAMP 应用程序,但是用户数量每天都在增加。我不想有一天早上被一个惊喜击中,发现一切都因为超载而坏了。有没有办法粗略估计 LAMP 的容量?

我知道一份完整的详细报告是值得研究的许多书籍,但我可以快速获得一些试金石,看看事情是否运行良好。

所以说对于 mysql 组件,我怎么知道它还能承受多少负载呢?容量是 30%,还是 50%?等等

我的apache也是如此。虽然我感觉数据库会在 apache 之前死掉。


也许我的原版不太好,因为英语不是我的母语。我真正要问的是一种测量当前负载的方法。然后有一种方法可以根据该负载进行估计,在它失败之前我还能走多远。(这应该为每个组件单独完成,mysqld,httpd)

4

2 回答 2

5

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

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

1) 人们使用 MySQL

你完全可以使用 MySQL、facebook 和 flickr 来做到这一点(mysql 粉丝喜欢这些)如果你知道这些问题是:

  • 如果你有一个非只读的 MyISAM 表和任何超过 100 us(甚至选择)的查询,你就死定了

在我修复的一个站点上,这个人租用了一台双四核服务器,因为“他的站点需要电源”。我查看了他的站点,查看了我以前拥有超过 100K 成员的站点和一个在 Via C7 微型半比萨盒服务器上运行的洪流跟踪器,我告诉他,您的站点在我地下室的 Celeron 300 上运行良好,这甚至有点矫枉过正,我可以以你至强的一半价格租给你,哈哈。

事实证明,这家伙是一个优秀的开发人员和一个真正的好人,但他对 MySQL 很烂,所以他的网站有典型的 Search Query From Hell 可以杀死任何网站:

  • 每秒 10 次来自地狱的搜索查询(他的非法warez 网站上有大约 30 万会员)
  • 来自地狱的搜索查询大约需要 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) 全文

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

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

我没有尝试过 Sphinx(人们对它说好话),但 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 编译的代码缓存。

于 2009-09-30T17:07:20.790 回答
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/

于 2009-09-30T16:03:30.350 回答