【问题标题】:How to get a rough estimate of LAMP application capacity?如何粗略估算 LAMP 应用能力?
【发布时间】:2010-12-02 17:06:44
【问题描述】:

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

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

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

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


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

【问题讨论】:

    标签: php mysql linux performance lamp


    【解决方案1】:

    对于当前负载,您可以做几件事。最昂贵但最详细的答案将通过“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/

    【讨论】:

      【解决方案2】:

      如果你的网站需要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 编译的代码缓存。

      【讨论】:

      • 你准备兼职吗?
      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多