【Linux / Go】遅延書き込みと fsync(2)

Redis のデータ永続化には スナップショットの RDB (Redis DataBase) と テキストログの AOF (Append-Only File) があります。AOF では fsync(2) によりメモリ上のデータを毎秒などの短い間隔 (always/everysec/no) でディスクに書き出すことで障害時のデータの損失をなるべく最小限にする方法が取られています。
今回は 遅延書き込み (Lazy Write Back) を行う write(2) と明示的にページキャッシュをディスクに同期する fsync(2) の動作を簡単に確認しました。

環境は Ubuntu 16.04, Go 1.8.3 です。

write(2) と fsync(2)

write(2) を見てみると write が成功してもデータがディスクにコミットされたことは保証されず, 確実な方法はすべてのデータを書き終わった後に fsync(2) を呼ぶことと書いている。

$ man 2 write
...
NOTES
       A  successful return from write() does not make any guarantee that data has been committed to disk.  In fact, on
       some buggy implementations, it does not even guarantee that space has successfully been reserved for  the  data.
       The only way to be sure is to call fsync(2) after you are done writing all your data.
...

write(2) は 書き込み要求を受けたあとにすぐにはディスクなどブロック型デバイスに書き込まず, 定期的に pdflush がページ (仮想メモリ: Virtual Memory) を検索しディスクに書き出す 遅延書き込み (Lazy Write Back) を行っている。

fsync(2) は fd が参照するファイルをディスクに転送し, 同時にメタデータをフラッシュする。 一方, Linux ではその間に同じファイルに対して書き込みを行っている他のすべてのスレッドもブロックしてしまう。

$ man 2 fsync
...
DESCRIPTION
       fsync()  transfers  ("flushes") all modified in-core data of (i.e., modified buffer
       cache pages for) the file referred to by the file descriptor fd to the disk  device
       (or other permanent storage device) where that file resides.  The call blocks until
       the device reports that the transfer  has  completed.   It  also  flushes  metadata
       information associated with the file (see stat(2)).

       Calling  fsync()  does  not necessarily ensure that the entry in the directory con-
       taining the file has also reached disk.  For that an explicit  fsync()  on  a  file
       descriptor for the directory is also needed.
...

ページキャッシュに関するカーネルパラメータ

ページキャッシュに関する主なカーネルパラメータは以下。

vm.dirty_background_ratio dirtyページの割合が設定値 (%) に達するとバックグラウンドプロセスで pdflush が呼ばれ write back スレッドが開始する。デフォルト値は10%.
vm.dirty_background_bytes vm.dirty_background_ratio と異なり具体的なバイト値を指定する. デフォルト値は 0.
vm.dirty_ratio dirtyページの割合が設定値 (%) に達すると優先度の高いフォアグラウンドプロセスとして実行される. デフォルト値は20%.
vm.dirty_bytes vm.dirty_ratio と異なり具体的なバイト値を指定する. デフォルト値は 0.
vm.dirty_writeback_centisecs pdflush の定期実行間隔. この間隔で定期的に write back が実行される. 単位は10ms. 0は無効化.デフォルト値は500.
vm.dirty_expire_centisecs メモリ上のdirtyページの保持期間。この期間を超えると次回の pdflush で write back スレッドが開始する.単位は10ms. デフォルト値は3000.

/etc/sysctl.conf に書くか /sbin/sysctl -w variable=value で設定する。設定の反映は /sbin/sysctl -p で行う。

write(2) と fsync(2) の動作確認

以下の 3つ で write(2) と fsync(2) の動作確認を行う。

  • write(2): デフォルト設定
  • write(2): なるべく pdflush を開始しない設定
  • write(2) + fsync(2)

まずは write(2) から。 Go では syscall パッケージを使いシステムコールを発行できる。以下の write(2) を繰り返すプログラムを1分間動かす。(もちろん Go である必要はなく fio コマンド等を使う方法もある)

package main

import (
        "fmt"
        "os"
        "syscall"
)

func main() {
        fd, err := syscall.Open("/tmp/write-test.txt", syscall.O_CREAT|syscall.O_RDWR|syscall.O_APPEND, 0644)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }

        for {
                _, err := syscall.Write(fd, []byte("abc"))
                if err != nil {
                        fmt.Println(err)
                        os.Exit(1)
                }
        }
}

パラメータはデフォルト値。

$ sudo sysctl -a | egrep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200

dstat コマンドで確認。または vmstat 1 の bo (Blocks sent to a block device (blocks/s)) でも確認できる。

$ dstat -tv
----system---- ---procs--- ------memory-usage----- ---paging-- -dsk/total- ---system-- ----total-cpu-usage----
     time     |run blk new| used  buff  cach  free|  in   out | read  writ| int   csw |usr sys idl wai hiq siq
