从哪儿开始...
我有许多网站。我是一名开发人员。我不是一个很好的服务器管理员,也不擅长“性能调优”。我确信我编写的代码还算不错,无论是 PHP 还是 MySql 查询。
一个网站现在在高峰时段有时会出现高负载问题。统计数据显示每月页面浏览量约为 3,000,000,有些页面逻辑性很差,但确实包含大量需要下载的媒体。它位于 Virtuozzo 技术的 VPS 上,有 1.5 G 可用 RAM(但无论高峰还是非高峰,使用量都不会超过一半)。
我的问题是,我真的不知道从哪里开始寻找可以做些什么来“帮助”我的网站。我不知道应该查看哪些统计数据来找出导致负载的原因。是 mysql 开始使用过多的 tmp-disk 吗?我不知道。是我的某些 PHP 代码执行起来很昂贵吗?我不知道。是 Apache 产生了太多线程吗?说不清。
我完全不知道如何解决这个问题,需要一些指导。
我应该安装 Munin 吗?那么当我获取统计数据时,我应该在 Munin 中寻找什么。
查看高峰时段的 TOP,我可以看到负载有时会高达 20,而在非高峰时段,负载很少超过 1。我可以看到 Apache 线程数约为 100,tcp 连接数约为 300,mysql 线程只有 2(mysld 和 mysqld-safe,不管它们是什么)。
我已经安装了 op-cache(eAccellerator),但我没有真正的统计数据可以提供给你,除了它似乎运行正常,因为页面加载速度相当快。
好吧,如果您能提供关于从哪里开始以及如何解决这个问题的任何帮助,我们将不胜感激。
编辑峰值统计:大约 250 个请求/分钟,我使用的是 ServInt VPS,他们说所有机器都有 4 个 CPU,但我猜这只是为了突发(如果有的话),所以很抱歉,我不能肯定地说 CPU 的情况。
答案1
我为我们公司的知识库编写了几个 wiki 页面,希望对您有所帮助:
- http://www.anchor.com.au/hosting/development/HuntingThePerformanceWumpus
- http://www.anchor.com.au/hosting/dedicated/improving-server-capacity
老实说,你真的不想自己处理这些事情——你是一名开发人员,专注于你的优势。服务器性能和调优是开发的另一个世界。我建议找一个好的系统管理员(或团队)来处理这类问题。冒着有点垃圾的风险……我工作的公司做了很多这类工作……
答案2
我在 ServInt VPS 上,他们说所有机器都有 4 个 CPU
通常这意味着所有主机都有四核 CPU。但他们不会告诉您这些服务器上运行了多少个 VPS 客户端。可能只有 4 个,也可能多达 100 个。(您可以通过查看每月账单来猜测您处于哪个范围的哪一端)。如果您与许多其他人共享服务器,我预计高峰时间会比您预期的更多人使用您的网站时的速度慢得多。服务器负载为 20 确实表明情况可能如此。
要检测性能问题,请从构成您网站的系统之一中抽出一些内容:可能是 Apache 网络,例如用户太多;可能是性能不佳的 PHP 代码运行了太多循环;可能是查询设计不当,未使用 SQL 索引或检索了太多数据。选择 1 项来查看该组件的性能日志。例如,对于 SQL,打开慢查询日志,检查缓冲区大小参数,检查连接数。然后转到下一个组件并检查。重复,直到满意为止。
答案3
Jeff,作为一名 php 开发人员,你可以明确回答的一件事是,你的代码是否是瓶颈。平均负载是 CPU,因此如果你在高峰时段达到 20,那么你就会受到严重影响。通常这并不是 Apache 占用过多 CPU 的指标,而是通常您的代码或您的查询。
我发现,深入了解代码功能的最佳工具是XH专业。XHProf 是 Facebook 开发的 PHP 分析工具,可让您准确查看代码中发生的情况。它显示 CPU 时间、挂钟时间(通常等待数据库)、函数调用、调用堆栈等。它可使代码中的昂贵循环变得非常明显。
您甚至可以多次针对您的代码运行它,并将所有结果汇总在一起,以便更清楚地了解正在发生的事情。也许您网站的 95% 都运行得非常快,但只有几个资源密集型 URL 在被点击时会拖慢系统的其余部分。以下是设置它的好链接:http://techportal.ibuildings.com/2009/12/01/profiling-with-xhprof/
另一件要考虑的事情是,您的服务器上是否安装了操作码缓存 - XCache、eAccelerator 或 APC。当 php 解释器在每次请求时启动时,每次将您的 PHP 代码转换为操作码都非常耗费 CPU。操作码缓存将解释您的代码一次,并重复使用它,前提是您的代码变化频率不高,不需要每次都重新编译。