当绝对没有任何连接且没有查询时,mysqld 恒定 CPU 使用率

Der*_*rek 9 mysql

我在 Windows 开发机器上使用 mysql,并且很长一段时间都很好。

但是今天我的电脑运行缓慢,我注意到 mysqld.exe 使用了 25% 到 40% 的 CPU。

我试过重新启动并给它一些时间,但即使在桌面上空闲时,CPU 使用率也相当稳定。我注意到硬盘也很努力地工作,可能是因为 mysqld

我确信没有任何东西在使用服务器,因为唯一可以连接到它的是我正在开发的本地机器上的应用程序,它没有运行。

但是,为了确保我运行了以下语句

C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqladmin -u root -p status
Enter password: **********
Uptime: 995  Threads: 1  Questions: 2  Slow queries: 0  Opens: 67  Flush tables: 1
Open tables: 60  Queries per second avg: 0.002

C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqladmin -u root -p processlist
Enter password: **********
+----+------+----------------+----+---------+------+-------+------------------+
| Id | User | Host           | db | Command | Time | State | Info             |
+----+------+----------------+----+---------+------+-------+------------------+
| 2  | root | localhost:1775 |    | Query   | 0    | init  | show processlist |
+----+------+----------------+----+---------+------+-------+------------------+
Run Code Online (Sandbox Code Playgroud)

这似乎也表明服务器没有做任何事情。

那么,什么给?mysqld 在做什么?

编辑:我最近确实杀死了一个需要很长时间的更新语句。这可能与它有关吗?

Mor*_*ker 7

是的,您的 kill 语句可能是原因。

该命令SHOW PROCESSLIST只会向您显示前台线程中发生的事情。InnoDB 可能会在后台回滚事务。您可能会发现一些有用的诊断信息:

  • SHOW ENGINE INNODB STATUS- 看看 InnoDB 内部发生了什么。在 'TRANSACTIONS' 下,您应该会看到您被杀死的 staetment 正在回滚。

  • SELECT * FROM performance_schema.threads - 显示 MySQL 中的所有线程。

  • MySQL Workbench 6.1 包括Performance Schema Reports,以可视化的形式展示了其中的一些数据。


Mic*_*bot 6

您添加这个事后想法可能是件好事,因为这很可能是您正在经历的...服务器正在回滚在您终止大型更新之前已经完成的工作。

\n
\n

如果大事务正在降低服务器性能,则回滚可能会使问题变得更糟,执行时间可能是原始 DML 操作的数倍。

\n
\n

即使重新启动后?是的...

\n
\n

终止数据库进程没有帮助,因为回滚会在服务器启动时再次开始。

\n

\xe2\x80\x94 http://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-transaction-management.html

\n
\n

InnoDB 将数据保存在它正在更改的行中,并且针对仍在回滚的更改的查询应该使用仍在撤消日志中的数据来透明地回答

\n

您可能还会发现大量磁盘活动与以下内容相关mysqld

\n
$ sudo apt-get install iotop\n$ sudo iotop\n
Run Code Online (Sandbox Code Playgroud)\n

一种方法可以避免失控回滚,在我引用的引用链接中也有解释,上面......但你最安全的选择是让它搅动一段时间。

\n