MySQL的innodb有很多进程挂在每分钟一次的“更新”状态

问题描述

我有一个相当大的MySQL安装。 至less有3个独立的服务器运行innodb存储引擎。 每分钟一次,每分钟同一时间,大约3-4秒,我的每一台无人机突然停止运转。

当我在正常的时间在每个服务器上执行SHOW PROCESSLIST时,我会看到大约10-15个连接,正常工作:

 +--------+------------------+--------------------------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +--------+------------------+--------------------------+------+---------+------+-------+------------------+ | 23457 | root | localhost | NULL | Query | 0 | NULL | show processlist | | 180042 | ********** | web2.***.com:49867 | *** | Sleep | 1 | | NULL | | 180129 | ********** | web1.***.com:54302 | *** | Sleep | 0 | | NULL | | 180155 | ********** | web2.***.com:50225 | *** | Sleep | 0 | | NULL | | 180163 | ********** | web1.***.com:54425 | *** | Sleep | 0 | | NULL | | 180172 | ********** | web1.***.com:54507 | *** | Sleep | 0 | | NULL | | 180181 | ********** | web4.***.com:34893 | *** | Sleep | 0 | | NULL | +--------+------------+--------------------------+------+---------+------+-------+------------------------+ 

然后突然间,在每台机器上几乎完全同步,在每分钟的同一时间(意思是在每台机器上每分钟一分钟后的47秒),进程将以“更新”状态堆积起来:

 | 192938 | ********** | web3.***.com:44248 | *** | Query | 3 | update | INSERT INTO user_stats (***_uid, data) VALUES (101670151,"{\"inbox\":{\"new\":12,\"spam_check\":1289 | | 192939 | ********** | web4.***.com:50264 | *** | Query | 3 | update | INSERT INTO user_stats (***_uid, data) VALUES (17103785,"{\"inbox\":{\"new\":1,\"spam_check\":0,\"di | | 192940 | ********** | web3.***.com:44258 | *** | Query | 3 | update | INSERT INTO user_stats (***_uid, data) VALUES (2245293,"{\"inbox\":{\"new\":14,\"spam_check\":128933 | | 192941 | ********** | web3.***.com:44268 | *** | Query | 3 | update | INSERT INTO user_stats (***_uid, data) VALUES (105330063,"{\"inbox\":{\"new\":4,\"spam_check\":0,\"d | ... 100-200 more just like this... | 192941 | ********** | web3.***.com:44268 | *** | Query | 3 | update | INSERT INTO user_stats (***_uid, data) VALUES (105330063,"{\"inbox\":{\"new\":4,\"spam_check\":0,\"d | 

经过仔细观察,似乎CPU的使用率很高(尽pipe我认为高CPU可能是由高磁盘I / O引起的),因为当它处于这种状态时,我运行一些简单的SELECT NOW() ,即使这将需要4秒钟完成。

以下是我所知道的:

  1. 这不是一个stream氓未优化的查询。 发生在不同的机器上,不仅运行不同的查询,而且不同的表。
  2. 它只发生在写入innoDB表的机器上。 这种情况在只读取innoDB的机器或者只能读写MyISAM的机器上不会发生。

问题

是否有一个进程每分钟运行innoDB,占用大量的CPU或磁盘I / O? 这是正常的吗? 我知道这可能是一百万个不同的事情,但我正在寻找已知的问题或解决scheme。 有没有更多的信息可以帮助解决这个问题?

附加信息

OS:

 uname -a Linux db04.****.com 2.6.18-194.17.4.el5 #1 SMP Wed Oct 20 13:03:08 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux 

文件系统:

 /dev/sda4 ext3 785711096 80539996 665259216 11% /data 

RAIDconfiguration:

 /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL Adapter 0 -- Virtual Drive Information: Virtual Disk: 0 (target id: 0) Name:Virtual Disk 0 RAID Level: Primary-1, Secondary-3, RAID Level Qualifier-0 Size:856704MB State: Optimal Stripe Size: 64kB Number Of Drives:2 Span Depth:3 Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU Access Policy: Read/Write Disk Cache Policy: Disk's Default 

MySQL版本

 mysql> select version(); +---------------------------+ | version() | +---------------------------+ | 5.0.80-enterprise-gpl-log | +---------------------------+ 1 row in set (0.01 sec) 

你确定你没有每分钟都有一个cron工作吗?

innodb_flush_method的价值是什么?

由于您的RAID控制器带有支持BBU的写入caching(并且数据/日志未存储在SAN上),build议的设置为:O_DIRECT

你可能也想用innotop这样的工具来更好地分析你的负载。 特别是等待中的I / O。

HTH

编辑:你对innodb_buffer_pool_size的价值是什么?