私の実稼働環境の1つでは、RedHatクラスター上で2つのインスタンスが実行されており、1つの実稼働インスタンスがクラスターに関連付けられています。
インスタンス1が占有する24G InnoDBバッファープールと、インスタンス2が占有する12Gの125Gメインメモリがあり、RedHatクラスターに関連付けられていません。データとトランザクションログは両方とも、ext3ファイルシステムのあるLVMディスクパーティションにあります。
パフォーマンスの向上とI / Oスループットの向上のために、に変更innodb_flush_method
することにしましたO_DIRECT
。
MySQLドキュメントを参照して:
InnoDBのデータファイルとログファイルがSAN上にある場合、に設定
innodb_flush_method
するとO_DIRECT
、単純なSELECT
ステートメントのパフォーマンスが3倍低下することがわかっています。
ハイパフォーマンスMySQL Ver 2および3を参照すると、InnoDB開発者がを使用してバグを発見したと述べていinnodb_flush_method=O_DSYNC
ます。O_SYNC
とO_DSYNC
に類似しているfsync()
とfdatasync()
:O_SYNC
一方、同期データとメタデータの両方、O_DSYNC
のみ同期データ。
それがアドバイスなしで多くの説明のように思えた場合、ここにアドバイスがあります:
Unixライクなオペレーティングシステムを使用しており、RAIDコントローラーにバッテリバックアップ式の書き込みキャッシュがある場合は、を使用することをお勧めします
O_DIRECT
。そうでない場合は、O_DIRECT
アプリケーションに応じて、デフォルトまたはおそらく最適な選択肢のいずれかです。
グーグルで、私はこのベンチマークレポートを得ました:オンO_DSYNC
対O_DIRECT
ベンチマークレポート: =================== 1B行の複雑なトランザクションテスト、64スレッド * SAN O_DIRECT:読み取り/書き込み要求:31560140(8766.61毎秒) * SAN O_DSYNC:読み取り/書き込み要求:5179457(1438.52毎秒) * SAN fdatasync:読み取り/書き込み要求:9445774(毎秒2623.66) *ローカルディスクO_DIRECT:読み取り/書き込み要求:3258595(毎秒905.06) *ローカルディスクO_DSYNC:読み取り/書き込み要求:3494632(1秒あたり970.65) *ローカルディスクfdatasync:読み取り/書き込み要求:4223757(1秒あたり1173.04。
ただし、O_DIRECT
OSレベルのキャッシュを無効にします。ダブルキャッシュを無効にすると、I / Oスループットが向上します。
O_DIRECT
よりも一緒に行くのは良いO_DSYNC
ですか?これら2つのオプションは少しわかりにくいです。特に本番環境でデータ、読み取り/書き込みに影響を与えることなく、I / Oスループットの向上とパフォーマンスの向上を示すオプションはどれですか?あなたの個人的な経験に基づいたより良い提案はありますか?
投稿で Rolando Updateを見ることができました:
それでも、これらのパラメーターの両方にわずかな混乱があります。私が使用して生産の設定テンプレートのほとんどを見ることができた場合は
O_DIRECT
推薦ところ、私は任意のを見ていませんO_DSYNC
。
システム
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Serverリリース5.5
- バッテリーライトバックキャッシュ512MBのRAIDコントローラーを搭載したDELL DRAC
- バッテリーバックアップユニット(BBU)を搭載したDell PERCコントローラーH700。
追加情報
mysql> 'innodb_thread_concurrency'のような変数を表示します; + --------------------------- + ------- + | 変数名| 価値| + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + セット内の1行(0.00秒) mysql> 'innodb_read_io_threads'のような変数を表示します; 空のセット(0.00秒) mysql> 'innodb_write_io_threads'のような変数を表示します; 空のセット(0.00秒)
デフォルトのプラグインを使用しているため、InnoDBステータスから情報を投稿しました。
mysql> SELECT * FROMプラグインWHERE PLUGIN_NAME LIKE '%innodb%' AND PLUGIN_TYPE LIKE 'STORAGE ENGINE' \ G *************************** 1.行******************** ******* PLUGIN_NAME:InnoDB PLUGIN_VERSION:1.0 PLUGIN_STATUS:アクティブ PLUGIN_TYPE:ストレージエンジン PLUGIN_TYPE_VERSION:50151.0 PLUGIN_LIBRARY:NULL PLUGIN_LIBRARY_VERSION:NULL PLUGIN_AUTHOR:Innobase OY PLUGIN_DESCRIPTION:トランザクション、行レベルのロック、および外部キーをサポート PLUGIN_LICENSE:GPL セット内の1行(0.00秒)