我有一个具有这样参数的服务器:
安装了5.5.5-10.4.12-MariaDB-1:10.4.12+maria~bionic
。在这个屏幕截图中显示了一个标准的DB加载:
所以我有大约400到500个每秒的选择(大部分来自不太大的有500 K记录的表),每秒100到190次更新,以及大约50-150个同时连接。
我的问题是:有时,由于没有明显的原因,服务器有2000-3000个打开的连接/进程。根据SHOW FULL PROCESSLIST
,它们是标准的SQL请求,但具有“发送数据”状态,运行时间为400-500秒。当然,此时服务器冻结,无法正常工作。我说“没有明显的理由”,因为在这个时候,我没有看到任何增加的用户数量或在网站上的活动增加。此外,重新启动MariaDB服务或完全重新启动服务器有助于摆脱这种情况,但并不总是如此:有时,即使在重新启动之后,我也几乎立即获得了相同的2000-3000个冻结进程。
是否有人遇到过类似的数据库行为?如有任何意见,我将不胜感激。
UPD:
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
发布于 2020-09-08 02:11:03
解决方案非常简单:在研究了MariaDB文档(特别是本文https://mariadb.com/kb/en/thread-pool-in-mariadb/)之后,我在my.cnf
中添加了以下内容,问题就消失了
thread_handling=pool-of-threads
thread_pool_size=48
#48 is a number of CPUs
https://stackoverflow.com/questions/63579091
复制相似问题