好吧,我有一台运行 CentOs 6 的专用服务器,配有 16GB 内存、双 Xenon 处理器等。但是,由于 mysql,我一直遇到高负载。负载会随机降至 1.0 以下,页面生成时间将小于 30 毫秒,并且站点运行顺畅。这是在大约 100 个并发用户的情况下,每分钟提供不到 200 页。但是 99% 的时间它都非常慢,并且负载非常高,通常至少为 4,有时甚至达到 100。我们以前没有遇到过这个问题,这台服务器曾经能够处理 400 个并发用户和 1000 页/分钟,而负载不会超过 1.5。
我做的第一件事是在 PHP 中实现数据库缓存数据库。这有一点帮助,但没有解决问题。
我在网上找遍了所有地方,但似乎找不到问题所在。我请一位朋友帮忙看一下,但他也不知道。我让主机商给我们换了一台新机器,几个小时后问题又出现了。我们不应该承受这么高的流量。
我开始认为这可能与 /tmp 有关。运行“tmpwatch --mtime --all 1 /tmp”后,我能够将负载暂时降至正常。然而,在负载激增后,这种方法不再有效。
如果有人知道哪里出了问题,我将不胜感激。我不确定你会用什么作为指标,但我列出了一些我认为可能有帮助的指标。
‘顶部’输出:
top - 22:02:36 up 1 day, 23:39, 1 user, load average: 4.01, 4.38, 4.50
Tasks: 233 total, 1 running, 231 sleeping, 0 stopped, 1 zombie
Cpu(s): 25.5%us, 2.0%sy, 0.0%ni, 70.5%id, 2.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16331836k total, 16034868k used, 296968k free, 375472k buffers
Swap: 18546680k total, 0k used, 18546680k free, 14421512k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31149 mysql 20 0 1589m 32m 6024 S 191.0 0.2 5:54.80 mysqld
27575 apache 20 0 312m 13m 3464 S 2.7 0.1 0:04.06 httpd
29427 apache 20 0 317m 18m 3484 S 2.7 0.1 0:02.76 httpd
25331 apache 20 0 311m 12m 3440 S 2.3 0.1 0:05.55 httpd
21331 apache 20 0 408m 15m 3676 S 2.0 0.1 0:08.57 httpd
24226 apache 20 0 314m 14m 3484 S 2.0 0.1 0:06.45 httpd
32352 apache 20 0 311m 12m 3424 S 2.0 0.1 0:01.01 httpd
32377 apache 20 0 312m 13m 3484 S 2.0 0.1 0:00.86 httpd
774 apache 20 0 312m 12m 3108 S 1.7 0.1 0:00.11 httpd
28165 apache 20 0 406m 12m 3588 S 1.7 0.1 0:03.76 httpd
30516 apache 20 0 311m 12m 3476 S 1.7 0.1 0:02.04 httpd
31019 apache 20 0 313m 13m 3436 S 1.7 0.1 0:01.68 httpd
31020 apache 20 0 314m 15m 3484 S 1.7 0.1 0:01.71 httpd
657 apache 20 0 311m 12m 3108 S 1.3 0.1 0:00.20 httpd
27731 apache 20 0 406m 12m 3572 S 1.3 0.1 0:03.69 httpd
28180 apache 20 0 313m 13m 3480 S 1.3 0.1 0:03.43 httpd
30565 apache 20 0 314m 14m 3488 S 1.3 0.1 0:02.07 httpd
‘df’ 输出
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg-root 461164576 45283168 392455568 11% /
tmpfs 8165916 0 8165916 0% /dev/shm
/dev/sda1 247919 72922 162197 32% /boot
/dev/mapper/vg-tmp 1032088 137344 842316 15% /tmp
‘iostat’ 输出
Linux 2.6.32-220.el6.x86_64 (domain redacted) 09/05/2012 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.88 0.00 0.49 1.53 0.00 93.09
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 18.03 98.46 787.86 17060770 136515216
dm-0 76.33 98.15 605.19 17006740 104862680
dm-1 0.00 0.02 0.00 3176 0
dm-2 22.78 0.21 182.06 35730 31546312
答案1
有两个地方可以开始诊断这个问题:
检查 MySQL 是否需要调优;mysqltuner是一款出色的自动化工具,可以根据推荐的配置检查您的配置(包括实时统计数据)。
查看性能低下时有多少文件
/tmp
,以及是哪个文件系统 - 以及目录有多“大”。如果它非常大,或者有很多文件,那么将它放在 上可能会有好处tmpfs
,这样应该会快一点。(...或者避免那里有太多文件。:)
最可能的起点是找出您的生产负载是否导致了 MySQLtuner 的任何调整问题。