MySQL innodb_flush_method変数に関する説明


21

まず、私はハードディスクの内部動作について非常に無知であると認めることから始めましょう。そのため、変数innodb_flush_methodのマニュアルを読み終えると、混乱しました。O_DSYNCとO_DIRECTの違いと、それがデータベースサーバーのパフォーマンスの問題であるかどうかを知る方法について、素人の言葉で説明してもらえますか。

私のセットアップに関するいくつかの統計:MySQL 5.1.49-64bitを実行しているMac OSX 10.6(アーキテクチャが古いため、32ビットカーネル)(メモリを使用できることを望みます)。8GB RAM、最大6GBのinnodbデータ/インデックス。


2
Mac OS Xが適切なダイレクトIOオプションをサポートしているかどうかはわかりません-サポートしているとは思いませんでした。あなたは、今日私がそのマニュアルページで混乱するのを見た二人目です。ここに未解決のバグがあります:bugs.mysql.com/bug.php?id
モーガン

回答:


16

ここではどのように説明されfdatasync()どのように対作品fsync()の作品は

fdatasync()(システムコールが戻る前に)ファイルのすべてのデータバッファをディスクにフラッシュします。似てfsync()いますが、アクセス時間などのメタデータを更新する必要はありません。データベースまたはログファイルにアクセスするアプリケーションは、多くの場合、小さなデータフラグメント(たとえば、ログファイルの1行)を書き込み、fsync()すぐに呼び出して、書き込まれたデータがハードディスクに物理的に保存されるようにします。残念ながら、fsync()常に2つの書き込み操作を開始します

  • 新しく書き込まれたデータに対する1つの書き込み操作
  • iノードに保存された変更時間を更新するための1つの書き込み操作

変更時間がトランザクションの概念の一部ではない場合、fdatasync()不必要なiノードディスクの書き込み操作を回避するために使用できます。

英語では、O_DSYNCより高速であるO_DIRECTため、O_DIRECT呼び出しfsync()倍(ログとデータのための1のための1)とfsync()2つの書き込み操作を介した検証用データの書き込み。O_DSYNC呼び出しfdatsync()とを使用しますfsync()fdatasync()非同期を実行するfsync()(データを検証しない)と考えることができます。

数値を見ると、4回の書き込み操作O_DSYNCが行われ、そのうち2回が検証され、fsync()4回の書き込み操作が行われ、すべてが後で検証されます。

結論

  • O_DSYNC
    • より速い O_DIRECT
    • レイテンシーまたは完全なクラッシュにより、データに一貫性がある場合とない場合があります
  • O_DIRECT
    • より安定した
    • データ整合性
    • 自然に遅い

この回答がお役に立てば幸いです。そして、私があなたのために事態を悪化させなかったことを願っています。


2
指摘する価値:O_DIRECTは、ログではなく、テーブルスペースファイルでのみ使用されます。また、O_DIRECTが有用かどうかは、ハードウェアに依存します。著者の質問へのコメントとして、オープンドキュメントのバグにリンクしました。
モーガントッカー

それを明確にしてくれてありがとう、モーガン。これを修正します。
-RolandoMySQLDBA

O_DSYNCは同期書き込みですが、非同期+ fsyncよりも高速であると結論付けるにはどうすればよいですか?
noonex

@noonex fdatasync()は、メタデータではなくデータに対して同期的です。informit.com/articles/article.aspx?p=23618&seqNum=5によると、This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.3.5年前に投稿を書いた時点では、特に古いバージョンのLinuxではそうでした。
RolandoMySQLDBA 14

@noonex en.wikipedia.org/wiki/Sync_(Unix)によると、The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.(このWikiは2014年7月28日に最後に更新されました)。
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.