27-08 02:19:49|  0   0 0.1| 142M 15.8M 73.2M  761M| 487k  457k|3236k  529k| 520   747 |  4   2  93   1   0   0
27-08 02:19:50|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 195   242 |  0   1  98   0   0   0
27-08 02:19:51|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 179   237 |  0   0 100   0   0   0
27-08 02:19:52|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 172   227 |  0   0 100   0   0   0
27-08 02:19:53|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 164   215 |  0   1  99   0   0   0
27-08 02:19:54|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 164   201 |  0   1 100   0   0   0
27-08 02:19:55|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 163   199 |  1   0  99   0   0   0
27-08 02:19:56|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 186   237 |  1   0  99   0   0   0
27-08 02:19:57|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 165   216 |  0   0  99   0   0   1
27-08 02:19:58|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 165   207 |  0   1  99   0   0   0
27-08 02:19:59|  0   0   0| 142M 15.8M 73.2M  761M|   0     0 |   0     0 | 154   201 |  0   0 100   0   0   0
27-08 02:20:00|1.0   0 6.0| 142M 15.8M 73.3M  761M|   0     0 |   0     0 | 365   489 |  1   3  96   0   0   0
27-08 02:20:01|1.0   0 3.0| 143M 15.8M 75.7M  758M|   0     0 |   0     0 | 479   459 |  6  45  49   0   0   0
27-08 02:20:02|1.0   0   0| 143M 15.8M 77.8M  756M|   0     0 |   0     0 | 523   450 |  7  43  50   0   0   0
27-08 02:20:03|1.0   0   0| 143M 15.8M 80.3M  753M|   0     0 |   0     0 | 541   484 |  7  44  49   0   0   0
27-08 02:20:04|1.0   0 3.0| 136M 15.8M 82.7M  758M|   0     0 |  16k    0 | 648   817 |  7  44  48   0   0   0
27-08 02:20:05|1.0   0   0| 136M 15.8M 85.1M  755M|   0     0 |   0    76k| 624   671 |  8  43  49   0   0   1
27-08 02:20:06|1.0   0   0| 136M 15.8M 87.5M  753M|   0     0 |   0     0 | 594   628 |  7  44  49   0   0   0
27-08 02:20:07|1.0   0   0| 136M 15.8M 89.8M  751M|   0     0 |   0     0 | 680   664 |  7  44  49   0   0   0
27-08 02:20:08|1.0   0   0| 136M 15.8M 92.3M  748M|   0     0 |   0     0 | 660   666 |  7  44  49   0   0   0
27-08 02:20:09|1.0   0   0| 135M 15.8M 94.6M  746M|   0     0 |   0     0 | 577   529 |  6  44  49   0   0   1
27-08 02:20:10|1.0   0   0| 136M 15.9M 97.1M  744M|   0     0 |   0    12k| 570   460 |  4  46  50   0   0   0
27-08 02:20:11|1.0   0   0| 135M 15.9M 99.6M  741M|   0     0 |   0     0 | 594   451 |  8  43  50   0   0   0
27-08 02:20:12|1.0   0   0| 135M 15.9M  102M  739M|   0     0 |   0     0 | 579   477 |  6  44  49   0   0   0
27-08 02:20:13|1.0   0   0| 136M 15.9M  104M  737M|   0     0 |   0     0 | 580   519 |  8  43  50   0   0   0
27-08 02:20:14|1.0   0   0| 135M 15.9M  106M  734M|   0     0 |   0     0 | 578   542 |  6  45  49   0   0   0
27-08 02:20:15|2.0   0   0| 135M 15.9M  109M  732M|   0     0 |   0    12k| 622   644 |  7  44  49   0   0   0
27-08 02:20:16|2.0   0   0| 136M 15.9M  111M  730M|   0     0 |   0     0 | 590   605 |  7  44  49   0   0   0
27-08 02:20:17|2.0   0   0| 136M 15.9M  114M  727M|   0     0 |   0     0 | 596   619 |  5  47  49   0   0   0
27-08 02:20:18|2.0   0   0| 136M 15.9M  116M  725M|   0     0 |   0     0 | 583   589 |  6  45  49   0   0   0
27-08 02:20:19|2.0   0   0| 135M 15.9M  119M  722M|   0     0 |   0     0 | 668   690 |  6  45  49   0   0   0
27-08 02:20:20|2.0   0   0| 136M 15.9M  121M  720M|   0     0 |   0    12k| 660   718 |  7  44  49   0   0   0
27-08 02:20:21|2.0   0   0| 136M 15.9M  124M  717M|   0     0 |   0     0 | 784   971 |  8  44  48   0   0   0
27-08 02:20:22|2.0   0   0| 135M 15.9M  126M  715M|   0     0 |   0     0 | 598   620 |  6  45  49   0   0   0
27-08 02:20:23|2.0   0   0| 135M 15.9M  129M  712M|   0     0 |   0     0 | 626   682 |  5  45  49   0   0   0
27-08 02:20:24|2.0   0   0| 135M 15.9M  131M  710M|   0     0 |   0     0 | 585   586 |  8  44  49   0   0   0
27-08 02:20:25|2.0   0   0| 136M 15.9M  134M  707M|   0     0 |   0    12k| 621   656 |  7  44  49   0   0   1
27-08 02:20:26|1.0   0   0| 135M 15.9M  136M  705M|   0     0 |   0     0 | 621   672 |  7  44  49   0   0   1
27-08 02:20:27|1.0   0   0| 136M 15.9M  139M  702M|   0     0 |   0     0 | 602   620 |  8  43  48   0   0   0
27-08 02:20:28|2.0   0   0| 135M 15.9M  141M  700M|   0     0 |   0     0 | 626   665 |  6  46  49   0   0   0
27-08 02:20:29|2.0   0   0| 135M 15.9M  144M  697M|   0     0 |   0     0 | 635   689 |  7  44  49   0   0   0
27-08 02:20:30|1.0   0   0| 135M 15.9M  146M  695M|   0     0 |   0    12k| 591   614 |  8  43  49   0   0   0
27-08 02:20:31|1.0   0   0| 136M 15.9M  149M  692M|   0     0 |   0     0 | 598   619 |  7  44  49   0   0   0
27-08 02:20:32|2.0   0   0| 135M 15.9M  152M  689M|   0     0 |   0     0 | 618   663 |  7  44  49   0   0   0
27-08 02:20:33|1.0   0   0| 136M 15.9M  154M  687M|   0     0 |   0    79M| 480   445 |  6  46  48   1   0   0
27-08 02:20:34|1.0   0   0| 136M 15.9M  157M  684M|   0     0 |   0     0 | 518   453 |  7  43  50   0   0   0
27-08 02:20:35|1.0   0   0| 136M 15.9M  159M  682M|   0     0 |   0    40k| 538   481 |  7  44  49   0   0   1
27-08 02:20:36|1.0   0   0| 135M 15.9M  162M  679M|   0     0 |   0     0 | 520   467 |  6  44  50   0   0   0
27-08 02:20:37|1.0   0   0| 136M 15.9M  164M  676M|   0     0 |   0     0 | 525   470 |  7  44  49   0   0   0
27-08 02:20:38|4.0   0   0| 136M 15.9M  167M  674M|   0     0 |   0    48k| 544   545 |  6  45  49   0   0   0
27-08 02:20:39|1.0   0   0| 136M 15.9M  170M  671M|   0     0 |   0     0 | 478   453 |  5  45  50   0   0   1
27-08 02:20:40|2.0   0   0| 136M 15.9M  172M  669M|   0     0 |   0     0 | 494   469 |  6  45  50   0   0   0
27-08 02:20:41|1.0   0   0| 136M 15.9M  174M  666M|   0     0 |   0     0 | 567   504 |  8  42  50   0   0   0
27-08 02:20:42|1.0   0   0| 136M 15.9M  177M  664M|   0     0 |   0     0 | 550   490 |  7  44  50   0   0   0
27-08 02:20:43|2.0   0   0| 136M 15.9M  179M  661M|   0     0 |   0    20k| 550   466 |  7  44  49   0   0   0
27-08 02:20:44|1.0   0   0| 136M 15.9M  182M  658M|   0     0 |   0     0 | 606   491 |  6  45  50   0   0   0
27-08 02:20:45|1.0   0   0| 136M 15.9M  184M  656M|   0     0 |   0     0 | 605   511 |  7  44  50   0   0   0
27-08 02:20:46|2.0   0   0| 136M 15.9M  187M  653M|   0     0 |   0     0 | 651   628 |  5  46  49   0   0   0
27-08 02:20:47|2.0   0   0| 136M 15.9M  189M  651M|   0     0 |   0     0 | 703   633 |  6  45  49   0   0   1
27-08 02:20:48|3.0   0   0| 136M 15.9M  192M  648M|   0     0 |   0    12k| 661   649 |  7  44  49   0   0   0
27-08 02:20:49|3.0   0   0| 136M 15.9M  194M  646M|   0     0 |   0     0 | 655   633 |  8  42  49   0   0   1
27-08 02:20:50|3.0   0   0| 136M 15.9M  196M  643M|   0     0 |   0     0 | 622   647 |  6  45  49   0   0   0
27-08 02:20:51|1.0   0   0| 136M 15.9M  199M  641M|   0     0 |   0     0 | 602   543 |  6  44  50   0   0   0
27-08 02:20:52|1.0   0   0| 137M 15.9M  201M  638M|   0     0 |   0     0 | 569   537 |  7  44  49   0   0   0
27-08 02:20:53|1.0   0   0| 137M 15.9M  204M  636M|   0     0 |   0    12k| 630   665 |  7  44  49   0   0   0
27-08 02:20:54|1.0   0   0| 137M 15.9M  206M  633M|   0     0 |   0     0 | 622   670 |  7  44  49   0   0   0
27-08 02:20:55|2.0   0   0| 137M 15.9M  209M  631M|   0     0 |   0     0 | 624   661 |  6  45  49   0   0   0
27-08 02:20:56|1.0   0   0| 137M 15.9M  212M  628M|   0     0 |   0     0 | 649   704 |  6  44  49   0   0   0
27-08 02:20:57|2.0   0   0| 137M 15.9M  214M  625M|   0     0 |   0     0 | 588   611 |  9  42  49   0   0   0
27-08 02:20:58|1.0   0   0| 137M 15.9M  217M  623M|   0     0 |   0    12k| 600   630 |  8  43  49   0   0   0
27-08 02:20:59|2.0   0   0| 137M 15.9M  219M  620M|   0     0 |   0     0 | 603   627 |  8  42  49   0   0   0
27-08 02:21:00|2.0   0 1.0| 137M 15.9M  222M  617M|   0     0 |   0     0 | 674   744 |  6  45  49   0   0   0
27-08 02:21:01|  0   0   0| 137M 15.9M  223M  616M|   0     0 |   0     0 | 393   435 |  3  19  78   0   0   0
27-08 02:21:02|  0   0   0| 137M 15.9M  223M  617M|   0     0 |   0     0 | 183   224 |  0   0 100   0   0   0
27-08 02:21:03|  0   0   0| 137M 15.9M  223M  616M|   0     0 |4096B   71M| 199   234 |  0   2  98   0   0   0
27-08 02:21:04|  0   0   0| 137M 15.9M  223M  616M|   0     0 |   0     0 | 182   227 |  0   0 100   0   0   0
27-08 02:21:05|  0   0   0| 137M 15.9M  223M  616M|   0     0 |   0     0 | 191   222 |  0   0 100   0   0   0
27-08 02:21:06|  0   0   0| 137M 15.9M  223M  616M|   0     0 |   0     0 | 170   209 |  0   1  99   0   0   0
27-08 02:21:07|  0   0   0| 137M 15.9M  223M  616M|   0     0 |   0     0 | 182   214 |  1   1  99   0   0   0
27-08 02:21:08|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0    60k| 213   255 |  0   0 100   0   0   0
27-08 02:21:09|  0   0 1.0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 200   232 |  1   1  99   0   0   0
27-08 02:21:10|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 131   208 |  0   1  99   0   0   1
27-08 02:21:11|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 175   334 |  1   0  99   0   0   0
27-08 02:21:12|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 152   242 |  0   0 100   0   0   0
27-08 02:21:13|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 130   210 |  1   1  99   0   0   0
27-08 02:21:14|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 140   222 |  0   0 100   0   0   0
27-08 02:21:15|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 129   201 |  1   1  99   0   0   0
27-08 02:21:16|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 135   200 |  0   1  99   0   0   0
27-08 02:21:17|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 122   182 |  1   1  99   0   0   0
27-08 02:21:18|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 127   186 |  0   0 100   0   0   0
27-08 02:21:19|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 188   289 |  1   0  99   0   0   0
27-08 02:21:20|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 228   254 |  0   1  99   0   0   0
27-08 02:21:21|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 294   421 |  0   2  98   0   0   0
27-08 02:21:22|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 173   181 |  0   0  99   0   0   0
27-08 02:21:23|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 175   182 |  0   0 100   0   0   0
27-08 02:21:24|  0   0 1.0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 245   260 |  0   1  99   0   0   0
27-08 02:21:25|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 243   226 |  1   1  99   0   0   0
27-08 02:21:26|  0   0   0| 137M 16.0M  223M  616M|   0     0 |   0     0 | 191   216 |  0   1  99   0   0   1

