MySQLをチューニング,そしてスケールアップ/スケールアウトへ

第6回 MySQLチューニング(5) パラメタチューニングの基礎

この記事を読むのに必要な時間:およそ 5 分

第6回はMySQLのパラメタチューニング基礎として,MySQLのカテゴリ別のチューニングパラメタを解説します。

アーキテクチャ再確認

第1回で,

  1. 接続からSQL実行までの共通部分
  2. トランザクション管理やデータ永続化,インデックス管理などストレージエンジン固有部分

に大別されると説明しました。この共通部分もパラメタチューニングの際には2つに分けることができます。

  • 接続したクライアントからのSQL文を処理するサーバスレッド(接続スレッド)が利用するメモリなどのリソース
  • MySQLサーバ全体で利用されるメモリなどのリソース

図1 MySQLサーバのアーキテクチャ概要

図1 MySQLサーバのアーキテクチャ概要

設定可能なパラメタについてはリファレンスマニュアルの下記を参照して下さい。

このページでは,設定可能なシステム変数はSrvr列にYesの表示がされています。Dyn列がYesのシステム変数はサーバを再起動せずにSETコマンドで動的に変更なことを表しています。またそれぞれのパラメタがどのバージョンで利用かも併せて表示されており,各バージョンに示されたYesからデフォルト値や最小値/最大値などそれぞれのバージョンでの具体的な情報にリンクされています。

接続スレッド関連のパラメタ

MySQLではクライアントから新しい接続が行われると,新たにスレッドを生成してSQL文の処理を行います。SQL文処理のために利用されるメモリの領域はこのスレッド毎に確保されます。

図2 MySQLサーバのアーキテクチャ概要

図2 MySQLサーバのアーキテクチャ概要

最大接続数

同時に接続できるクライアントの数の最大値は,生成されるスレッド数の最大値にもなります。MySQLサーバの最大接続数はグローバル変数max_connectionsで設定します。

コマンドラインでの設定 --max_connections=#
システム変数名 変数名 max_connections
スコープ Global
動的変更 可能
設定値 整数型
デフォルト 151
最小値 1
最大値 100000

最大接続数は通常システムの要件から算出して行きます。システムとして想定される同時接続数を見積もり,そのうちデータベースまで到達するリクエストの比率,それぞれのデータベースでの処理時間を待ち行列理論に照らして考慮します。データベースに到達する同時リクエスト数が同じだとしても,処理時間が違う場合はデータベース内で同時に実行されている処理の件数も違ってくるため,同時接続数も違ってきます。注意すべき点は,システム開発の早い段階では見積もりの精度が高くないため,ある程度余裕を持たせた設計で始め,かつ段階的に見積もりの精度を高めていくことが求められることです。

接続が切断されるとMySQLサーバ内の接続スレッドも破棄されます。コネクションプーリング機能を使用していない環境では,接続による接続スレッドの生成と切断による切断スレッドの破棄が繰り返され,オーバーヘッドとして無視できなくなります。このような状況はSHOW GLOBAL STATUS文のConnectionsとThread_の値を監視することで確認できます。下記の例ではSHOW GLOBAL STATUS文の代わりにInformation_schemaのGLOBAL_STATUSテーブルを利用しています。

mysql> SELECT * FROM GLOBAL_STATUS
     >   WHERE VARIABLE_NAME = 'Connections'
     >      OR VARIABLE_NAME LIKE 'Threads%';
+-------------------+----------------+
| VARIABLE_NAME     | VARIABLE_VALUE |
+-------------------+----------------+
| CONNECTIONS       | 2910337        |
| THREADS_CACHED    | 0              |
| THREADS_CONNECTED | 122            |
| THREADS_CREATED   | 2910096        |
| THREADS_RUNNING   | 45             |
+-------------------+----------------+
5 rows in set (0.02 sec)

上記の例ではこれまでの接続回数CONNECTIONSの値と生成されたスレッド数THREADS_CREATEDが近い値となっており,接続スレッドの生成と破棄が繰り返されたことがわかります。このような環境ではスレッドを破棄せずにキャッシュして再利用するためにthread_cache_sizeの値を設定します。

コマンドラインでの設定 --thread_cache_size=#
システム変数名 変数名 thread_cache_size
スコープ Global
動的変更 可能
設定値 整数型
デフォルト -1(自動調整)
最小値 1
最大値 16384

スレッド毎にメモリを確保するパラメタは,接続数だけ個別に確保されるので同時接続数を大きすぎる値に設定してスワップ発生させてはいけません。さらに同時処理件数が大きくなると処理の競合などによってスループットが低下する傾向があります。同時接続数が大きくなることが見込まれている場合は,複数台のサーバに分割するか,スレッドのグループ化と内部的なキューイングの仕組みを持ったMySQL Enterprise Editionのスレッドプールプラグインの利用を検討してください。

著者プロフィール

梶山隆輔

MySQL Sales Consulting Senior Manager。

日本オラクル(株)において,MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて,オーストラリア,インド,台湾などに在籍するチームメンバーを束ね,アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。

コメント

コメントの記入