如何确定是什么导致我的服务器的平均负载跳到90

好的,我在这里完全损失。 我已经有了这个Ubuntu服务器运行了三年。 在过去的几个月里,它开始performance得很奇怪,而且越来越糟。 这是一个非常繁忙的服务器,运行着15个网站和其他一些工具。 典型的15分钟平均负载是0.3。 然而,它每12小时左右就会跳到90左右。

我敢肯定,这是有关的MySQL和服务器以某种方式被locking和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 

我检查了慢查询日志,但是当locking发生时,每个查询都被转储到慢查询日志中。 碰巧运行一个proccesslist的时候,我还没有进入服务器。 除此之外还有什么我可以做的吗?

更新:这是来自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

现在有更多的特区! https://gist.github.com/913565#file_sar

谢谢您的帮助。

尝试安装sar并在后台运行它。 您可能有一个磁盘负载尖峰。 sar会让你看到什么资源有最重的负载,当这样的事情出错。

你很高的sys负载可能表明你有很多的I / O发生。 这可能是数据库自然增长的结果。 你有一个归档过程,从数据库中删除旧数据? 如果没有,您将达到表扫描所需数据不再适合内存的地步。 当这种情况发生时,性能会突然显着下降。 慢查询日志可能包含一些可以通过添加索引来改进的查询。

如果你有另外一个可以运行munin系统,你可能需要在服务器上安装munin-node 。 这会给你一些从sar可用的数据的graphics输出。 每隔一段时间检查一次图表,看看事情是否正在改变。

编辑:它看起来像你可能有一些代码运行在Apache下的内存泄漏。 尝试将MaxRequestsPerChild设置为100左右,然后重新启动apache。 如果这可以解决您的问题,请尝试查找内存泄漏。

你的数据库大小是MB,对不对? 这是相当小的,应该几乎坚持到configuration的内存量,所以我不认为这是MySQL的问题在这里。 你可以请张贴的MySQL调整入门的输出无论如何? 另外,你应该肯定像munin / cacti / ..来绘制和收集关于你的系统的数据。 什么样的软件运行你的机器? PHP的东西? 您是否已经使用像APC一样的操作码caching?

有可能数据的大小已经增长到一个周期性的MySQL查询已经开始返回/处理如此之多的结果,以至于MySQL耗尽物理内存并且不得不利用大量的虚拟内存?

开放时间:13818开放表格:256

…每个表都是从磁盘打开的,但其中有256个。 磁盘缓慢和阻滞剂。

您可以尝试在/etc/mysql/my.cnf增加mysql的table_cache

还运行:

 mysqlcheck --auto-repair --check --optimize --all-databases 

恢复原来的performance。

无论如何,内存的2G,为26米httpd进程,给你不超过+/- 80 httpd进程的空间…说,许多networking有50到100个“文件”(JS,CSS,IMG等)到服务器每个请求…所以交换和阻止是很容易的几次访问。

除了工具sar之外,您还可以使用vmstatiostat工具。 如果问题与IO相关,iostat将帮助您。 也许我们可以帮助你更好,如果你给我们例如vmstat 3的输出。 (这将每3秒钟输出一次vmstat输出,一两分钟后就可以停止工具了。)