好吧,我完全不知所措了。我已经运行这个 Ubuntu 服务器大约三年了。在过去的几个月里,它开始表现得很奇怪,而且情况越来越糟。这是一个非常繁忙的服务器,运行着大约 15 个网站和许多其他工具。它的典型 15 分钟负载平均值为 .3。然而,大约每 12 小时左右,它的负载就会飙升到 90 左右。
我确信这与 mysql 和服务器以某种方式被锁定有关,而 apache 只是堆积起来等待打开。这是事情变得疯狂时的顶部。
Tasks: 143 total, 20 running, 123 sleeping, 0 stopped, 0 zombie
Cpu(s): 34.3%us, 62.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.2%hi, 2.6%si, 0.0%st
Mem: 2061444k total, 911460k used, 1149984k free, 11156k buffers
Swap: 1421712k total, 0k used, 1421712k free, 126728k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1080 mysql 20 0 397m 59m 5892 S 18 3.0 0:37.37 mysqld
1602 www-data 20 0 198m 26m 4948 R 7 1.3 0:08.17 apache2
1725 www-data 20 0 189m 24m 11m R 7 1.2 0:04.33 apache2
1719 www-data 20 0 189m 25m 12m R 7 1.2 0:03.88 apache2
1802 www-data 20 0 192m 20m 4808 S 7 1.0 0:03.15 apache2
1521 www-data 20 0 199m 28m 6912 R 6 1.4 0:10.15 apache2
1530 www-data 20 0 193m 22m 5104 S 5 1.1 0:06.53 apache2
1536 www-data 20 0 196m 25m 4936 R 5 1.2 0:07.93 apache2
1583 www-data 20 0 186m 21m 11m R 5 1.0 0:03.46 apache2
1722 www-data 20 0 193m 21m 4956 R 5 1.1 0:04.91 apache2
1906 www-data 20 0 182m 12m 6724 S 5 0.6 0:00.61 apache2
1439 root 20 0 92040 3672 2280 S 5 0.2 0:08.04 ezproxy
1539 www-data 20 0 194m 27m 9548 R 4 1.3 0:08.08 apache2
1716 www-data 20 0 187m 22m 11m R 4 1.1 0:03.36 apache2
1891 www-data 20 0 183m 18m 11m S 4 0.9 0:00.61 apache2
1498 www-data 20 0 194m 23m 6264 S 4 1.2 0:11.47 apache2
1517 www-data 20 0 193m 22m 5212 R 4 1.1 0:06.56 apache2
1523 www-data 20 0 190m 26m 12m S 3 1.3 0:07.61 apache2
1761 www-data 20 0 186m 20m 10m R 2 1.0 0:02.66 apache2
1779 www-data 20 0 184m 19m 10m R 2 0.9 0:02.69 apache2
1711 www-data 20 0 185m 20m 11m R 2 1.0 0:03.32 apache2
1728 www-data 20 0 182m 11m 5028 R 2 0.6 0:01.14 apache2
1819 www-data 20 0 181m 8120 3332 S 2 0.4 0:00.49 apache2
1886 www-data 20 0 182m 11m 6364 S 2 0.6 0:01.18 apache2
1899 www-data 20 0 184m 18m 10m S 2 0.9 0:01.38 apache2
1497 www-data 20 0 191m 27m 12m S 1 1.4 0:07.84 apache2
1766 www-data 20 0 181m 10m 5016 R 1 0.5 0:01.39 apache2
1871 www-data 20 0 184m 19m 11m R 1 1.0 0:00.98 apache2
1563 www-data 20 0 186m 23m 13m S 1 1.2 0:07.37 apache2
1865 www-data 20 0 184m 18m 10m S 1 0.9 0:01.56 apache2
1494 www-data 20 0 193m 25m 8352 S 1 1.3 0:12.07 apache2
1512 www-data 20 0 186m 23m 13m R 1 1.1 0:06.10 apache2
1526 www-data 20 0 186m 24m 13m R 1 1.2 0:06.30 apache2
1816 www-data 20 0 184m 18m 10m S 1 0.9 0:01.60 apache2
1516 www-data 20 0 184m 19m 11m S 1 1.0 0:04.12 apache2
现在一切进展顺利,
Uptime: 241264 Threads: 1 Questions: 1870412 Slow queries: 1354 Opens: 13818 Flush tables: 1 Open tables: 256 Queries per second avg: 7.752
这是我的所有数据库大小(以 MB 为单位)
name1 14.78335094
name2 11.08541870
name3 31.01449203
name4 6.24377346
name5 0.36655807
name6 10.95312500
information_schema 0.00781250
mysql 0.60296535
name7 2.19595051
name8 1.82343006
name9 20.51372623
name0 59.42693043
我检查了慢查询日志,但当发生锁定时,每个查询都会被转储到慢查询日志中。当发生运行进程列表时,我还没有进入服务器。除此之外我还能做什么吗?
更新:以下是 tuning-primer.sh 脚本的输出:https://gist.github.com/913565
更新:以下是异常期间的 IOStat:
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 5.25 6.05 106.35 3090763 54314928
还有一个 vmstat 3:https://gist.github.com/913565#file_vmstat%203
现在有更多 SAR!https://gist.github.com/913565#file_sar
谢谢您的帮助。
答案1
尝试sar
在后台安装并运行它。您的磁盘负载可能会激增。 sar
当出现此类问题时,它会让您看到哪些资源的负载最重。
高sys
负载可能表明有大量 I/O 发生。这可能是数据库自然增长的结果。您是否已建立归档过程以从数据库中删除旧数据?如果没有,您将达到表扫描所需的数据不再适合内存的程度。当这种情况发生时,性能将突然大幅下降。慢查询日志可能包含一些可以通过添加索引来改进的查询。
如果您有其他可以运行的系统munin
,您可能希望munin-node
在服务器上安装。这将为您提供一些可用数据的图形输出sar
。时不时检查一下图表,看看情况是否有变化。
编辑:看起来您在 apache 下运行的某些代码中可能存在内存泄漏。尝试将其设置MaxRequestsPerChild
为 100 左右并重新启动 apache。如果这解决了您的问题,请尝试查找您的内存泄漏。
答案2
您的数据库大小以 MB 为单位,对吗?这个数字相当小,应该几乎完全符合配置的内存量,所以我不认为 mysql 是这里的问题。您能否发布一下MySQL 调优入门无论如何?此外,您肯定应该使用类似 munin/cacti/.. 之类的东西来绘制和收集有关系统的数据。您的机器正在运行哪种软件?php 之类的东西?您是否已经在使用 APC 之类的操作码缓存?
答案3
是否有可能由于数据量增长到一定程度,导致定期的 MySQL 查询开始返回/处理如此多的结果,以致 MySQL 耗尽物理内存而不得不使用大量虚拟内存?
答案4
除了该工具之外,您sar
还可以使用其他工具。如果问题与 IO 有关,iostat 将为您提供帮助。如果您向我们提供输出,例如,也许我们可以更好地帮助您。(这将每 3 秒打印出 vmstat 输出。您可以在一两分钟后停止该工具。)vmstat
iostat
vmstat 3