web-dev-qa-db-ja.com

スレッドの可能な最大数を決定するにはどうすればよいですか?

Mysqldが作成するスレッドの最大数を決定する要因は何ですか?

私はmysqlについてのみ考慮し、オペレーティングシステムによって課される可能性のある制限については考慮しません。さらに、私はLinuxのみに関心がありますが、Windowsに固有の情報を含めたい場合は自由に考えてください。

私の知る限り、レプリケーション用にスレッドを作成できます。これは、クライアント接続ごとに1つ、max_connectionsまで1つ、スーパー接続を処理するために+1を追加したものです。他に何がありますか、それですか?

threads_max =   max_connections  
              + 1 for super  
              + 2 for replication slave threads  
              + ? for InnoDB ?
6
Preston

たとえばLinuxでは、次のいずれか小さい方です。

grep -F 'Max process' /proc/$(/sbin/pidof mysqld)/limits|awk '{print $3}'

そして:

mysql -e'show global variables like "max_connections"'

更新:ご指摘のとおり、少なくともバックグラウンドスレッドをリストに追加する必要があります。以下の詳細情報。

最後の更新に関する限り、InnoDBには innodb_read_io_threadsおよびinnodb_write_io_threads があります。

私がチェックしたところ、デフォルト値を持つdebianのMySQL 5.5.34があります。

mysql> pager grep -i thread
PAGER set to 'grep -i thread'
mysql> show engine innodb status\G
BACKGROUND THREAD
srv_master_thread loops: 1 1_second, 1 sleeps, 0 10_second, 1 background, 1 flush
srv_master_thread log flush and writes: 2
MySQL thread id 36, OS thread handle 0xa6c32b40, query id 105 localhost root
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Main thread process no. 21508, id 2758552384, state: waiting for server activity
1 row in set (0.00 sec)

mysql>

そしてOSは次のように認識します。

root@ubuntu:~# ps -Lp$(pidof mysqld) |wc -l
18

ルートとして接続した後、スレッド数は同じままでした(別の1つをタフにしたときにスレッド数が増加しました)。

root@ubuntu:~# mysql -proot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.34-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \! ps -Lp$(pidof mysqld) |wc -l
18
mysql> show global status like '%thread%';
+------------------------------------------+-------+
| Variable_name                            | Value |
+------------------------------------------+-------+
| Delayed_insert_threads                   | 0     |
| Performance_schema_thread_classes_lost   | 0     |
| Performance_schema_thread_instances_lost | 0     |
| Slow_launch_threads                      | 0     |
| Threads_cached                           | 0     |
| Threads_connected                        | 1     |
| Threads_created                          | 1     |
| Threads_running                          | 1     |
+------------------------------------------+-------+
8 rows in set (0.01 sec)

mysql> show global variables like '%thread%';
+-----------------------------------------+---------------------------+
| Variable_name                           | Value                     |
+-----------------------------------------+---------------------------+
| innodb_purge_threads                    | 0                         |
| innodb_read_io_threads                  | 4                         |
| innodb_thread_concurrency               | 0                         |
| innodb_thread_sleep_delay               | 10000                     |
| innodb_write_io_threads                 | 4                         |
| max_delayed_threads                     | 20                        |
| max_insert_delayed_threads              | 20                        |
| myisam_repair_threads                   | 1                         |
| performance_schema_max_thread_classes   | 50                        |
| performance_schema_max_thread_instances | 1000                      |
| thread_cache_size                       | 8                         |
| thread_concurrency                      | 10                        |
| thread_handling                         | one-thread-per-connection |
| thread_stack                            | 196608                    |
+-----------------------------------------+---------------------------+
14 rows in set (0.00 sec)

だから、私が言ったように、これはバージョン固有かもしれませんが、私たちは持っているようです:

  • srv_master_thread
  • nI/Oスレッド(innodb_read_io_threads、innodb_write_io_threads、挿入バッファースレッド、ログスレッド)
  • その他のバックグラウンドスレッド(この場合は7:合計18-10(I/O)-1(メイン))。

したがって、何らかの容量計画を行う必要がある場合は、起動後にユーザー/アプリ接続なしでバックグラウンドスレッドの数を確認し、それに追加することをお勧めします。

  1. スーパー特権を持つユーザーの場合1
  2. max_connectionsの値
  3. 2 xレプリケーションスレーブ
4

現在のスレッド(すべてのフォアグラウンドスレッドとバックグラウンドスレッドを含む)を確認する最善の方法は、performance_schemaを使用することです。例えば:

mysql 5.7.3> select thread_id, name, type, PROCESSLIST_ID from performance_schema.threads;
+-----------+----------------------------------------+------------+----------------+
| thread_id | name                                   | type       | PROCESSLIST_ID |
+-----------+----------------------------------------+------------+----------------+
|         1 | thread/sql/main                        | BACKGROUND |           NULL |
|         2 | thread/innodb/io_log_thread            | BACKGROUND |           NULL |
|         3 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         4 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         5 | thread/innodb/io_ibuf_thread           | BACKGROUND |           NULL |
|         6 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         7 | thread/innodb/io_read_thread           | BACKGROUND |           NULL |
|         8 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|         9 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        10 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        11 | thread/innodb/io_write_thread          | BACKGROUND |           NULL |
|        14 | thread/innodb/srv_lock_timeout_thread  | BACKGROUND |           NULL |
|        15 | thread/innodb/srv_error_monitor_thread | BACKGROUND |           NULL |
|        16 | thread/innodb/srv_monitor_thread       | BACKGROUND |           NULL |
|        17 | thread/innodb/srv_master_thread        | BACKGROUND |           NULL |
|        18 | thread/innodb/srv_purge_thread         | BACKGROUND |           NULL |
|        19 | thread/innodb/page_cleaner_thread      | BACKGROUND |           NULL |
|        20 | thread/sql/signal_handler              | BACKGROUND |           NULL |
|        22 | thread/sql/one_connection              | FOREGROUND |              2 |
+-----------+----------------------------------------+------------+----------------+
19 rows in set (0.00 sec)

バックグラウンドスレッドの数は固定されていると思います(実際の数は、innodb_read_io_threadsinnodb_purge_threadsなどの構成設定によって異なります)。FOREGROUNDスレッドは、接続ごとに1つ+その上にthread_cache_sizeの可能性があります。

6
Morgan Tocker