mysqld 스레드 수가 max_connections를 초과합니다.

mysqld 스레드 수가 max_connections를 초과합니다.

질문 제목에서 알 수 있듯이 파일 max_connections = 2에 설정했지만 my.cnfmysql 데몬을 활성화하면 스레드 수가 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 |

이는 변수가 실제로 2로 설정되었으므로 my.cnf파일이 올바르게 로드되었음을 확인합니다. max_connections2) (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)

나는 실행이 더 도움이 된다고 생각하며 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

하지만 at max_connections으로 설정하면 루트 사용자를 사용하여 동시에 3개의 mysql 클라이언트를 열 수 있습니다. 네 번째 클라이언트를 루트로 열려고 하면 다음과 같은 메시지가 나타납니다.2max_user_connections6

ERROR 1040 (HY000): Too many connections

한 사용자의 세 클라이언트 세션 제한은 my.cnf다음 제한 사항으로 인해 발생합니다.

max_connections = 2
max_user_connections = 6
thread_cache_size = 2

?

계속해서 MySQL 문서를 읽고 있지만 아직 설명을 찾지 못했습니다. 경험이 많은 분이 좀 더 명확한 설명을 해주시면 감사하겠습니다. 이러한 설정은 연결 수(따라서 스레드 수)에 어떤 영향을 줍니까?

관련 정보