问题描述
我有一个相当大的 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 秒才能完成。
以下是我所知道的情况:
- 这不是一个未优化的恶意查询。它发生在不同的机器上,不仅运行不同的查询,还运行不同的表。
- 这只会发生在写入 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 的值是多少?