我运行的服务器具有以下规格:
- 英特尔 i7 920
- 8 GB 内存
- Linux 2.6.32-25-服务器 #44-Ubuntu 10.04 SMP 2010 年 9 月 17 日星期五 21:13:39 UTC x86_64 GNU/Linux
- 75 个 Apache 进程
- 具有 2 个磁盘的低端硬件 RAID-1
过去,我们在扩展服务时遇到的所有问题都与磁盘限制有关,但目前我们看到的负载数字比以前更高,尤其是在更新到 Ubuntu 10.04 之后。服务器每秒处理大约 50 个请求。交换未使用,不应处于活动状态。MySQL 数据集有几 GB,但访问应该得到相当好的优化。
> top
top - 10:42:50 up 16 days, 18:49, 1 user, load average: 20.02, 16.17, 11.44
Tasks: 277 total, 4 running, 273 sleeping, 0 stopped, 0 zombie
Cpu0 : 38.6%us, 3.3%sy, 0.0%ni, 58.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 37.9%us, 3.3%sy, 0.0%ni, 58.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 25.9%us, 3.0%sy, 0.0%ni, 69.5%id, 1.3%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu3 : 23.5%us, 2.0%sy, 0.0%ni, 67.9%id, 0.0%wa, 0.0%hi, 6.6%si, 0.0%st
Cpu4 : 16.4%us, 1.3%sy, 0.0%ni, 82.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 15.3%us, 1.3%sy, 0.0%ni, 83.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 14.3%us, 1.0%sy, 0.0%ni, 84.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 2.3%us, 0.6%sy, 0.0%ni, 97.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8187668k total, 8117276k used, 70392k free, 178920k buffers
Swap: 4198968k total, 2084k used, 4196884k free, 6159328k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32216 mysql 20 0 2026m 788m 4132 S 41 9.9 1292:40 mysqld
8104 www-data 20 0 491m 106m 95m S 4 1.3 1:57.62 apache2
27072 www-data 20 0 684m 112m 101m S 4 1.4 2:51.47 apache2
3391 www-data 20 0 683m 109m 98m S 4 1.4 2:22.29 apache2
16822 www-data 20 0 682m 114m 104m S 4 1.4 3:33.05 apache2
27068 www-data 20 0 555m 113m 102m S 4 1.4 2:53.77 apache2
27118 www-data 20 0 683m 119m 106m S 4 1.5 4:41.48 apache2
1036 www-data 20 0 685m 112m 100m S 3 1.4 2:27.24 apache2
3503 www-data 20 0 556m 81m 70m S 3 1.0 0:33.77 apache2
29803 www-data 20 0 682m 111m 101m S 3 1.4 2:47.09 apache2
1345 www-data 20 0 491m 115m 104m S 3 1.4 4:04.62 apache2
3001 www-data 20 0 379m 109m 98m S 3 1.4 2:13.36 apache2
[... 75 Apache processes with similar specs, but less CPU]
我的问题是 - 您通常是否看到高负载数字存在任何问题?响应时间有所增加,但只增加了约 30%。负载数字是否在某种程度上包括磁盘活动?您对我在优化期间应该关注什么有什么意见吗?非常感谢!
> iotop
Total DISK READ: 179.70 K/s | Total DISK WRITE: 1735.81 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
16512 be/4 mysql 0.00 B/s 22.94 K/s ?unavailable? mysqld
20701 be/4 mysql 0.00 B/s 0.00 B/s ?unavailable? mysqld
21556 be/4 mysql 0.00 B/s 22.94 K/s ?unavailable? mysqld
28998 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
12771 be/4 mysql 0.00 B/s 3.82 K/s ?unavailable? mysqld
16824 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
2700 be/4 mysql 0.00 B/s 7.65 K/s ?unavailable? mysqld
3074 be/4 mysql 22.94 K/s 0.00 B/s ?unavailable? mysqld
17585 be/4 mysql 0.00 B/s 15.29 K/s ?unavailable? mysqld
30723 be/4 mysql 7.65 K/s 0.00 B/s ?unavailable? mysqld
29906 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
29907 be/4 mysql 0.00 B/s 15.29 K/s ?unavailable? mysqld
13547 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
7444 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
1944 be/4 mysql 149.11 K/s 0.00 B/s ?unavailable? mysqld
16825 be/4 mysql 0.00 B/s 7.65 K/s ?unavailable? mysqld
32223 be/4 mysql 0.00 B/s 3.82 K/s ?unavailable? mysqld
7801 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
5808 be/4 mysql 0.00 B/s 11.47 K/s ?unavailable? mysqld
8104 be/4 www-data 0.00 B/s 3.82 K/s ?unavailable? apache2 -k start
18890 be/4 www-data 0.00 B/s 0.00 B/s ?unavailable? apache2 -k start
1 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init
2 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s ?unavailable? [migration/0]
答案1
在 Linux 上,平均负载包括处于不间断睡眠状态的进程(包括磁盘访问)。但是,您的 top 输出似乎并未显示大量的 IO 等待时间。由于 top 百分比是平均的,因此我可能会以高频率更新(可能是 -d.1 或 -d.5)运行 top,然后查找默认轮询频率中未显示的 IO 等待峰值。
答案2
标准系统指标(负载、CPU、内存等)通常可以很好地指示系统性能如何受限 - 但最终性能值取决于系统处理请求的速度。在实践中,监控这些指标并设置阈值是个好主意,但最终这些指标仅能表明系统的实际性能。
我认为架构可以更好 - 粗略地估计,您描述的服务器的成本可以用来购买 4Gb/双处理器/raid 1+(5/0) 用于数据库,以及至少 2 台低规格机器来运行网络服务器(我猜其中某处也装有 mod_php 或 mod_perl),这样可能会快得多。
当然,这似乎是 mysqld 进程造成了大部分问题 - 但看起来 apache 正在执行相当多的 I/O。您的内存中有多少用于 I/O 缓存?这些 Apache 进程的 RSS 看起来也很高(VIRT 大小也是如此 - 但这可能是高 RSS 的结果),大约是我能找到的最近的 LAMP 盒上值的 10 倍。
我建议遵循这里的常规方法,但首先查看 mysql 的内容:
mysql - 您是否启用了慢查询日志记录?您是否对其进行了分析以确定潜在的数据库优化
你跑过吗mysqltuner反对你的安装?
HTTP 缓存 - 您是否发送了静态内容的良好缓存信息?禁用条件请求?
你的 Apache 进程为什么这么大?你真的需要所有这些模块吗?
您的用户的 RTT 范围是多少?您是否对静态文本/html 内容和脚本输出启用了压缩?
如果您正在运行 PHP 网站,您是否正在运行操作码缓存(例如 APC、ioncude、Zend)?
高血压
答案3
我个人担心 MySQL 的高 CPU 使用率。不过 top 只是一个快照;如果您看到 mysql 的 CPU 持续固定在 50%,我会执行一些步骤来确定原因。
负载往往会呈指数增长。MySQL 达到 50% 所需的时间将远远超过达到 100% 所需的时间