在没有活动查询的情况下,mysqld CPU 使用率极高

在没有活动查询的情况下,mysqld CPU 使用率极高

我有一个运行带有 LEMP 堆栈的 Ubuntu 12.04 LTS 的 VPS,按照 Linode 库的指南(因为我使用 Linode)进行设置,到目前为止一切运行正常。

我不知道哪里出了问题,但我的 CPU 使用率从一周前就开始上升了。今天情况变得非常糟糕 - 我的 CPU 使用率达到了 74%,所以我去检查了一下,发现 mysqld 占用了太多的 CPU 使用率(大约在 30% 到 80%)

所以我做了一些 Google 搜索,尝试禁用 InnoDB,重新启动 mysql,重置 ntp/系统时钟(这个错误不是应该在一年多前发生的吗?!)并重新启动我的 VPS,但都无济于事。即使 mysql 进程列表为空,我仍然发现 mysqld CPU 使用率非常高。

我不知道我错过了什么,也完全没有头绪,如有任何建议我将不胜感激。

提前致谢。

更新:

我从运行“strace mysqld”获得这些

write(2, "InnoDB: Unable to lock ./ibdata1"..., 44) = 44
write(2, "InnoDB: Check that you do not al"..., 115) = 115
select(0, NULL, NULL, NULL, {1, 0}^[[A^[[A)     = 0 (Timeout)
fcntl64(3, F_SETLK64, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}, 0xbfa496f8) = -1 EAGAIN (Resource temporarily unavailable)

嗯...我确实尝试禁用 InnoDB,但并没有解决这个问题。有什么想法吗?

更新2:

# ps -e | grep mysqld
13099 ?        00:00:20 mysqld

然后使用“strace -p 13099”,会重复出现以下几行:

fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(12, {sa_family=AF_FILE, NULL}, [2]) = 14
fcntl64(12, F_SETFL, O_RDWR)            = 0
getsockname(14, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, [30]) = 0
fcntl64(14, F_SETFL, O_RDONLY)          = 0
fcntl64(14, F_GETFL)                    = 0x2 (flags O_RDWR)
setsockopt(14, SOL_SOCKET, SO_RCVTIMEO, "\36\0\0\0\0\0\0\0", 8) = 0
setsockopt(14, SOL_SOCKET, SO_SNDTIMEO, "<\0\0\0\0\0\0\0", 8) = 0
fcntl64(14, F_SETFL, O_RDWR|O_NONBLOCK) = 0
setsockopt(14, SOL_IP, IP_TOS, [8], 4)  = -1 EOPNOTSUPP (Operation not supported)
futex(0xb786a584, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0xb786a580, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0xb7869998, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=10, events=POLLIN}, {fd=12, events=POLLIN}], 2, -1) = 1 ([{fd=12, revents=POLLIN}])

呃...现在我完全不明白 x_x 帮忙

答案1

从结果来看strace,您的 mysql 服务器正在接受连接。poll调用表示等待连接,accept调用表示接受传入连接。因此,一定有很多连接和查询。

您说SHOW PROCESSLIST只返回了您正在查询的进程列表。实际上,此命令只能显示调用时的特定时刻的连接。流行的 PHP 站点通常不支持持久的 MySQL 连接。而且查询通常不会占用太多时间,而只会占用 CPU。

我认为您应该检查所有连接到 MySQL 服务器的程序/站点。也许您可以打开 MySQL 查询日志以获取更多详细信息。

答案2

您能发出“SHOW PROCESSLIST”命令吗?有多少个连接?每个连接占用一个线程,也许高 CPU 负载是因为空闲连接。

相关内容