我有一个运行带有 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 负载是因为空闲连接。