けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

/bin/sync でメモリ上のデータをディスクに書き込む

はじめに

よく分からんコマンド調べてみようシリーズ。 経緯はこちら。

kkznch.hatenablog.com

今回は /bin/sync について。

/bin/sync

mac でメモリを解放する際に使ったコマンド...と思っていたがそれは purge の方だった。 こいつは一体なんなんだ。

では man sync したときの DESCRIPTION の内容。

The sync utility can be called to ensure that all disk writes have been completed before the processor is halted in a way not suitably done by shutdown(8). Generally, it is preferable to use shutdown(8) to shut down the system, as they may perform additional actions such as resynchronizing the hardware clock and flushing internal caches before performing a final sync.

shutdown などでシステムを停止する前に、ディスクへの書き込みをする際に使用される、なんとなく分かる。 実行してみようと思ったけどどう確認すればいいんだろうか。

/bin/sync 実行してみる

とりあえず実行する。

$ sync

何も起きない。 何かしら書き込みの処理を走らせて、そのあとに sync の処理を走らせるとよさそう。

/proc/meminfo の Dirty という項目がディスクへの書き込み待ちメモリサイズを表しているらしく、dd で書き込みながら Dirty を見ればいけると思ったが、どうやら mac にはそもそも /proc/meminfo なるファイルは存在しない。 vm_stat というコマンドで同様の内容を見ることができるらしいが、 /proc/meminfo の Dirty に対応する項目がどれか分からなかった。

というわけで今回は諦めて Linux仮想マシン上で sync を試すことに。 sync の動作的には UnixLinux も同じだと思うからいいよね。

まずメモリを監視するコンソールと、ディスクへの書き込みを行うためのコンソールの二つを立ち上げる。 メモリ監視するコンソールでは以下のように watchgrep を組み合わせて Dirty を見続ける。

$ watch grep -e Dirty /proc/meminfo

Dirty:                 0 kB

つづいてディスクへの書き込みを行うコンソールで以下のコマンドを実行する。

$ dd if=/dev/zero of=test bs=1M count=1024

するとメモリサイズが一時的に増加した後、数百 kB に落ち着く。 このときに以下のように sync を実行すると、Dirty のメモリサイズが数 kB まで減少する。

$ sync

dd で書き出した後にメモリに数百 kB ほど残ったデータは果たして何なのかは分からない。 sync を実行してもメモリに数 kB 残ったので、こいつも何なのかは分からない。

そして今回思ったことは、Swap や Cache, Paging などメモリ周りの知識が曖昧だなということ。 もっと勉強してからこのコマンドに臨もう思う...。

参考リンク

qiita.com

archive.linux.or.jp

yomon.hatenablog.com

teratail.com