mysqld 线程数超过 max_connections

mysqld 线程数超过 max_connections

正如问题标题所示:我已经max_connections = 2在我的my.cnf文件中进行了设置,但是当我激活我的 mysql 守护进程时,线程计数为 37。我正在网上搜索,但找不到迹象表明我的期望是错误的。我max_connections正确理解该指令吗?任何人都可以提出为什么这可能不会限制线程数的原因吗?

尝试解决方案

  1. 我通过 mysql CLI 客户端查询 mysql 全局变量:
| Variable_name              | Value                |
+----------------------------+----------------------+
| max_allowed_packet         | 67108864             |
| max_binlog_cache_size      | 18446744073709547520 |
| max_binlog_size            | 1073741824           |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_connect_errors         | 100                  |
| max_connections            | 2                    |
| max_delayed_threads        | 20                   |
| max_digest_length          | 1024                 |
| max_error_count            | 1024                 |
| max_execution_time         | 0                    |
| max_heap_table_size        | 16777216             |
| max_insert_delayed_threads | 20                   |
| max_join_size              | 18446744073709551615 |
| max_length_for_sort_data   | 4096                 |
| max_points_in_geometry     | 65536                |
| max_prepared_stmt_count    | 16382                |
| max_relay_log_size         | 0                    |
| max_seeks_for_key          | 18446744073709551615 |
| max_sort_length            | 1024                 |
| max_sp_recursion_depth     | 0                    |
| max_user_connections       | 2                    |
| max_write_lock_count       | 18446744073709551615 |

这确认了my.cnf文件已正确加载,因为max_connections变量确实设置为 2。 2) 从 (1) 中的输出可见,我max_user_connections也尝试限制该变量,但同样没有运气。 3)我杀死了我怀疑可能正在查询 mysql 守护进程的其他服务器进程 - httpd、php-fpm,但这并没有减少线程数量。

系统规格

我的 MySQL 版本是 8.3.0,并且是最小安装:

mysql-8.3.0-linux-glibc2.17-x86_64-minimal

更新

运行查询SHOW PROCESSLIST返回:

*************************** 1. row ***************************
     Id: 5
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 146457
  State: Waiting on empty queue
   Info: NULL
*************************** 2. row ***************************
     Id: 11
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: init
   Info: SHOW PROCESSLIST
2 rows in set, 1 warning (0.00 sec)

我发现 running 更有帮助SELECT * FROM performance_schema_threads\G,它返回有关 mysqld 正在执行的许多任务的信息。我怀疑这个任务列表将对应于线程和运行的数量:

SELECT COUNT(*) FROM performance_schema.threads\G

返回:

38

这很好地对应了线程的数量 - 我怀疑额外的任务对应于主进程。在终端中:

pstree | grep sql
|-mysqld---37*[{mysqld}

通过阅读返回的任务名称performance_schema.threads,我发现这些线程对于 MySQL 的运行是必需的,因为它们的名称是io_read_threadio_write_threadlog_writer_thread类似的。

设置max_connections按预期工作 - 设置max_user_connections=2并尝试打开第三个客户端作为root返回:

ERROR 1203 (42000): User root already has more than 'max_user_connections' active connections

但是,如果max_connections设置为2,而max_user_connections为 at 6,我可以使用 root 用户同时打开 3 个 mysql 客户端。当我尝试以 root 身份打开第四个客户端时,我收到:

ERROR 1040 (HY000): Too many connections

一个用户下三个客户端会话的限制是如何因以下my.cnf限制而产生的:

max_connections = 2
max_user_connections = 6
thread_cache_size = 2

我正在继续阅读 MySQL 文档,但尚未找到解释。如果更有经验的人可以提供清晰的信息,我将不胜感激。这些设置如何影响连接(以及线程)数量?

相关内容