mysql - MariaDB 10.4 随机性能下降
问题描述
我有一个具有以下参数的服务器:
- 操作系统:Ubuntu 18.04.4 LTS x86_64
- 主机:X11DPi-N(T)
- 内核:4.15.0-112-generic
- CPU:Intel Xeon Silver 4214 (48) @ 2.201GHz
- GPU:ASPEED Technology, Inc. ASPEED 图形系列
- 内存:18552MiB / 96336MiB
- SSD 三星 MZQLB960HAJR-00007 894.3G x 2
随着安装5.5.5-10.4.12-MariaDB-1:10.4.12+maria~bionic
。在此屏幕截图中显示了标准数据库负载:
所以我每秒大约有 400-500 次选择(主要来自具有 50 万条记录的不太大的表),每秒 100-190 次更新,以及大约 50-150 次同时连接。
我的问题是:有时,没有明显的原因,服务器有 2000-3000 个打开的连接/进程。根据SHOW FULL PROCESSLIST
它们是标准 SQL 请求,但具有“发送数据”状态和 400-500 秒的运行时间。当然,此时服务器死机,无法正常运行。我说“没有明显的原因”,因为此时我没有看到用户数量增加或网站上的活动增加。此外,重新启动 MariaDB 服务或完全重新启动服务器有助于摆脱这种情况,但并非总是如此:有时即使在重新启动后,我几乎会立即获得相同的 2000-3000 个冻结进程。
有没有人遇到过类似的数据库行为?我会很感激任何想法。
升级版:
我所有的 SELECT 只调用一个表(约 50 万条记录,没有
JOIN
和/或子查询),而且大多数都有LIMIT 1
,所以没有那么多数据。错误日志显示了很多这样的记录:
2020-08-26 22:12:35 787380 [Warning] Aborted connection 787380 to db: ... (Got timeout reading communication packets)
innodb_lock_wait_timeout
为 50(默认)慢查询日志没有显示异常
我的
optimizer_switch
设置:index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=on,table_elimination=on,extended_keys=on,exists_to_in=on,orderby_uses_equalities=on,condition_pushdown_for_derived=on,split_materialized=on,condition_pushdown_for_subquery=on,rowid_filter=on,condition_pushdown_from_having=on
解决方案
这听起来像是查询优化器随机死机的经典案例。这是一个长期存在的heisenbug。
当您看到查询堆积如山时,运行SHOW EXPLAIN FOR thread_id
堆积的 ID 之一。查看查询计划是否不合理。如果是,请编辑查询应用端以包含索引提示,以防止查询优化器出错。如果您无法更改查询,您将不得不摆弄optimizer_switch
设置,直到您确定并删除使优化器发疯的特定选项。
推荐阅读
- react-native - 当我尝试将数据呈现到表中时,它会抛出 null is not object in React Native
- sparql - GraphDB 查询静默失败 (OutOfMemoryError)
- c# - 一个接一个地运行任务
- angular - Angular - 无法解析 node_modules\ngx-croppie\esm5 中的“croppie”
- python - 将 Python 脚本转换为能够在 Spark/Hadoop 中运行
- docker - 使用动态参数运行 docker
- android-studio - 使用 android studio 3.1.2 后显示 error=2, No such file or directory
- haskell - 如何使 Either 成为第二种类型的函子
- javascript - 声明的变量返回“未定义”
- heroku - 将域重定向到 Heroku 上托管的应用程序