30秒毎に pdflush が起動しディスクに書き込み (79M + 71M) を行っている。

続いて, write(2) で以下のようになるべく pdflush を開始しない設定。

$ sudo sysctl -a | egrep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 90
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 0
vm.dirty_ratio = 90
vm.dirty_writeback_centisecs = 0
vm.dirtytime_expire_seconds = 43200

dstat で確認。

$ dstat -tv
----system---- ---procs--- ------memory-usage----- ---paging-- -dsk/total- ---system-- ----total-cpu-usage----
     time     |run blk new| used  buff  cach  free|  in   out | read  writ| int   csw |usr sys idl wai hiq siq
27-08 02:24:49|  0   0 0.1| 136M 16.1M 73.4M  767M| 487k  457k|3235k  529k| 520   747 |  4   2  93   1   0   0
27-08 02:24:50|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 173   244 |  0   1 100   0   0   0
27-08 02:24:51|1.0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 172   240 |  0   0 100   0   0   0
27-08 02:24:52|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 162   220 |  0   1  99   0   0   0
27-08 02:24:53|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 160   232 |  1   1  99   0   0   0
27-08 02:24:54|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 177   244 |  0   0 100   0   0   0
27-08 02:24:55|  0   0 2.0| 136M 16.1M 73.4M  767M|  16k    0 |  16k    0 | 212   350 |  1   1  98   0   0   0
27-08 02:24:56|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 180   251 |  0   1  99   0   0   0
27-08 02:24:57|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 184   211 |  0   0 100   0   0   0
27-08 02:24:58|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 151   199 |  0   0 100   0   0   0
27-08 02:24:59|  0   0   0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 199   197 |  1   1  99   0   0   0
27-08 02:25:00|  0   0 1.0| 136M 16.1M 73.4M  767M|   0     0 |   0     0 | 226   239 |  1   1  99   0   0   0
27-08 02:25:01|9.0   0  27| 141M 16.2M 75.4M  759M|   0     0 |  32k   48k|2337  2796 | 12  26  62   0   0   0
27-08 02:25:02|2.0   0   0| 141M 16.2M 77.7M  758M|   0     0 |   0     0 | 617   578 |  5  45  49   0   0   0
27-08 02:25:03|2.0   0   0| 141M 16.2M 80.2M  755M|   0     0 |   0     0 | 618   592 |  9  42  49   0   0   0
27-08 02:25:04|1.0   0   0| 141M 16.2M 82.5M  753M|   0     0 |   0     0 | 560   553 |  6  45  49   0   0   1
27-08 02:25:05|3.0   0   0| 141M 16.2M 84.9M  750M|   0     0 |   0     0 | 569   576 |  6  44  49   0   0   0
27-08 02:25:06|2.0   0   0| 141M 16.2M 87.4M  748M|   0     0 |   0    96k| 575   578 |  9  42  49   0   0   0
27-08 02:25:07|1.0   0   0| 141M 16.2M 89.9M  745M|   0     0 |   0     0 | 609   626 |  6  45  49   0   0   1
27-08 02:25:08|2.0   0   0| 141M 16.2M 92.4M  743M|   0     0 |   0     0 | 626   660 |  4  46  50   0   0   0
27-08 02:25:09|2.0   0   0| 141M 16.2M 94.8M  740M|   0     0 |   0     0 | 573   553 |  8  43  49   0   0   0
27-08 02:25:10|2.0   0   0| 141M 16.2M 97.3M  738M|   0     0 |   0     0 | 548   535 |  6  44  49   0   0   0
27-08 02:25:11|2.0   0   0| 141M 16.2M 99.8M  735M|   0     0 |   0    12k| 614   643 |  8  43  49   0   0   0
27-08 02:25:12|1.0   0   0| 141M 16.2M  102M  733M|   0     0 |   0     0 | 636   675 |  8  43  49   0   0   0
27-08 02:25:13|2.0   0   0| 141M 16.2M  105M  730M|   0     0 |   0     0 | 619   634 | 10  41  49   0   0   0
27-08 02:25:14|2.0   0   0| 141M 16.2M  107M  728M|   0     0 |   0     0 | 643   673 |  9  42  49   0   0   0
27-08 02:25:15|2.0   0   0| 141M 16.2M  110M  726M|   0     0 |   0     0 | 604   615 |  7  43  49   0   0   1
27-08 02:25:16|2.0   0   0| 141M 16.2M  112M  723M|   0     0 |   0    12k| 596   598 |  8  43  49   0   0   0
27-08 02:25:17|2.0   0   0| 141M 16.2M  115M  720M|   0     0 |   0     0 | 632   659 |  6  45  49   0   0   0
27-08 02:25:18|2.0   0   0| 141M 16.2M  117M  718M|   0     0 |   0     0 | 654   686 |  6  45  49   0   0   0
27-08 02:25:19|2.0   0   0| 141M 16.2M  120M  715M|   0     0 |   0     0 | 649   683 |  8  43  49   0   0   1
27-08 02:25:20|2.0   0   0| 141M 16.2M  123M  713M|   0     0 |   0     0 | 630   678 |  7  44  49   0   0   0
27-08 02:25:21|2.0   0   0| 141M 16.2M  125M  710M|   0     0 |   0    12k| 694   758 |  8  44  48   0   0   0
27-08 02:25:22|2.0   0   0| 141M 16.2M  128M  707M|   0     0 |   0     0 | 615   629 |  7  44  49   0   0   0
27-08 02:25:23|2.0   0   0| 141M 16.2M  130M  705M|   0     0 |   0     0 | 601   640 |  7  44  49   0   0   1
27-08 02:25:24|2.0   0   0| 141M 16.2M  133M  703M|   0     0 |   0     0 | 595   618 |  6  44  49   0   0   0
27-08 02:25:25|1.0   0   0| 141M 16.2M  135M  700M|   0     0 |   0     0 | 587   605 |  7  44  49   0   0   0
27-08 02:25:26|1.0   0   0| 141M 16.2M  138M  697M|   0     0 |   0    12k| 583   601 |  9  42  49   0   0   0
27-08 02:25:27|3.0   0   0| 141M 16.2M  140M  695M|   0     0 |   0     0 | 618   648 |  6  45  49   0   0   0
27-08 02:25:28|2.0   0   0| 141M 16.2M  143M  692M|   0     0 |   0     0 | 641   696 |  7  44  49   0   0   0
27-08 02:25:29|1.0   0   0| 141M 16.2M  145M  690M|   0     0 |   0     0 | 596   610 |  9  43  49   0   0   0
27-08 02:25:30|2.0   0   0| 141M 16.2M  147M  688M|   0     0 |   0     0 | 586   627 |  7  44  49   0   0   0
27-08 02:25:31|2.0   0   0| 141M 16.2M  150M  686M|   0     0 |   0    12k| 612   665 |  5  46  49   0   0   0
27-08 02:25:32|2.0   0   0| 141M 16.2M  152M  683M|   0     0 |   0     0 | 585   600 |  8  43  49   0   0   0
27-08 02:25:33|3.0   0   0| 141M 16.2M  155M  681M|   0     0 |   0     0 | 597   574 |  9  42  49   0   0   1
27-08 02:25:34|2.0   0   0| 141M 16.2M  157M  678M|   0     0 |   0     0 | 648   662 |  7  44  49   0   0   0
27-08 02:25:35|1.0   0   0| 141M 16.2M  160M  676M|   0     0 |   0     0 | 599   545 |  9  42  49   0   0   0
27-08 02:25:36|1.0   0   0| 141M 16.2M  162M  673M|   0     0 |   0    12k| 530   422 |  7  44  50   0   0   0
27-08 02:25:37|1.0   0   0| 141M 16.2M  165M  671M|   0     0 |   0     0 | 604   499 |  8  42  50   0   0   0
27-08 02:25:38|1.0   0   0| 141M 16.2M  167M  668M|   0     0 |   0     0 | 649   627 |  6  45  49   0   0   0
27-08 02:25:39|2.0   0   0| 141M 16.2M  170M  666M|   0     0 |   0     0 | 619   627 |  7  44  49   0   0   0
27-08 02:25:40|1.0   0   0| 141M 16.2M  172M  663M|   0     0 |   0     0 | 582   568 |  8  43  49   0   0   0
27-08 02:25:41|1.0   0   0| 141M 16.2M  175M  660M|   0     0 |   0    12k| 526   480 |  7  44  49   0   0   0
27-08 02:25:42|1.0   0   0| 141M 16.2M  178M  658M|   0     0 |   0     0 | 556   544 |  7  43  49   0   0   0
27-08 02:25:43|2.0   0   0| 141M 16.2M  180M  655M|   0     0 |   0     0 | 610   643 |  8  43  49   0   0   0
27-08 02:25:44|2.0   0   0| 141M 16.2M  183M  652M|   0     0 |   0     0 | 663   719 |  7  44  49   0   0   1
27-08 02:25:45|2.0   0   0| 141M 16.2M  185M  650M|   0     0 |   0     0 | 638   679 |  7  44  49   0   0   0
27-08 02:25:46|2.0   0   0| 141M 16.2M  188M  647M|   0     0 |   0    12k| 628   664 |  6  45  49   0   0   0
27-08 02:25:47|2.0   0   0| 141M 16.2M  191M  644M|   0     0 |   0     0 | 634   684 |  6  45  49   0   0   0
27-08 02:25:48|1.0   0   0| 141M 16.2M  193M  642M|   0     0 |   0     0 | 652   703 |  8  43  49   0   0   0
27-08 02:25:49|1.0   0   0| 141M 16.2M  196M  639M|   0     0 |   0     0 | 595   593 |  7  45  49   0   0   1
27-08 02:25:50|1.0   0   0| 141M 16.2M  198M  636M|   0     0 |   0     0 | 582   589 |  9  42  49   0   0   0
27-08 02:25:51|2.0   0   0| 141M 16.2M  201M  634M|   0     0 |   0    12k| 667   715 |  6  46  49   0   0   0
27-08 02:25:52|2.0   0   0| 142M 16.2M  203M  631M|   0     0 |   0     0 | 662   694 |  6  46  49   0   0   0
27-08 02:25:53|2.0   0   0| 142M 16.2M  206M  628M|   0     0 |   0     0 | 661   720 |  4  48  49   0   0   0
27-08 02:25:54|2.0   0   0| 142M 16.2M  209M  626M|   0     0 |   0     0 | 682   731 |  6  46  49   0   0   0
27-08 02:25:55|2.0   0   0| 142M 16.2M  211M  623M|   0     0 |   0     0 | 630   661 |  9  42  49   0   0   0
27-08 02:25:56|2.0   0   0| 142M 16.2M  214M  620M|   0     0 |   0    12k| 648   674 |  8  43  48   0   0   0
27-08 02:25:57|1.0   0   0| 142M 16.2M  216M  618M|   0     0 |   0     0 | 634   657 |  5  46  49   0   0   0
27-08 02:25:58|2.0   0   0| 142M 16.2M  219M  615M|   0     0 |   0     0 | 557   546 |  7  44  49   0   0   0
27-08 02:25:59|2.0   0   0| 142M 16.2M  221M  613M|   0     0 |   0     0 | 633   678 |  6  45  49   0   0   0
27-08 02:26:00|1.0   0 1.0| 142M 16.2M  224M  610M|   0     0 |   0     0 | 553   598 |  7  44  49   0   0   0
27-08 02:26:01|  0   0   0| 137M 16.2M  224M  615M|   0     0 |   0    12k| 317   378 |  3  22  75   0   0   0
27-08 02:26:02|  0   0   0| 138M 16.2M  224M  615M|   0     0 |   0     0 | 116   192 |  0   1 100   0   0   0
27-08 02:26:03|  0   0   0| 137M 16.2M  224M  615M|   0     0 |   0     0 | 125   219 |  0   1  99   0   0   0
27-08 02:26:04|  0   0   0| 137M 16.2M  224M  615M|   0     0 |   0     0 | 126   197 |  1   0 100   0   0   0
27-08 02:26:05|  0   0   0| 137M 16.2M  224M  615M|   0     0 |   0     0 | 134   211 |  0   0 100   0   0   0^

