我的一台 Web 服务器上堆积着 Apache 线程(300-500 个并发请求,有些需要 3-8 秒才能处理!),但 CPU 使用率却很低(约 10%)。因此,页面加载时间大大减慢。我有很多空闲的 CPU 能力。我该如何使用更多的 CPU 能力来更快地处理这些线程?
这里是顶部的顶部……
Tasks: 469 total, 1 running, 468 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.1% us, 1.7% sy, 0.0% ni, 90.3% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 9181012k total, 7998772k used, 1182240k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11351 apache 15 0 364m 30m 17m S 11.9 0.3 0:00.73 httpd
7527 apache 15 0 365m 36m 23m S 8.6 0.4 0:01.76 httpd
7607 apache 16 0 364m 35m 22m S 2.3 0.4 0:01.47 httpd
11498 apache 17 0 359m 19m 11m S 2.3 0.2 0:00.07 httpd
11497 apache 16 0 362m 23m 13m S 1.7 0.3 0:00.05 httpd
1840 apache 15 0 366m 44m 29m S 1.3 0.5 0:03.74 httpd
5358 apache 15 0 364m 36m 24m S 1.3 0.4 0:02.58 httpd
8090 apache 15 0 365m 31m 17m S 1.3 0.3 0:01.10 httpd
11346 apache 15 0 361m 28m 18m S 1.3 0.3 0:00.12 httpd
4051 apache 16 0 365m 40m 27m S 1.0 0.5 0:01.72 httpd
32575 apache 16 0 365m 42m 28m S 0.7 0.5 0:03.62 httpd
5145 apache 16 0 365m 37m 24m S 0.7 0.4 0:02.23 httpd
8173 apache 16 0 363m 35m 23m S 0.7 0.4 0:00.29 httpd
5466 apache 15 0 365m 31m 18m S 0.3 0.4 0:01.18 httpd
7420 apache 16 0 364m 36m 23m S 0.3 0.4 0:01.24 httpd
11485 apache 16 0 362m 23m 12m S 0.3 0.3 0:00.04 httpd
1 root 15 0 10272 612 584 S 0.0 0.0 0:02.78 init
30129 root 16 -4 12536 400 396 S 0.0 0.0 0:00.00 udevd
30402 root 16 0 5840 580 480 S 0.0 0.0 0:14.01 syslogd
30414 rpc 18 0 7992 408 404 S 0.0 0.0 0:00.00 portmap
30439 root 18 0 10088 548 544 S 0.0 0.0 0:00.00 rpc.statd
30478 memcache 15 0 141m 5364 516 S 0.0 0.1 1:16.34 memcached
30496 root 16 0 60604 744 636 S 0.0 0.0 0:07.31 sshd
30507 root 15 0 21572 796 688 S 0.0 0.0 0:04.56 xinetd
31817 root 15 0 166m 932 860 S 0.0 0.0 0:00.03 httpsd
31820 psaadm 15 0 175m 7992 4596 S 0.0 0.1 0:02.31 httpsd
31924 root 15 0 19704 924 552 S 0.0 0.0 0:02.50 crond
13316 root 16 0 98528 3628 2796 S 0.0 0.0 0:00.01 sshd
1655 root 19 0 8600 1180 972 S 0.0 0.0 0:00.00 mysqld_safe
1695 mysql 16 0 4268m 464m 4684 S 0.0 5.2 10:05.19 mysqld
32564 root 16 0 98528 3612 2780 S 0.0 0.0 0:00.00 sshd
28489 root 15 0 98528 3628 2796 S 0.0 0.0 0:00.00 sshd
32152 root 16 0 98528 3612 2780 S 0.0 0.0 0:00.01 sshd
5781 root 15 0 98528 3628 2796 S 0.0 0.0 0:00.01 sshd
7801 root 17 0 356m 11m 5472 S 0.0 0.1 0:05.74 httpd
7804 apache 16 0 366m 36m 21m S 0.0 0.4 0:00.35 httpd
7805 apache 16 0 370m 31m 13m S 0.0 0.4 0:00.11 httpd
8172 apache 15 0 366m 34m 19m S 0.0 0.4 0:00.62 httpd
9430 apache 16 0 365m 45m 32m S 0.0 0.5 0:02.67 httpd
11393 apache 16 0 363m 37m 25m S 0.0 0.4 0:00.75 httpd
11551 apache 17 0 360m 31m 22m S 0.0 0.4 0:00.24 httpd
32345 apache 16 0 364m 39m 27m S 0.0 0.4 0:02.86 httpd
32472 apache 16 0 394m 70m 27m S 0.0 0.8 0:03.77 httpd
32488 apache 16 0 364m 42m 29m S 0.0 0.5 0:02.38 httpd
32501 apache 16 0 365m 41m 28m S 0.0 0.5 0:01.71 httpd
32644 apache 16 0 365m 36m 23m S 0.0 0.4 0:01.79 httpd
32765 apache 15 0 364m 39m 26m S 0.0 0.4 0:02.65 httpd
1334 apache 16 0 368m 42m 26m S 0.0 0.5 0:02.77 httpd
1339 apache 15 0 362m 39m 29m S 0.0 0.4 0:01.84 httpd
1351 apache 15 0 364m 43m 30m S 0.0 0.5 0:02.59 httpd
1553 apache 16 0 363m 41m 29m S 0.0 0.5 0:02.74 httpd
1555 apache 16 0 365m 37m 24m S 0.0 0.4 0:01.59 httpd
1564 apache 15 0 365m 40m 27m S 0.0 0.5 0:01.88 httpd
1569 apache 16 0 364m 35m 22m S 0.0 0.4 0:00.63 httpd
1573 apache 15 0 367m 39m 24m S 0.0 0.4 0:01.66 httpd
1575 apache 16 0 363m 36m 24m S 0.0 0.4 0:01.88 httpd
1583 apache 16 0 364m 34m 21m S 0.0 0.4 0:01.92 httpd
1594 apache 15 0 367m 44m 29m S 0.0 0.5 0:03.71 httpd
1689 apache 15 0 365m 38m 24m S 0.0 0.4 0:01.47 httpd
1690 apache 15 0 365m 39m 26m S 0.0 0.4 0:01.18 httpd
1710 apache 16 0 363m 34m 23m S 0.0 0.4 0:00.99 httpd
1725 apache 15 0 364m 39m 26m S 0.0 0.4 0:01.80 httpd
1726 apache 16 0 365m 40m 26m S 0.0 0.5 0:00.90 httpd
1737 apache 16 0 364m 30m 17m S 0.0 0.3 0:00.46 httpd
1919 apache 15 0 363m 34m 22m S 0.0 0.4 0:00.83 httpd
1930 apache 16 0 364m 33m 21m S 0.0 0.4 0:00.50 httpd
1934 apache 15 0 364m 40m 27m S 0.0 0.5 0:02.20 httpd
以及关键的 httpd.conf 设置:
Timeout 120
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 3
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
答案1
要配置 Apache 以使用更多 CPU,您需要消除当前阻止 Apache 使用更多 CPU 的瓶颈。由于请求需要 3-8 秒才能完成,因此您知道存在某种瓶颈,您需要找到它。
需要注意的事项有:
- 确定 Apache 主机是否是瓶颈。如果您
uptime
在请求耗时 3-8 秒时运行,负载是否显示为高(两位数或三位数)?您实际上无法从中看出太多信息,因为高负载可能意味着问题存在于其他地方,但如果请求耗时 3-8 秒时负载较低,则可能是远程问题。 - 如果其他机器上有此服务所需的资源(例如数据库),也请检查那里的系统负载。
- 查看服务器上“vmstat 1”的输出。这将显示系统利用率统计信息,每秒更新一次。需要查看的内容包括“cpu wa”(如果是两位数,则可能意味着磁盘已饱和)、“swap si/so”(如果这些非零,则意味着内存不足)和“cpu id”(空闲 CPU 时间,如果小于 10,则表明 CPU 已饱和)。如果“cpu sy”时间很高,则可能表示您分叉过多(可能是 Apache MaxRequests 太低?)或其他内核级开销。按 Control-C 结束“vmstat 1”输出。
- 您可以运行“strace -p [AN APACHE PROCEED ID]”来了解 Apache 进程正在做什么。这会显示它们正在进行的系统调用,但如果您不熟悉系统调用,有时只需阅读文本输出即可获取信息。例如,上周我有一台与您的服务器类似的服务器,strace 会暂停几秒钟,最后显示的是一条日志消息,我追踪到一个正在向 syslog 发送大量日志消息的 PHP 文件。
如果您没有安装“munin”,那么您应该安装。如果安装了,请查看图表,了解系统响应缓慢和运行良好时系统利用率的变化情况。如果您看到图表中有跳跃,则可能表明瓶颈在哪里。如果您看到图表中有空白区域,则可能表明瓶颈在哪里。全部图表中,这可能意味着系统已饱和。如果只有 Apache 图表为空白,则可能意味着 Apache 已达到其最大连接数,这可能是性能问题的副作用。
还要注意,如果您有多个 CPU,但 Apache 后面有一个像 Zope 这样的单线程应用程序,那么可能是您的一个 CPU 已饱和,而其他 CPU 处于空闲状态。如果您在 top 中按“1”,它将显示每个单独核心的利用率。寻找一个始终处于 0% 空闲状态的核心,而其他核心的空闲程度要高得多。
利用这些技术,我能够隔离并解决大多数类似的性能问题。
答案2
如果您浏览过许多关于 apache 性能的先前问答,那么您会得到一些线索。
您在 httpd.conf 文件中省略了大量信息,我们需要了解服务器是如何配置的 - 另一方面,您同时包含了线程和预分叉配置 - 您使用的是哪一个?
CPU 使用率非常低 (~10%)。因此页面加载时间变慢
不,你完全搞反了。页面加载时间确实变慢了,但唯一可以忽略的导致速度变慢的因素是 CPU。
那里可能您可以使用 CPU 来做一些事情,这可能会缓解其他地方的性能问题(使用压缩、软件 raid),但实际上错误在于其他地方。
平均 RTT 是多少(来自 HTTP 流量,而非 ICMP)?有多少磁盘 I/O?内存配置文件是什么样的?您只提供静态内容吗?如果不是,那么生成内容还涉及什么?您是否监控了进出服务器的网络流量,以查看是否存在您没有预料到的情况?您是否审核了发出的缓存指令?