中村和志@神戸です。

In article <YAS.03Aug3051449@kirk.is.tsukuba.ac.jp>
yas@is.tsukuba.ac.jp writes:
>だいぶ深い話になってきました。
はい。

>write back という用語がよく分からないのですが、これは、write 
>しても、ディスク側のキャッシュに書くだけで、実際にはディスク
>には書かれないという意味ですか。
>共有メモリの一貫性なら、write-through/copy-back というのはい
まあ、だいたいその通りです。現実にはキャッシュに書くだけ or
逆にキャッシュに書かずに直接ディスクにだけ書くということは
ないので、厳密に言うと、
・ディスク側のキャッシュには必ず書く
・その後、ちゃんとディスクに書いてからackを返す。→write through
・データを受取った時点でとりあえずackを返す。実際にディスクに
  書くのは後で頃合いを見計らってから。→write back
というつもりで書きました。必ずコピーが残っているのだから、
copy-backという用語の方が適切かも知れませんが。

>タイミングを制御すると、遅くなることはあっても、速くなること
>はないと思うんだけど。書込みのタイミングは、OSの上位層から
そうなんです。lazy-evaluationと同等の御利益を期待して、いかに
うまく遅くするかに知恵を絞っている訳なのですが、

>の要求の順番ではなくて、適当に入れ替えて、ヘッドの位置や回転
>待ち時間を考慮して最適化した方が速いと思うんです。それを、
ええ、BSDのFFSはその辺をカリカリにチューンしていました。いや、
今でもしています(or しているつもりです)。更にディレクトリ間
の相関関係なんかまでも利用して。MINIXですら、bufferをflush
する時、ヘッドのシーク時間が少なくなるように、書込み順を入換え
る、くらいのことはやっていました。

>OSの上位層の指示の順番に従えば、最適化ができなくて遅くなる
>んじゃないですか。
実際にdiskに書込みを指示するのは下位層なので。

問題は、diskが540MBクラスから1GB超になる頃、内周と外周でセクタ
数が異なる可変記録密度方式を採用するようになり、従来のC/H/S
で管理出来なくなったことです。IBM-PCの場合、C/H/Sまとめて16bit
というシバリから1024シリンダ問題も有り、SCSIライクにLBAでアクセス
したいという要求も有って、これ以降LBAでアクセスするようになり、
本当のC/H/Sは外部に見せなくなりました。古いWindowsやDOS
のようにC/H/Sでアクセスしてくる奴は、BIOSが適当にLBAに変換して
くれて、diskは内部でLBAから本当のC/H/Sに変換すると。
#その変換アルゴリズムがBIOSによって違うことがたまに有り、disk
#を他のPCに移植すると読めなかったり、RAID I/Fが故障して交換
#したら、壊れていないdiskを読めないと言って勝手に初期化して
#くれたりしますが。
  従来、BSD UNIXがやっていたような最適化は、diskが内部で勝手に
やるようになってしまいました。BSDがやっていた最適化も可変記録
密度方式には対応していませんでしたし。そしてdiskの外部から見た
速度を向上させるには、
a.外部には、とりあえずackを返す。
b.内部的には、なるべく書込みを遅らせて、書込み順を最適化する。
という風になりました。FreeBSDでは長らく、危険なのでa.は
disableにしていたのですが、速度向上にかなり効果が有るのと、
ヨソ(Linux,Windows)が平気な顔して使っているので、最近enable
になりました。ata(4)を見ると、

     hw.ata.wc
     set to 1 to enable Write Caching, 0 to disable (default is enabled).
     (WARNING: might cause data loss on power failures.)

となっています。割と最近まで、defaultは0でした。ウォーニングにも
有るように、enableだとデータを失う可能性が有ると思います。そして
その失うデータがどれになるのかdisk外部から予測不能なので、Soft-
Updateでも、ジャーナリング不要とは私は思わないのです。もっとも
これがenableだとジャーナリングしてても駄目な気がしますが。
  最近だと更に、

     hw.ata.tags
     set to 1 to enable Tagged Queuing support, 0 to disable (default is dis-
     abled).  (Only IBM DPTA, DTLA, ICxxxxxxAT, ICxxxxxxAV drives support
     that.)

というのも入っています。いつの間にやら、IBM以外のドライブもサポート
されているらしいですが、私は使ったこと無いです。

数年前、fjで話題になったのは、「最近のdiskは内部のC/H/Sを見せて
くれず、勝手に最適化しているのに、*BSDでcylinder groupやら何やら
一生懸命最適化しているのは、もはや無意味では?」という疑問です。
結論として、「*BSDで最適化したファイルはなるべく近くの連続した
LBAに配置されて、そういうLBAでアクセスするファイルはどうやら
disk内部でも近くに配置され、結果的にソコハカトナク効果は有るん
じゃないの。」ということになったように思います。

>fsck が速くなるというのは、わかりますけど。

>    consistency が取れるなら write するけれど、consistency が取
>    れないなら、write しないで溜める。
>
>という意味ですか。
そうですね。

>いくら溜めても、メモリが無くなれば最後は write するしかいな
>ので、平均的には特かもしれないけれど、極限状態だと危ないこと
>もあるんじゃないかなあ。
そうです。SoftUpdateが登場した時、綱渡り的だと不安がる人が結構
居ました。私も-stableブランチからリリースが2つか3つ出てから
やっと使い始めた口です。でも、SoftUpdateの作業をした人達はこの
極限状態のギリギリのタイミングまで追いかけて安全なように作った
と言っていたと思います。そうすれば、async書込みの速度とsync
書込みの安全性が得られると。
-- 
中村和志@神戸         <mailto:kaz@kobe1995.net>
NAKAMURA Kazushi@KOBE   <http://kobe1995.jp/>
- Be Free(BSD), or Die...