pdflush が起動しないことを確認。 (5秒ごとに 12k 書かれているのは原因が掴めていない)

最後に fsync(2) の動作確認。 先程と異なるのは write(2) の直後に fsync(2) を実行している点。

package main

import (
        "fmt"
        "os"
        "syscall"
)

func main() {
        fd, err := syscall.Open("/tmp/write-test.txt", syscall.O_CREAT|syscall.O_RDWR|syscall.O_APPEND, 0644)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }

        for {
                _, err := syscall.Write(fd, []byte("abc"))
                err = syscall.Fsync(fd)
                if err != nil {
                        fmt.Println(err)
                        os.Exit(1)
                }
        }
}

dstat で確認。

$ dstat -tv
----system---- ---procs--- ------memory-usage----- ---paging-- -dsk/total- ---system-- ----total-cpu-usage----
     time     |run blk new| used  buff  cach  free|  in   out | read  writ| int   csw |usr sys idl wai hiq siq
27-08 02:28:55|  0   0 0.1| 136M 17.0M 74.3M  765M| 487k  457k|3235k  529k| 520   747 |  4   2  93   1   0   0
27-08 02:28:56|  0   0   0| 136M 17.0M 74.3M  765M|   0     0 |   0     0 | 108   180 |  0   0  99   0   0   0
27-08 02:28:57|  0   0   0| 136M 17.0M 74.3M  765M|   0     0 |   0     0 | 125   195 |  1   0  99   0   0   0
27-08 02:28:58|  0   0   0| 136M 17.0M 74.3M  765M|   0     0 |   0     0 | 104   175 |  0   1 100   0   0   0
27-08 02:28:59|  0   0   0| 136M 17.0M 74.3M  765M|   0     0 |   0     0 | 125   189 |  0   1  99   0   0   0
27-08 02:29:00|1.0   0  19| 160M 17.0M 74.3M  740M|   0     0 |   0  8192B|1586  2286 |  8   6  86   0   0   0
27-08 02:29:01|1.0   0 6.0| 143M 25.8M 75.4M  748M|   0     0 |   0    18M|  12k   17k|  3  21  51  25   0   0
27-08 02:29:02|  0 1.0   0| 143M 35.1M 75.4M  739M|   0     0 |   0    19M|  12k   17k|  1  17  54  28   0   0
27-08 02:29:03|  0 1.0   0| 143M 44.6M 75.4M  729M|   0     0 |   0    19M|  13k   17k|  1  20  52  27   0   0
27-08 02:29:04|1.0   0   0| 142M 53.5M 75.3M  721M|   0     0 |   0    18M|  13k   19k|  1  18  56  25   0   1
27-08 02:29:05|2.0   0   0| 142M 62.4M 75.4M  712M|   0     0 |   0    18M|  13k   19k|  1  20  55  24   0   0
27-08 02:29:06|1.0   0   0| 142M 71.7M 75.4M  703M|   0     0 |   0    19M|  13k   19k|  1  19  57  24   0   0
27-08 02:29:07|2.0   0   0| 142M 80.6M 75.4M  694M|   0     0 |   0    18M|  13k   19k|  0  18  57  25   0   0
27-08 02:29:08|1.0   0   0| 142M 89.7M 75.4M  685M|   0     0 |   0    18M|  13k   19k|  1  15  59  25   0   0
27-08 02:29:09|1.0   0   0| 143M 98.2M 75.4M  676M|   0     0 |   0    18M|  13k   18k|  1  15  58  26   0   0
27-08 02:29:10|2.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    17M|  13k   18k|  0  19  57  25   0   0
27-08 02:29:11|2.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    18M|  13k   19k|  1  20  55  24   0   0
27-08 02:29:12|1.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    17M|  13k   18k|  1  19  55  25   0   1
27-08 02:29:13|  0 1.0   0| 142M  101M 75.4M  674M|   0     0 |   0    19M|  12k   17k|  1  19  52  28   0   0
27-08 02:29:14|  0 1.0 1.0| 142M  101M 75.4M  674M|   0     0 |   0    19M|  13k   17k|  0  18  54  28   0   0
27-08 02:29:15|1.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    20M|  13k   18k|  1  18  53  28   0   0
27-08 02:29:16|2.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    18M|  13k   19k|  1  17  57  25   0   0
27-08 02:29:17|1.0   0   0| 142M  101M 75.4M  674M|   0     0 |   0    18M|  13k   19k|  0  19  57  24   0   0
27-08 02:29:18|1.0   0   0| 143M  101M 75.4M  673M|   0     0 |   0    18M|  13k   19k|  1  18  56  25   0   1
27-08 02:29:19|1.0 1.0   0| 142M  101M 75.4M  673M|   0     0 |   0    19M|  14k   20k|  0  19  57  24   0   0
27-08 02:29:20|1.0   0   0| 142M  101M 75.4M  673M|   0     0 |   0    18M|  13k   19k|  1  16  57  26   0   0
27-08 02:29:21|1.0 1.0   0| 142M  107M 75.4M  668M|   0     0 |   0    22M|  10k   21k|  1  20  57  22   0   0
27-08 02:29:22|1.0 1.0   0| 143M  111M 75.5M  663M|   0     0 |   0    24M|8291    22k|  1  23  56  20   0   1
27-08 02:29:23|1.0 1.0   0| 143M  114M 75.4M  661M|   0     0 |   0    25M|8270    22k|  0  22  58  21   0   0
27-08 02:29:24|1.0 1.0   0| 143M  120M 75.4M  654M|   0     0 |   0    25M|8334    22k|  0  21  58  21   0   0
27-08 02:29:25|1.0 1.0   0| 143M  122M 75.5M  652M|   0     0 |   0    25M|8385    23k|  1  18  59  22   0   0
27-08 02:29:26|1.0   0   0| 143M  126M 75.5M  648M|   0     0 |   0    21M|  11k   21k|  1  20  59  21   0   0
27-08 02:29:27|1.0 1.0   0| 143M  130M 75.5M  643M|   0     0 |   0    20M|  11k   21k|  0  19  59  22   0   0
27-08 02:29:28|1.0 1.0   0| 143M  132M 75.4M  642M|   0     0 |   0    20M|  11k   21k|  0  19  59  21   0   0
27-08 02:29:29|1.0 1.0   0| 143M  132M 75.5M  642M|   0     0 |   0    21M|  11k   22k|  1  18  60  21   0   0
27-08 02:29:30|1.0   0   0| 143M  135M 75.4M  638M|   0     0 |   0    21M|  11k   22k|  0  16  62  22   0   0
27-08 02:29:31|1.0 1.0   0| 143M  137M 75.5M  636M|   0     0 |   0    21M|  11k   22k|  0  19  60  21   0   0
27-08 02:29:32|1.0 1.0   0| 143M  137M 75.5M  636M|   0     0 |   0    21M|  11k   22k|  1  20  60  20   0   0
27-08 02:29:33|2.0   0   0| 143M  140M 75.5M  633M|   0     0 |   0    20M|  13k   18k|  1  17  53  29   0   0
27-08 02:29:34|  0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  14k   19k|  1  19  53  27   0   0
27-08 02:29:35|  0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  13k   18k|  1  16  55  28   0   0
27-08 02:29:36|  0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    19M|  13k   18k|  0  18  53  29   0   0
27-08 02:29:37|  0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  14k   19k|  1  18  53  28   0   0
27-08 02:29:38|1.0   0   0| 143M  143M 75.5M  631M|   0     0 |   0    19M|  13k   18k|  1  16  54  29   0   0
27-08 02:29:39|  0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  13k   18k|  0  19  53  28   0   0
27-08 02:29:40|2.0   0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  13k   18k|  1  20  52  28   0   0
27-08 02:29:41|1.0   0   0| 143M  143M 75.5M  631M|   0     0 |   0    21M|  11k   21k|  1  20  58  22   0   0
27-08 02:29:42|1.0   0   0| 143M  143M 75.5M  631M|   0     0 |   0    20M|  11k   21k|  1  21  58  21   0   0
27-08 02:29:43|1.0 1.0   0| 143M  143M 75.5M  631M|   0     0 |   0    21M|  11k   22k|  0  21  59  21   0   0
27-08 02:29:44|1.0 1.0   0| 143M  143M 75.6M  631M|   0     0 |   0    22M|  11k   22k|  0  19  60  21   0   0
27-08 02:29:45|2.0   0   0| 143M  143M 75.6M  631M|   0     0 |   0    21M|  11k   21k|  1  20  60  20   0   0
27-08 02:29:46|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   22k|  0  18  61  21   0   1
27-08 02:29:47|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   22k|  1  20  59  20   0   0
27-08 02:29:48|1.0 1.0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  1  16  61  22   0   0
27-08 02:29:49|1.0 1.0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  1  22  57  20   0   0
27-08 02:29:50|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  0  16  63  21   0   0
27-08 02:29:51|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   22k|  1  21  59  20   0   0
27-08 02:29:52|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   22k|  0  20  60  21   0   0
27-08 02:29:53|1.0 1.0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   22k|  0  18  61  21   0   0
27-08 02:29:54|1.0 1.0   0| 143M  143M 75.6M  631M|   0     0 |   0    21M|  11k   22k|  0  20  60  20   0   0
27-08 02:29:55|1.0   0   0| 143M  143M 75.6M  631M|   0     0 |   0    21M|  11k   22k|  1  19  59  21   0   0
27-08 02:29:56|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   21k|  1  18  60  21   0   0
27-08 02:29:57|1.0 1.0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  1  19  59  21   0   0
27-08 02:29:58|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    21M|  11k   21k|  0  20  58  20   0   1
27-08 02:29:59|2.0 1.0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  1  20  60  20   0   0
27-08 02:30:00|1.0   0   0| 143M  143M 75.6M  630M|   0     0 |   0    20M|  11k   21k|  1  15  62  22   0   0
27-08 02:30:01|  0   0 1.0| 137M  143M 74.5M  638M|   0     0 |   0  1340k| 911  1688 |  1   1  97   1   0   0
27-08 02:30:02|  0   0 3.0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 163   290 |  1   1  99   0   0   0
27-08 02:30:03|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 132   197 |  0   1  99   0   0   0
27-08 02:30:04|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 140   234 |  1   0  99   0   0   0
27-08 02:30:05|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 121   195 |  1   1  99   0   0   0
27-08 02:30:06|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 148   232 |  0   1  99   0   0   0
27-08 02:30:07|  0   0 1.0| 137M  143M 74.5M  638M|   0     0 |   0    80k| 175   264 |  1   1  99   0   0   0
27-08 02:30:08|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 114   205 |  1   1  99   0   0   0
27-08 02:30:09|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 118   197 |  0   1  99   0   0   0
27-08 02:30:10|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 121   194 |  1   0  99   0   0   0
27-08 02:30:11|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 123   205 |  1   0  99   0   0   0
27-08 02:30:12|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 104   175 |  0   0 100   0   0   0
27-08 02:30:13|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 121   207 |  1   1  99   0   0   0
27-08 02:30:14|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 124   207 |  0   0 100   0   0   0
27-08 02:30:15|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 156   253 |  1   1  99   0   0   0
27-08 02:30:16|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 119   219 |  0   1  99   0   0   0
27-08 02:30:17|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 141   217 |  0   1 100   0   0   0
27-08 02:30:18|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 125   191 |  0   0 100   0   0   0
27-08 02:30:19|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 151   202 |  0   1  99   0   0   1
27-08 02:30:20|  0   0 1.0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 163   252 |  0   1  99   0   0   0
27-08 02:30:21|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 174   252 |  0   1  99   0   0   0
27-08 02:30:22|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 279   454 |  1   1  98   0   0   0
27-08 02:30:23|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 224   245 |  1   1  99   0   0   0
27-08 02:30:24|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 157   206 |  1   0  99   0   0   0
27-08 02:30:25|1.0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 190   238 |  0   1  99   0   0   0
27-08 02:30:26|  0   0   0| 137M  143M 74.5M  638M|   0     0 |   0     0 | 174   182 |  1   1  99   0   0   0
27-08 02:30:27|  0   0 1.0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 225   263 |  2   1  97   0   0   0
27-08 02:30:28|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 216   313 |  1   2  98   0   0   0
27-08 02:30:29|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 198   278 |  1   0  99   0   0   0
27-08 02:30:30|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 143   221 |  0   0 100   0   0   0
27-08 02:30:31|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 154   234 |  0   1  99   0   0   0
27-08 02:30:32|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 153   235 |  0   0  99   0   0   0
27-08 02:30:33|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0    36k| 176   281 |  1   1  98   0   0   0
27-08 02:30:34|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 138   213 |  0   0 100   0   0   0
27-08 02:30:35|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 154   230 |  1   1  99   0   0   0
27-08 02:30:36|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 151   217 |  0   0 100   0   0   0
27-08 02:30:37|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 191   289 |  1   1  98   0   0   0
27-08 02:30:38|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0    28k| 163   246 |  0   1  99   0   0   0
27-08 02:30:39|  0   0   0| 139M  143M 74.5M  636M|   0     0 |   0     0 | 153   219 |  0   1  99   0   0   0^C

write(2) の後に fsync(2) を実行することで即時にディスクに同期しているのが確認できる。fsync(2) 以外にも open(2) の flags に syscall.O_SYNC を設定することで同様のことが行える。

$ man 2 open
...
O_SYNC Write  operations  on  the  file  will  complete  according  to the requirements of synchronized I/O file
        integrity completion (by contrast with  the  synchronized  I/O  data  integrity  completion  provided  by
        O_DSYNC.)

        By  the time write(2) (and similar) return, the output data and associated file metadata have been trans‐
        ferred to the underlying hardware (i.e., as though each write(2) was followed by  a  call  to  fsync(2)).
...

他にも `watch grep -e Dirty: -e Writeback: /proc/meminfo` で Dirty が大きく増えないのを確認できる。


[1] Can I watch the progress of a `sync` operation?
[2] Difference between vm.dirty_ratio and vm.dirty_background_ratio?
[3] Linuxページキャッシュの設定を変更してWrite I/Oをチューニングしたメモ