我有一台云服务器,具有:5120 RAM 和 4.6Ghz
我的问题是:如果我增加更多 CPU(11.5 Ghz),页面加载时间会更长吗?我的意思是,这总是渐进的吗?更多 CPU = 更快的页面加载?如果不是,它是如何工作的,我如何了解更多相关信息?
更新:
Symcbean 的回答非常清楚。但仍然有一些我不明白的地方(我在 Google 上找到的答案中,大多数人不明白)我试图将其放在一个元句中:
假设我有一桶水(水桶 = PHP 进程,带有缓存等)我想将水桶倒入漏斗中。(漏斗末端 = 服务器速度,漏斗末端越大,水流过的速度越快)
如果我的漏斗末端是 0.5 英寸,水流过的速度会很慢。如果我的漏斗末端是 1 英寸,水流过的速度会更快。但如果漏斗末端是(假设)10 英寸,那么无论我是 10 英寸还是 20 英寸,水流过的速度都是一样的。
因此,对于这个元句,我的意思是:我怎么知道我使用了 100% 的容量,我怎么知道我不需要更多容量……?
附言:如果有人能解释一下最大值是多少、它实际上是如何工作的或者我如何才能找到它,我将不胜感激?
PPS:这是我运行“top”时的输出
top - 23:06:18 up 54 days, 6:08, 1 user, load average: 0.51, 0.43, 0.47
Tasks: 107 total, 2 running, 105 sleeping, 0 stopped, 0 zombie
Cpu(s): 28.1%us, 1.5%sy, 0.0%ni, 70.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 4966748k total, 4493968k used, 472780k free, 241436k buffers
Swap: 4194300k total, 123252k used, 4071048k free, 2836028k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16432 root 20 0 1115m 283m 30m R 95 5.8 1:11.39 php
16422 www-data 20 0 927m 45m 21m S 18 0.9 0:00.53 apache2
20270 mysql 20 0 2327m 330m 5500 S 7 6.8 474:19.11 mysqld
617 n2 20 0 14268 1140 488 S 1 0.0 182:58.64 n2txd
30212 root 20 0 0 0 0 S 1 0.0 24:50.48 flush-202:1
26848 root 20 0 99424 1108 856 S 0 0.0 2:47.63 sendmail-mta
1 root 20 0 24188 1556 872 S 0 0.0 0:09.09 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:48.36 ksoftirqd/0
4 root 20 0 0 0 0 S 0 0.0 1:27.21 kworker/0:0
5 root 20 0 0 0 0 S 0 0.0 0:00.05 kworker/u:0
6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0 0.0 0:26.69 watchdog/0
8 root RT 0 0 0 0 S 0 0.0 21841:40 migration/1
9 root 20 0 0 0 0 S 0 0.0 0:00.00 kworker/1:0
10 root 20 0 0 0 0 S 0 0.0 0:56.84 ksoftirqd/1
11 root RT 0 0 0 0 S 0 0.0 0:23.78 watchdog/1
12 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/2
13 root 20 0 0 0 0 S 0 0.0 0:00.00 kworker/2:0
14 root 20 0 0 0 0 S 0 0.0 0:48.05 ksoftirqd/2
15 root RT 0 0 0 0 S 0 0.0 0:19.11 watchdog/2
16 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/3
17 root 20 0 0 0 0 S 0 0.0 0:00.00 kworker/3:0
18 root 20 0 0 0 0 S 0 0.0 0:40.08 ksoftirqd/3
19 root RT 0 0 0 0 S 0 0.0 0:19.24 watchdog/3
20 root 0 -20 0 0 0 S 0 0.0 0:00.00 cpuset
21 root 0 -20 0 0 0 S 0 0.0 0:00.00 khelper
22 root 20 0 0 0 0 S 0 0.0 0:00.00 kdevtmpfs
23 root 0 -20 0 0 0 S 0 0.0 0:00.00 netns
24 root 20 0 0 0 0 S 0 0.0 0:00.00 kworker/u:1
25 root 20 0 0 0 0 S 0 0.0 0:00.00 xenwatch
26 root 20 0 0 0 0 S 0 0.0 0:00.00 xenbus
27 root 20 0 0 0 0 S 0 0.0 0:22.29 sync_supers
28 root 20 0 0 0 0 S 0 0.0 0:00.42 bdi-default
29 root 0 -20 0 0 0 S 0 0.0 0:00.00 kintegrityd
30 root 0 -20 0 0 0 S 0 0.0 0:00.00 kblockd
31 root 20 0 0 0 0 S 0 0.0 1:57.23 kworker/2:1
32 root 0 -20 0 0 0 S 0 0.0 0:00.00 ata_sff
33 root 20 0 0 0 0 S 0 0.0 0:00.00 khubd
34 root 0 -20 0 0 0 S 0 0.0 0:00.00 md
36 root 20 0 0 0 0 S 0 0.0 0:01.45 khungtaskd
37 root 20 0 0 0 0 S 0 0.0 0:29.28 kswapd0
38 root 25 5 0 0 0 S 0 0.0 0:00.00 ksmd
39 root 20 0 0 0 0 S 0 0.0 0:00.00 fsnotify_mark
40 root 20 0 0 0 0 S 0 0.0 0:00.00 ecryptfs-kthrea
41 root 0 -20 0 0 0 S 0 0.0 0:00.00 crypto
49 root 0 -20 0 0 0 S 0 0.0 0:00.00 kthrotld 50 root 20 0 0 0 0 S 0 0.0 0:00.00 khvcd 51 root 20 0 0 0 0 S 0 0.0 1:19.07 kworker/3:1 70 root 0 -20 0 0 0 S 0 0.0 0:00.00 devfreq_wq 71 root 20 0 0 0 0 S 0 0.0 1:03.05 kworker/0:1 190 root 20 0 0 0 0 S 0 0.0 1:31.64 kworker/1:1 193 root 20 0 0 0 0 S 0 0.0 2:52.19 jbd2/xvda1-8
答案1
不确定 Shane 在你的 top 输出中在哪里看到 4 个 CPU。当然不止一个。但是你的平均负载显示从未使用过超过一半的 CPU。因此添加更多 CPU 不会使其更快。
页面响应时间与 PHP 执行时间相差甚远。通常,页面加载时间约为生成 HTML 时间的 6-10 倍(假设 PHP 相对高效)——差异主要是由于网络层和浏览器层发生的事情。工具如下伊斯洛和网页测试将有助于提高前端性能。我建议买一本关于这个主题的好书——比如这个。有很多关于网络性能在这里以及关于MySQL 性能。
诸如 top、load average、cpu usage、free、vmstat 等指标可以很好地告诉您服务器端性能受到怎样的限制 - 但如上所述,这应该只是页面生命周期的一小部分。从您提供的快照来看,硬件负担并不重(可能存在 I/O 瓶颈,但从这些指标中很难看出)。
如果您有理由怀疑您的 PHP 代码相当慢,那么请开始记录和分析您的请求数据。您的 PHP 请求需要多长时间才能生成?您的页面加载时间是多少?
从您显示的顶部输出中,确实有一件事引人注目,那就是只有一个 PHP 实例可见,只有一个 Apache 实例。Apache 是如何配置的?哪个 MPM?它如何连接到 PHP?如果您使用的是 CGI,那么通过切换到 PHP-fpm 或 mod_php 应该会获得很大的改进。您使用的是操作码缓存?
您的 mysqld 占用了相当多的 CPU 周期 - 您可能需要开始分析查询日志并进行调整。尝试运行mysqltuner反对你的例子。
我意识到我在这里问了很多问题,但“如何让我的网站运行得更快”这个问题的解决方案可以写成一本厚厚的书。我需要大约 2 天的工作来让服务器正确运行,以捕获数据并全面分析其性能 - 并且至少需要 5 天的时间进行分析 - 而这还不是在开始寻找问题的解决方案之前 - 也就是说,您不太可能在 Stack Overflow 上得到具体的答案(我只是想为您指明提出正确问题的方向)。
答案2
看起来 PHP 是你的 CPU 瓶颈,而不是 Apache。
您似乎有 4 个 CPU 核心,但 PHP 进程只在其中一个上运行;根据您的配置方式,PHP 可能不会将所有可用的 CPU 核心用于不同的请求。在负载处于该状态时,有多少请求正在处理?
如果 PHP 仅运行单个线程,则需要将其配置为在不同的核心上运行不同的请求,以利用现有容量。
如果 PHP 当时仅执行单个请求,并且该请求返回的速度仍然太慢,那么更多的核心也无济于事,您需要进行一些优化和缓存。