この記事では、MySQL サーバーのスレッド数を確認する方法を主に紹介し、関連するコマンド、設定、パラメーター、および必要な友人が参照できるように、mysql スレッドの数を確認するための関連使用スキルを分析します。それがあなたのお役に立てば幸いです。
mysql 再起動コマンド:
/etc/init.d/mysql restart
MySQL サーバーの正常でスムーズな動作を確保するには、MySQL サーバーのスレッド数が適切な範囲内である必要があります。 Threads_created は作成されたスレッドの数を示します。Threads_created を表示すると、MySQL サーバーのプロセスのステータスを確認できます。
mysql> show global status like 'Thread%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 46 | | Threads_connected | 2 | | Threads_created | 570 | | Threads_running | 1 | +-------------------+-------+
MySQL サーバー設定ファイルで thread_cache_size を設定すると、クライアントが切断されたときに、このクライアントを処理しているサーバーのスレッドは破棄されるのではなく、次のクライアントに応答するためにキャッシュされます (キャッシュ番号が変更されていない場合)上限に達しました)。
Threads_created は、作成されたスレッドの数を示します。Threads_created 値が大きすぎることが判明した場合は、MySQL サーバーが比較的リソースを大量に使用するスレッドを作成していることを示します。設定ファイル内の thread_cache_size 値を増やすことができます。適切に変更してサーバーにクエリを実行します
thread_cache_size 構成:
mysql> show variables like 'thread_cache_size'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | thread_cache_size | 64 | +-------------------+-------+
この例のサーバーは非常に正常です。
接続数に関連するいくつかの MySQL パラメータを分析します
MySQL の変数とステータスは、Oracle の spfile や v$ テーブルと同様、管理とメンテナンスのための強力なツールです。
MySQL は、最大接続数 max_connections など、システム変数を通じて多くの構成情報を記録します。
mysql> show variables like '%connect%'; +--------------------------+-----------------+ | Variable_name | Value | +--------------------------+-----------------+ | character_set_connection | utf8 | | collation_connection | utf8_general_ci | | connect_timeout | 10 | | init_connect | SET NAMES utf8 | | max_connect_errors | 10 | | max_connections | 200 | | max_user_connections | 0 | +--------------------------+-----------------+ 7 rows in set (0.00 sec)
このパラメータは、バージョン 5.1 では同時に接続されるクライアントの数を指します。 151 なので、実際にサポートされている接続数はこの値に 1 を加えたもの、つまり 152 です。これは、システム管理者が情報を表示するためにログインするために接続が予約されているためです。このパラメータのサイズは、使用するプラットフォームでサポートされるスレッド ライブラリの数 (Windows は最大 2048 までしかサポートできない)、サーバー構成 (特にメモリ サイズ)、各接続が占有するリソースなど、多くの要素に基づいて検討する必要があります。 (メモリや負荷)どの程度、システムが要求する応答時間など一般に、Linux システムは何百もの同時実行を問題なくサポートできます。このパラメータはグローバル スコープまたはセッション スコープで変更できます:
mysql> set global max_connections=151; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%connect%'; +--------------------------+-----------------+ | Variable_name | Value | +--------------------------+-----------------+ | character_set_connection | utf8 | | collation_connection | utf8_general_ci | | connect_timeout | 10 | | init_connect | SET NAMES utf8 | | max_connect_errors | 10 | | max_connections | 151 | | max_user_connections | 0 | +--------------------------+-----------------+ 7 rows in set (0.00 sec)
ただし、接続数の増加は多くの連鎖反応を引き起こすため、実際には結果として生じる悪影響を回避する必要があることに注意してください。 。
まず、ステータス出力を見てみましょう:
mysql> status -------------- mysql Ver 14.14 Distrib 5.1.49, for pc-linux-gnu (i686) using readline 5.1 Connection id: 255260 Current database: mysql Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.1.49-log MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 161 days 3 hours 42 min 38 sec Threads: 14 Questions: 160655492 Slow queries: 71 Opens: 8124 Flush tables: 3 Open tables: 64 Queries per second avg: 11.538 --------------
ここでは、Open tables
の出力 64 を示します。これは、現在のデータベースで開いているテーブルの数が 64 であることを意味します。 MySQL はマルチスレッド システムであり、複数の異なる同時接続が同じテーブルを開く可能性があるため、この 64 は実際の 64 のテーブルではないことに注意してください。この情報を保存するには、異なる接続セッションに独立したメモリ領域を割り当てる必要があります。衝突を避けるため。したがって、接続数の増加は、MySQL に必要なファイル記述子の数の増加につながります。さらに、MyISAM テーブルの場合、共有インデックス ファイル記述子も作成されます。 Open tables
输出时64,这就是说当前数据库打开的表的数量是64个,要注意的是这个64并不是实际的64个表,因为MySQL是多线程的系统,几个不同 的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。因此连接数的增加会导致MySQL需要的 文件描述符数目的增加。另外对于MyISAM表,还会建立一个共享的索引文件描述符。
那么在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit.
mysql> show variables like 'table_open%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | table_open_cache | 64 | +------------------+-------+ 1 row in set (0.00 sec)
这 里的table_open_cache 参数是64,这就是说所有的MySQL线程一共能同时打开64个表,我们可以搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数 的大小。查看当前的打开表的数目的办法一个是用上边提到过的status
命令,另外可以直接查询这个系统变量的值:
mysql> show status like 'open%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | Open_files | 3 | | Open_streams | 0 | | Open_table_definitions | 8 | | Open_tables | 8 | | Opened_files | 91768 | | Opened_table_definitions | 0 | | Opened_tables | 0 | +--------------------------+-------+ 7 rows in set (0.00 sec) mysql> show global status like 'open%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | Open_files | 3 | | Open_streams | 0 | | Open_table_definitions | 10 | | Open_tables | 11 | | Opened_files | 91791 | | Opened_table_definitions | 1211 | | Opened_tables | 8158 | +--------------------------+-------+ 7 rows in set (0.00 sec)
这 里有Open_tables就是当前打开表的数目,通过flush tables命令可以关闭当前打开的表。而全局范围内查看的Opened_tables是个历史累计值。 这个值如果过大,并且如果没有经常的执行flush tables
mysql> show variables like 'max_tmp%'; +----------------+-------+ | Variable_name | Value | +----------------+-------+ | max_tmp_tables | 32 | +----------------+-------+ 1 row in set (0.00 sec)ここでの table_open_cache パラメーターは 64 です。これは、すべての MySQL スレッドが同時に合計 64 のテーブルを開くことができることを意味します。開いているテーブルの数に関するシステムの履歴記録を収集し、それらをこのパラメータと比較して、このパラメータのサイズを増やすかどうかを決定できます。 。現在開いているテーブルの数を確認する 1 つの方法は、前述の
status
コマンドを使用することです。さらに、このシステム変数の値を直接クエリすることもできます:
mysql> show global status like '%tmp%table%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 10478 | | Created_tmp_tables | 25860 | +-------------------------+-------+ 2 rows in set (0.00 sec)ここで Open_tables は現在開いているテーブル番号を指定すると、現在開いているテーブルは、flush tables コマンドによって閉じることができます。グローバルに表示される Opened_tables は、過去の累積値です。 この値が大きすぎる場合、および
flush tables
コマンドが頻繁に実行されない場合は、table_open_cache パラメータのサイズを増やすことを検討できます。 次に、max_tmp_tables パラメーターを見てみましょう: 🎜🎜🎜🎜mysql> show variables like 'open_files%';+------------------+-------+| Variable_name | Value |+------------------+-------+| open_files_limit | 1024 |+------------------+-------+1 row in set (0.00 sec) mysql> show variables like 'open_files%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)🎜 このパラメーターは、単一のクライアント接続で開くことができる一時テーブルの数を指定します。現在開かれている一時テーブルの情報を確認します: 🎜🎜🎜🎜
mysql> show global status like '%open%file%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_files | 3 | | Opened_files | 91799 | +---------------+-------+ 2 rows in set (0.01 sec)🎜 また、これら 2 つの値を比較して、一時テーブルの作成場所を決定することもできます。一般に、BLOB 列と TEXT 列、Group by および Distinct のデータ量を決定します。ステートメントが 512 バイトを超える場合、またはユニオン中に選択された特定のカラムのデータが 512 バイトを超える場合、一時テーブルがディスク上に直接作成されます。また、メモリ上の一時テーブルが大きくなった場合、自動的にディスクに転送される場合もあります。 MySQL によるディスク (tmp_table_size および max_heap_table_size パラメーターによって決定されます)。 🎜
继续原来的讨论,增加table_open_cache或 max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由 open_files_limit参数控制的。但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。如果OS限制MySQL不能修改这个值,那 么置为0。如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是没有报Too many open files错误的最大值,这样就能一劳永逸了。当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。
mysql> show variables like 'open_files%';+------------------+-------+| Variable_name | Value |+------------------+-------+| open_files_limit | 1024 |+------------------+-------+1 row in set (0.00 sec) mysql> show variables like 'open_files%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)
对应的,有两个状态变量记录了当前和历史的文件打开信息:
mysql> show global status like '%open%file%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_files | 3 | | Opened_files | 91799 | +---------------+-------+ 2 rows in set (0.01 sec)
MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:
mysql> show status like '%thread%'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | Delayed_insert_threads | 0 | | Slow_launch_threads | 0 | | Threads_cached | 0 | | Threads_connected | 14 | | Threads_created | 255570 | | Threads_running | 2 | +------------------------+--------+ 6 rows in set (0.00 sec)
比较这个threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。
如果查看每个thread的更详细的信息,可以使用processlist
命令:
mysql> show processlist; +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ | 8293 | repl | 192.168.0.33:47208 | NULL | Binlog Dump | 11574424 | Has sent all binlog to slave; waiting for binlog to be updated | NULL | | 140991 | mogile | 192.168.0.33:41714 | mogilefs | Sleep | 0 | | NULL | | 140992 | mogile | 192.168.0.33:41715 | mogilefs | Sleep | 3 | | NULL | | 140993 | mogile | 192.168.0.33:41722 | mogilefs | Sleep | 2 | | NULL | | 140994 | mogile | 192.168.0.33:41723 | mogilefs | Sleep | 1 | | NULL | | 140995 | mogile | 192.168.0.33:41724 | mogilefs | Sleep | 3 | | NULL | | 254914 | mogile | 192.168.0.33:43028 | mogilefs | Sleep | 11074 | | NULL | | 254915 | mogile | 192.168.0.33:43032 | mogilefs | Sleep | 11091 | | NULL | | 255144 | mogile | 192.168.0.33:47514 | mogilefs | Sleep | 11090 | | NULL | | 255157 | mogile | 192.168.0.33:47535 | mogilefs | Sleep | 11087 | | NULL | | 255162 | mogile | 192.168.0.33:47549 | mogilefs | Sleep | 11074 | | NULL | | 255260 | root | localhost | mysql | Query | 0 | NULL | show processlist | | 255352 | maopaodev | 192.168.0.78:55399 | maopaodb | Sleep | 3172 | | NULL | | 255353 | maopaodev | 192.168.0.78:55400 | NULL | Sleep | 8926 | | NULL | +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ 14 rows in set (0.00 sec)
执行这个命令需要有Process_priv权限,具体的权限分配信息可以查看mysql.user表。
对于影响系统运行的thread,可以狠一点,用kill connection
|query threadid
的命令杀死它。
相关推荐:
以上がMySQLサーバーのスレッド数を確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。