私の実稼働環境の1つでは、RedHatクラスターで2つのインスタンスが実行されており、1つの実稼働インスタンスがクラスターに関連付けられています。
125Gのメインメモリには、instance1によって占有された24G InnoDBバッファープールと、instance2によって占有された12Gがあり、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(1秒あたり8766.61) * SAN O_DSYNC:読み取り/書き込み要求:5179457(1438.52 /秒) * SAN fdatasync:読み取り/書き込み要求:9445774(2623.66 /秒) *ローカルディスクO_DIRECT:読み取り/書き込み要求:3258595(905.06 /秒) *ローカルディスクO_DSYNC:読み取り/書き込み要求:3494632(970.65 /秒) *ローカルディスクfdatasync:読み取り/書き込みリクエスト:4223757(1173.04 /秒。
ただし、_O_DIRECT
_はOSレベルのキャッシュを無効にします。この場合、ダブルキャッシュを無効にして、I/Oスループットを向上させることができます。
_O_DIRECT
_ではなく_O_DSYNC
_を使用するのは良いですか?これら2つのオプションは少し混乱します。データ、特に本番環境での読み取り/書き込みに影響を与えることなく、I/Oスループットが向上し、パフォーマンスが向上するオプションはどれですか。あなたの個人的な経験に基づいたより良い提案はありますか?
post でRolando Updateを見ることができました:
それでも、これらのパラメーターの両方で少し混乱があります。 _
O_DIRECT
_を使用してほとんどの製品構成テンプレートを確認できた場所で、_O_DSYNC
_を推奨する場所を確認したことはありません。
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 Plugins WHERE PLUGIN_NAME LIKE '%innodb%' AND PLUGIN_TYPE LIKE 'STORAGE ENGINE'\G ***************** ********** 1.行*************************** PLUGIN_NAME:InnoDB PLUGIN_VERSION:1.0 PLUGIN_STATUS:ACTIVE PLUGIN_TYPE:STORAGE ENGINE PLUGIN_TYPE_VERSION:50151.0 PLUGIN_LIBRARY:NULL PLUGIN_LIBRARY_VERSION 。] PLUGIN_AUTHOR:Innobase OY PLUGIN_DESCRIPTION:トランザクション、行レベルのロック、および外部キーをサポートします PLUGIN_LICENSE:GPL 1行のセット(0.00秒)
2009年1月21日、Peter Zaitsevは mysqlperformanceblog.com について次のように述べています。
行動の呼びかけとして– EXT3がLinuxで最も一般的なファイルシステムであるため、この点でEXT3を修正できるかどうか誰かに確認してもらいたいと思います。 MySQL側で何かできるかどうかを調査することも価値があります。fsyncを使用する代わりに
O_DSYNC
が役立つ場合は、sync_binlog=1
フラグでbinlogを開いている可能性があります。またはbinlogの事前割り当てが良い解決策になるかもしれません。
今のところ、この問題に触れた人はいないことを知っています。デフォルトのO_DSYNC
は魅力的な見込みではありませんが、実際には検証されていない高速書き込みに対応します。 O_DIRECT
の周りに大きな誇大宣伝があるのはそのためです。
InnoDBプラグインがインストールされていないことがわかります。 InnoDBプラグインを使用すると、いくつかの変数が存在するはずです。
InnoDBは、次の2つの方法のいずれかでアップグレードする必要があります。
これが完了したら、InnoDBを拡張して
これを変更できる設定に関する過去の投稿は次のとおりです。
Sep 12, 2011
: MySQLで複数のコアを使用することは可能ですか?Sep 20, 2011
: マルチコアとMySQLパフォーマンスApr 26, 2012
: CPUパフォーマンスはデータベースサーバーに関連していますか?Mar 16, 2012
: Debianでの単一のMySQLクエリに複数のコアを使用_O_DIRECT
_はダブルバッファリングを防ぐため、パフォーマンスには優れているといつも感じていました。また、バッテリバックアップ式ライトキャッシュを備えたハードウェアRAIDがある場合。もちろん、READとWRITEのどちらが重いかは、ワークロードにも依存します。
また、専門家への質問:_O_DIRECT
_のfsync()
への追加の呼び出しは、全体的なパフォーマンスの顕著な低下を引き起こしますか、それとも無視できますか?ベンチマークがこれを示しているのをまだ見ていません。
また、Perconaが_innodb_flush_method=ALL_O_DIRECT
_を設定する機能を有効にしたことにも注意してください。これにより、InnoDBデータファイルだけでなく、InnoDBトランザクションログにも直接I/Oが提供されます。