我应该运行什么样的testing来确定服务器上的瓶颈? 我正在尝试优化,以便在发生重负载峰值时保持高负载状态。 我在LAMP环境中运行Ubuntu。
我build议首先安装一个日志框架(如munin),以便在基本负载和服务器上的峰值期间有一些可用的数据。 然后,我会监视你的SQL服务器上的查询(特别是慢查询)。
使用这些信息,您可以确定这些情况有多特别,或者是否只是将最后一颗钉子添加到高负载的机器,以及发生什么情况,比如RAM耗尽,某些进程正在锤击磁盘,或者你的CPU是这个问题。
这是一个非常广泛的问题。 要衡量任何事情,首先你需要一个基准绩效指标。 安装munin和munin-node并评估你的基线。 collectd和令人尊敬的SNMP也是可选的,但不是非常用户友好的。
想想你的应用程序。 数据库很重吗? 大量的IO? CPU(video编码)? 执行一些正常的Web应用程序任务,首先查看哪里存在瓶颈。 使用诸如siege , ab或JMeter等其他工具来自动执行这些任务。
在build立了一些基准指标和突破点之后,您可以看到哪些方面需要改进。 如上所述,这是一个广泛的问题,因此有一个相当广泛的答案:
I / O绑定:您是否无谓地访问数据库? 什么是你的查询caching的样子? 你需要优化写入或读取? 你需要一个单独的数据库服务器吗?
内存限制:假设你不是数据库I / O限制,并且尽可能在内存中获得尽可能多的内存,那么你的数据集是否太大而无法使用内存呢? 什么是caching命中率? 你是否使用像memcached一样的单独caching框架?
CPU绑定:您的应用程序是否能够利用多个核心/工作者? 你有线程锁或争用问题吗? 考虑使用一个轻量级的networking服务器,比如nginx而不是Apache,或者使用反向代理设置。 也可能有相关的sysctl.conf (内核)参数可以更改。
networking界限:在游戏的这个阶段极不可能。
其他要点和考虑:
你的数据库的一些快速优化可以用mysqltuner.pl完成。
尝试和尽可能模拟真实的stream量(重放访问日志是一个好的开始)。
如果您在生产数据库设置中遇到磁盘上的交换区域,那么您将面临一个受到伤害的世界。
tl; dr将您认为相关的所有内容进行图表分析,重击服务器,调整,重复。
我发现最好的是在部署之前进行容量分析。 然而,有一个真正伟大的文章,正是你在找什么,我希望这有助于。
http://blog.inarow.net/post/227533559/four-steps-to-diagnose-your-lamp-application
1)跟踪MySQL查询接pipe第二步2)监视PHP内存使用情况并loggingApache交付时间3)loggingPHP错误4)在操作系统级别拍摄快照
我也想添加JMeter到这个。 http://jakarta.apache.org/jmeter/