此处为 AWS EC2 上的 Apache/MySQL/Ubuntu 堆栈。
由于某种原因,我的 Web 服务器使用率飙升至 99%,我的服务器变得完全无法使用。这真是令人沮丧。我没有能力解决问题,因为服务器完全没有响应,我无法登录。我知道这与 MYSQL 有关,就是这样。它会慢慢增加 CPU 使用率,直到达到 100%,我只能通过 AWS UI 强制停止并启动实例。
我的解决方法是,如果 CPU 使用率达到某个点,则自动重启 MySQL/Apache。我尝试过cpu-limit
,但不知道该如何将其附加到已在运行的 PID 上。
我只想能够限制 CPU 直到达到该点,然后我可以尝试阅读日志或查看发生了什么。谢谢您的帮助。
答案1
相反,打开 slowlog 并有long_query_time=1
(或更少)。在下一次 CPU 峰值之后,使用pt-query-digest
来分析 slowlog。(如果需要,我们可以提供帮助。)
这将发现哪些查询花费的时间最长(因此可能使用最多的 CPU)。通常,“解决方法”是为某些表创建更好的复合索引。
更多的:http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog
答案2
在高负载下运行额外的事物需要剩余一些容量。在 systemd 系统上,让它与资源控制。
systemctl edit mysql.service
向单元添加低于默认值 100 的 CPU 和 IO 权重。CPU 配额是 1 个 CPU 的百分比,而您没有提到 CPU 的数量,因此这个绝对限制可能需要调整。还请启用 CPU、IO 和内存核算。
[Service]
CPUAccounting=yes
CPUWeight=50
#CPUQuota=90%
IOAccounting=yes
IOWeight=50
MemoryAccounting=yes
TasksAccounting=yes
编辑配置中的 drop 后,systemctl daemon-reload
使用systemd-cgtop
查看服务的资源消耗。特别是,确认资源确实由数据库而不是 httpd 使用。
也可以看看:如何限制 systemd 服务与 CPU“友好配合”?
这并不能解释性能问题,只能降低 mysql 的优先级,以便其他程序能够运行。使用 Linux 性能工具来评估工作负载。入门工具集是60,000 毫秒内的 Linux 性能分析从 Brendan Gregg 在 Netflix 工作时开始。以下要点需要重复:
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
我怀疑该盒子缺少存储 I/O 或内存,但我没有证据证明这一点。从 Web 服务器和数据库的角度详细检查系统。