資料集約(innodb_flush_methodとFile I/O)

4689 ワード

innodb_flush_methodとFile I/O
陶方は『innodb_flush_methodがもたらす性能影響』でfdatasync,O_を実験的に比較した.DSYNCとO_DIRECTの性能の違い.Linux/Unix「ファイルI/O」(unbuffered I/O)の観点からinnodb_flush_methodがMySQLのI/Oにどのように影響するかを説明しようとします.【付録1】
innodb_flush_log_at_trx_commitパラメータは、ログファイルがwrite、flushになるタイミングを決定します.innodb_flush_methodは、ログおよびデータファイルのwrite、flushを決定します.Linuxでinnodb_flush_methodは次の値をとることができます:fdatasync,O_DSYNC, O_DIRECT、この3つの値はそれぞれどのようにファイルの書き込みに影響しますか?まずLinuxのファイルI/Oがどのように動作しているかを知る必要があります.
まずLinux/UnixファイルI/Oの典型的な例を見てみましょう:(Linux 2.6.24テスト、gccコンパイル)
/**
    A test about syscall of File I/O
    Author:supu@TaobaoDBA
    [email protected] http://orczhou.com http://www.taobaodba.com
*/
#include   "stdlib.h"           /* for exit */
#include   "unistd.h"           /* for write fdatasync*/
#include    "fcntl.h"           /* for open  */

int main(void){
    int fd;

    if((fd=open("/home/zzx/test.file",O_WRONLY|O_APPEND|O_DSYNC))<0){
        exit(1);
        }

        char buff[]="abcdef";
        if(write(fd,buff,6)!= 6){
                exit(2);
        }
        if(fdatasync(fd)==-1){
                exit(3);
        }

        exit(0);
}

プログラムは、一般的なファイルI/O操作の3つのプロセスopen、write、fdatasyncを記述し、それぞれファイルを開く、ファイルを書く、flush操作(ファイルキャッシュをディスクにブラシする)である.
一、Open段階
open("test.file",O_WRONLY|O_APPDENT|O_SYNC))

システムがOpenを呼び出すと、プロセスのファイル記述子fd【付録2】が呼び出されます.ここではO_を使いましたWRONLY|O_APPDENT|O_SYNCオープンファイル:O_WRONLYは、カーネルにファイルにデータを書き込む必要があることを「書く」方法で開くことを示しています.O_APPDENTはカーネルに「追加」でファイルを書くように伝えた.O_DSYNCは、ファイルにデータを書き込む場合、データがディスクに書き込まれた場合にのみ書き込み操作が完了するとカーネルに伝えた(writeは成功に戻った).とO_DSYNC同類のファイルフラグ、そしてO_SYNC,O_RSYNC,O_DIRECT. O_SYNC比O_DSYNCは、ディスクにデータが書き込まれているだけでなく、対応するデータファイルのプロパティ(ファイル長など)もwrite操作に成功するために更新が完了する必要があります.可視O_SYNC比O_DSYNCはもっと操作しなければなりません.O_RSYNCは、ファイルの読み込み時に、そのファイルのOS cacheがすべてディスクにflushされている必要があることを示す【付録3】.O_を使うとDIRECTでファイルを開くと、読み取り/書き込み操作はOS cacheをスキップし、直接device(disk)で読み取り/書き込みします.OS cacheがなくなったのでO_DIRECTは、ファイルの順番の読み書きの効率を低下させる.二、Write段階
write(fd,buf,6)

Openを使用してファイルを開いてファイル記述子を取得すると、write関数を呼び出してデータを書き込むことができます.writeは前のopenパラメータによって表現が異なります.
三、Flush段階
fdatasync(fd) == -1

write操作後、fdatasyncを呼び出してファイルデータflushがdiskに到達したことを確認しました.fdatasyncが正常に戻った後、データはディスクに書き込まれていると考えられます.このようなflushの関数にはfsync,syncもある.
Fsyncとfdatasyncの違いはO_に等しいSYNCとO_DSYNCの違い.Sync関数は、OS cacheにファイルがあるデータを書き込みキューに入れていることを示し、本当にディスクが書かれているかどうかを確認していないため、syncは頼りにならない.ファイルが開くプロセスを無視すると、通常、「ファイルを書く」には2つのフェーズがあります.1つはwriteを呼び出すことです.私たちは書き込みデータフェーズ(openのパラメータの影響を受けています)と呼ばれ、fsync(またはfdatasync)を呼び出すことです.私たちはflushフェーズと呼ばれます.
MySQLに戻り、パラメータInnodb_flush_method(Linux)は、Fdatasync、O_に設定できます.DSYNC、O_DIRECT.この3つのパラメータが、ログとデータファイルに対するプログラムMySQLの操作にどのように影響するかを見てみましょう.
Open log    Flush log   Open datafile   Flush data
Fdatasync       fsync()     fsync()
O_DSYNC O_SYNC          fsync()
O_DIRECT        fsync() O_DIRECT    Fsync()

fdatasyncは、MySQLでfsyncがflushデータに呼び出されるため、安全とされています.O_の使用DSYNCにはリスクがあり、OSによってはこのパラメータO_を無視する場合があります.SYNC.
O_が見えますDIRECTとfdatasyncは似ていますが、O_を使用します.DIRECTでデータファイルを開きます.大量のランダム書き込み操作であればO_DIRECTは効率を上げます.ただし、シーケンス書き込みと読み取りの効率は低下します.だからO_を使うDIRECTは注意が必要です.
参考記事:
Unix環境高度プログラミング(第2版)http://rdc.taobao.com/blog/dba/html/296_innodb_flush_method_performance.html http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html http://www.ukuug.org/events/linux2001/papers/html/AArcangeli-o_direct.html http://xiaomeng.yo2.cn/articles/buffered-io-and-non-buffered-io.html http://articles.directorym.net/Operating_Systems_System_Calls_and_IO-a894576.html http://www.ibm.com/developerworks/cn/linux/l-cn-read/
http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
システムコール:http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/index.html
【付録1】「システム呼び出し」とは何かを理解する必要があります.参考:
http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/index.html
「システム呼び出し」はカーネルの上にカプセル化されています.カーネルによって直接インタフェースが提供され、「システム呼び出し」はカーネル実行(カーネル状態)に陥る必要があります.fdatasyncはシステム呼び出しであり、OS CacheのデータFlushをディスクファイルに直ちに通知することができる.
【付録2】カーネルは、プロセスが開いているファイルにファイル記述子を割り当て、プロセスにファイル記述子を返します.カーネルのファイルテーブルにファイルの状態、ファイルの現在のオフセット、およびIノード(vノード)の位置をマークするファイル項目を新規作成し、カーネルはファイルのIノード(ここではファイルの操作の関数ポインタ、例えば読み取り操作、書き込み操作)を開きます.
【付録3】O_RSYNC私の理解では、同じファイル記述子に対してデータの安全を保証することができます.同じファイル記述子にはdupとfcntl関数dupのファイル記述子、すなわち同じファイルテーブル項目が共通している.O_RSYNCは私たちが今日注目しているものではありません.しばらく無視します.
未解決の問題:
O_DIRECTはどのOS(またはFS)で正常に動作しますか?
O_SYNCはどこでOSが正常に動作しないと書きますか?
カーネルのread、writeはFSレベルですか、カーネル(kernel)レベルですか.
記事innodb_flush_methodによる性能影響中O_DSYNCとfdatasyncは効率が悪いのはなぜですか?