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後に3番目のクライアントを開こうとすると、root次のものが返されます。

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

しかし、atmax_connectionsに設定すると、rootユーザーを使用して3つのmysqlクライアントを同時に開くことができます。 4番目のクライアントをrootとして開こうとすると、次のメッセージが表示されます。2max_user_connections6

ERROR 1040 (HY000): Too many connections

1人のユーザーの3つのクライアントセッションの制限は、my.cnf次の制限によって発生します。

max_connections = 2
max_user_connections = 6
thread_cache_size = 2

私はまだMySQLドキュメントを読んでいますが、まだ説明が見つかりませんでした。経験豊富な方が、より明確な説明をしていただければ幸いです。これらの設定は接続数(したがってスレッド数)にどのような影響を与えますか?

関連情報