正如问题标题所示:我已经max_connections = 2
在我的my.cnf
文件中进行了设置,但是当我激活我的 mysql 守护进程时,线程计数为 37。我正在网上搜索,但找不到迹象表明我的期望是错误的。我max_connections
正确理解该指令吗?任何人都可以提出为什么这可能不会限制线程数的原因吗?
尝试解决方案
- 我通过 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_thread
、io_write_thread
和log_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 文档,但尚未找到解释。如果更有经验的人可以提供清晰的信息,我将不胜感激。这些设置如何影响连接(以及线程)数量?