尽管有缓存,负载仍然非常高

尽管有缓存,负载仍然非常高

好吧,我有一台运行 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

有两个地方可以开始诊断这个问题:

  1. 检查 MySQL 是否需要调优;mysqltuner是一款出色的自动化工具,可以根据推荐的配置检查您的配置(包括实时统计数据)。

  2. 查看性能低下时有多少文件/tmp,以及是哪个文件系统 - 以及目录有多“大”。如果它非常大,或者有很多文件,那么将它放在 上可能会有好处tmpfs,这样应该会快一点。(...或者避免那里有太多文件。:)

最可能的起点是找出您的生产负载是否导致了 MySQLtuner 的任何调整问题。

相关内容