MySQL innodb 每分钟有大量进程处于“更新”状态

MySQL innodb 每分钟有大量进程处于“更新”状态

问题描述

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

当我在正常时间对每台服务器执行操作时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 使用率很高(虽然我认为高 CPU 可能是由高磁盘 I/O 引起的),因为当它处于这种情况时,我运行一些简单的程序SELECT NOW(),即使这样也需要 4 秒才能完成。

以下是我所知道的情况:

  1. 这不是一个未优化的恶意查询。它发生在不同的机器上,不仅运行不同的查询,还运行不同的表。
  2. 这只会发生在写入 innoDB 表的机器上。这不会发生在仅读取 innoDB 的机器上,也不会发生在仅写入或读取 MyISAM 的机器上。

问题

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

附加信息

操作系统:

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

突袭配置:

/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)

答案1

你确定你没有每分钟运行一次的 cron 作业吗?

您的 innodb_flush_method 值是多少?

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

您可能还想使用 innotop 之类的工具来更好地分析负载。尤其是待处理的 I/O。

高血压

编辑:您对 innodb_buffer_pool_size 的值是多少?

相关内容