8月版 SSDをめぐる議論に浮かび上がるベンダ模様


小崎資広
2009/9/8


Welcome to the Real World!

 こうした反対の声に対して1つ1つ反論していったのが、Mark Lord(SATA方面の主要デベロッパで、hdparmの作者としても有名)です。

 まず彼は、最近OCZ Vertexがファームウェアをバージョンアップし、TRIM対応になったことを説明し、自身が広範なテストを行ったことを告げました。ちょっと長いのですが、彼の実験結果を張り付けます。

■条件■
  • シングルエクステント(注4)に対するTRIMコマンド1つの速度
  • エクステントの長さはまちまち
  • それぞれのTRIMの間に"sleep 1 ; sync"を入れる

Beginning TRIM operations..
Trimming 1 free extents encompassing 656 sectors (0 MB)
Trimming 1 free extents encompassing 30 sectors (0 MB)
Trimming 1 free extents encompassing 194 sectors (0 MB)
Trimming 1 free extents encompassing 42 sectors (0 MB)
Trimming 1 free extents encompassing 1574 sectors (1 MB)
Trimming 1 free extents encompassing 612 sectors (0 MB)
Trimming 1 free extents encompassing 862 sectors (0 MB)
Trimming 1 free extents encompassing 1344 sectors (1 MB)
Trimming 1 free extents encompassing 822 sectors (0 MB)
Trimming 1 free extents encompassing 672 sectors (0 MB)
Trimming 1 free extents encompassing 226 sectors (0 MB)
Trimming 1 free extents encompassing 860 sectors (0 MB)
Trimming 1 free extents encompassing 638 sectors (0 MB)
Trimming 1 free extents encompassing 1020 sectors (0 MB)
Trimming 1 free extents encompassing 12286 sectors (6 MB)
Trimming 1 free extents encompassing 1964 sectors (1 MB)
Done.
[ 1083.768460] ata_qc_issue: ATA_CMD_DSM starting
[ 1083.768672] trim_completed: ATA_CMD_DSM took 438841 cycles
[ 1084.794304] ata_qc_issue: ATA_CMD_DSM starting
[ 1084.794469] trim_completed: ATA_CMD_DSM took 338065 cycles
[ 1085.823605] ata_qc_issue: ATA_CMD_DSM starting
[ 1085.823791] trim_completed: ATA_CMD_DSM took 382317 cycles
[ 1086.852989] ata_qc_issue: ATA_CMD_DSM starting
[ 1086.853166] trim_completed: ATA_CMD_DSM took 352248 cycles
[ 1087.882825] ata_qc_issue: ATA_CMD_DSM starting
[ 1087.883127] trim_completed: ATA_CMD_DSM took 624546 cycles
[ 1088.915833] ata_qc_issue: ATA_CMD_DSM starting
[ 1088.916056] trim_completed: ATA_CMD_DSM took 455299 cycles
[ 1089.941946] ata_qc_issue: ATA_CMD_DSM starting
[ 1089.942181] trim_completed: ATA_CMD_DSM took 485615 cycles
[ 1090.968793] ata_qc_issue: ATA_CMD_DSM starting
[ 1090.969062] trim_completed: ATA_CMD_DSM took 562042 cycles
[ 1091.994441] ata_qc_issue: ATA_CMD_DSM starting
[ 1091.994672] trim_completed: ATA_CMD_DSM took 479219 cycles
[ 1093.023576] ata_qc_issue: ATA_CMD_DSM starting
[ 1093.023799] trim_completed: ATA_CMD_DSM took 463398 cycles
[ 1094.053545] ata_qc_issue: ATA_CMD_DSM starting
[ 1094.053731] trim_completed: ATA_CMD_DSM took 385229 cycles
[ 1095.083131] ata_qc_issue: ATA_CMD_DSM starting
[ 1095.083356] trim_completed: ATA_CMD_DSM took 458328 cycles
[ 1096.113146] ata_qc_issue: ATA_CMD_DSM starting
[ 1096.113356] trim_completed: ATA_CMD_DSM took 423670 cycles
[ 1097.144211] ata_qc_issue: ATA_CMD_DSM starting
[ 1097.144464] trim_completed: ATA_CMD_DSM took 524706 cycles
[ 1098.174457] ata_qc_issue: ATA_CMD_DSM starting
[ 1098.175619] trim_completed: ATA_CMD_DSM took 2491138 cycles
[ 1099.209218] ata_qc_issue: ATA_CMD_DSM starting
[ 1099.209539] trim_completed: ATA_CMD_DSM took 674752 cycles

 これを見ると、遅延は数ミリ秒のレンジに収まっているように見え、TRIMの性能は良好に思えます。しかし、これは"sleep 1"が問題を隠しているだけです。"sleep 1"を取り除いてもう一度同じ実験をすると……。

Beginning TRIM operations..
Trimming 1 free extents encompassing 656 sectors (0 MB)
Trimming 1 free extents encompassing 30 sectors (0 MB)
Trimming 1 free extents encompassing 194 sectors (0 MB)
Trimming 1 free extents encompassing 42 sectors (0 MB)
Trimming 1 free extents encompassing 1574 sectors (1 MB)
Trimming 1 free extents encompassing 612 sectors (0 MB)
Trimming 1 free extents encompassing 862 sectors (0 MB)
Trimming 1 free extents encompassing 1344 sectors (1 MB)
Trimming 1 free extents encompassing 822 sectors (0 MB)
Trimming 1 free extents encompassing 672 sectors (0 MB)
Trimming 1 free extents encompassing 226 sectors (0 MB)
Trimming 1 free extents encompassing 860 sectors (0 MB)
Trimming 1 free extents encompassing 638 sectors (0 MB)
Trimming 1 free extents encompassing 1020 sectors (0 MB)
Trimming 1 free extents encompassing 12286 sectors (6 MB)
Trimming 1 free extents encompassing 1964 sectors (1 MB)
Done.
[ 1258.206379] ata_qc_issue: ATA_CMD_DSM starting
[ 1258.206587] trim_completed: ATA_CMD_DSM took 426088 cycles
[ 1258.254513] ata_qc_issue: ATA_CMD_DSM starting
[ 1258.366141] trim_completed: ATA_CMD_DSM took 241231523 cycles
[ 1258.411749] ata_qc_issue: ATA_CMD_DSM starting
[ 1258.524047] trim_completed: ATA_CMD_DSM took 242676590 cycles
[ 1258.600184] ata_qc_issue: ATA_CMD_DSM starting
[ 1258.711766] trim_completed: ATA_CMD_DSM took 241136519 cycles
[ 1258.813515] ata_qc_issue: ATA_CMD_DSM starting
[ 1258.910599] trim_completed: ATA_CMD_DSM took 209803152 cycles
[ 1259.027253] ata_qc_issue: ATA_CMD_DSM starting
[ 1259.108916] trim_completed: ATA_CMD_DSM took 176473453 cycles
[ 1259.239549] ata_qc_issue: ATA_CMD_DSM starting
[ 1259.306640] trim_completed: ATA_CMD_DSM took 144968694 cycles
[ 1259.452978] ata_qc_issue: ATA_CMD_DSM starting
[ 1259.505017] trim_completed: ATA_CMD_DSM took 112440172 cycles
[ 1259.552393] ata_qc_issue: ATA_CMD_DSM starting
[ 1259.664739] trim_completed: ATA_CMD_DSM took 242778861 cycles
[ 1259.775724] ata_qc_issue: ATA_CMD_DSM starting
[ 1259.861318] trim_completed: ATA_CMD_DSM took 184955732 cycles
[ 1259.989289] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.059963] trim_completed: ATA_CMD_DSM took 152713730 cycles
[ 1260.211066] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.257474] trim_completed: ATA_CMD_DSM took 100279998 cycles
[ 1260.306277] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.417770] trim_completed: ATA_CMD_DSM took 240932835 cycles
[ 1260.464049] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.575418] trim_completed: ATA_CMD_DSM took 240673134 cycles
[ 1260.650624] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.763510] trim_completed: ATA_CMD_DSM took 243952865 cycles
[ 1260.810454] ata_qc_issue: ATA_CMD_DSM starting
[ 1260.921433] trim_completed: ATA_CMD_DSM took 239832996 cycles

 2回目以降のTRIMは100ミリ秒オーダの時間がかかることが分かります。また彼は、この結果は、たった1つのファイル削除処理でも、ファイルが複数のエクステントから構成されている場合は同様の時間がかかることを意味する、と付け足しました。

 このため、TRIMコマンドサポートをATAドライバに追加するMatthewオリジナルのパッチを適用すると、あっという間に、システムが耐えられない速度まで性能が劣化したそうです。

 また、所要時間はTRIMの発行数に比例するが、1つのTRIMで消すサイズにはほとんど比例しないそうです。彼によると「rm -rf /usr/src/linux」はTRIMで30分以上(!)もの時間を費やすけれど、50GB+のシングルエクステントは消去するのに数秒しかかからなかったとのこと。

 これらのことから、VertexのTRIM対応とは、

  • TRIMコマンドをトリガに、内部的にGC(ガベージコレクション)に似た動作を開始する
  • 最初の1回はGCのバックグラウンド実行を開始して、すぐさまホストにTRIM完了を返信する
  • 2回目以降は何らかの理由により同期的に完了を待ってしまうので、とてつもなく遅くなってしまう

という動作であると推測されています。

 いい方を変えると、VertexのTRIMにはある種の最適化の痕跡が見受けられるが、少なくともLinuxのdiscardとの組み合わせにおいてはそれはまったく役に立っておらず(Linuxのほとんどのファイルは複数のエクステントから構成されます)、通常のファイル操作でも、あっという間に耐えられないほどの応答性劣化を引き起こします。

 Vertexが複数のTRIMコマンドに弱過ぎることから、Windowsの仕様について疑問が上がりましたが、Markはあるベンダから聞いた話として、Windows 7におけるTRIMの挙動について以下のようになっていると説明しました。

  • TRIMコマンドを送信するケースの例
    - パーティションの3分の2以上を使用した状態でファイルを(本当に)削除する
    - ゴミ箱を空にする
    - パーティションを削除する

  • TRIMコマンドを送信しないケース
    - ファイルをゴミ箱に移動する
    - パーティションをフォーマットする(たとえフルフォーマットでも)
    - 空のパーティションを削除する

 つまり、Linuxの現在の仕様とほとんど変わりません。

 Markは、これらの経験から、TRIMをバッファリングしてバッチ実行することを強く支持します。Chris Worleyが、「えー、そんなおばかドライブを前提にするなんておかしいよ。OSはそんな変な仮定を置くべきじゃないよ」と不平を告げると、すぐさま「Welcome to the Real World」と一蹴、まったく譲りません。

 結局、このスレッドはMatthewがほとんど返信を返さなかったこともあり、結論が出ないまま議論が流れてしまいました。Markのメールはどれも、数字に裏打ちされた根拠のあるものでしたが、あまりにも数字が劇的過ぎて、周囲が「そんな変なデバイスに振り回されたくない……」とドン引きしていってしまい、説得し切ることができなかったように思います。

 ここからは筆者の推測になりますし、Matthewが沈黙を守ったので確かなことは分からないのですが、Intel(現在、MatthewはIntel所属です)のSSDのTRIMサポートは、以前考えていたよりも順調ではないのではないかと思います。そのため、以前の構想をほごにして、ソフトウェア側でSSD特有の遅延を隠ぺいする必要が出てきたのではないでしょうか。しかし、いま強引にパッチをマージしようとすると「Intelスペシャル対応、反対」の声が大き過ぎるので、Intel以外のTRIM対応SSDがいくつか市場に出てくるのを待っている……そんなところではないかと推測しています。

 SSDベンダの新製品発売やファームウェアのアップデートが過熱すると予想されるWindows 7の発売前後になると、議論の第2ラウンドが始まるんじゃないでしょうか。そんなわけで今後も、SSDの動向からは目を離せそうにありません。

注4:エクステントとはファイルシステムかいわいからきた用語で、連続LBAを持つ複数のブロックのことです。多くのATAコマンドが開始LBAとセクタ数のペアを使うので、連続しているということが大きな意味を持ちます。

少年よ大志を抱け!

 8月にIPAの主催で開催された「セキュリティ&プログラミングキャンプ2009」ですが、Linuxカーネル組は豊作で、参加者の中から3人がLKMLにデビューしました。

 Tatsuhiro Aoshimaは/procの拡張に着手し、Linux Kernel Podcast(注5)でも注目パッチとして取り上げられています。Ryusei YamaguchiはNFSのレースコンディションのバグを修正し、ついでにBKL(Big Kernel Lock)を減らしたので、メンテナから賞賛を浴びました。このパッチは2.6.32でのマージがほぼ確定しています。

 またHiroaki Wakabayashiは、mlock()処理中もSIGKILLでプロセスが終了できるように拡張し、従来は死ぬまでに数分かかることも珍しくなかったmlock()中のプロセス終了が瞬時に終わるようにする改善を提案しました。現在、これもマージする方向で調整中です。

 Linuxもデベロッパの平均年齢が年々上昇傾向にあるといわれているので、若者の参入はうれしいですね。

注5:http://www.kernelpodcast.org/2009/08/18/20090816-linux-kernel-podcast/

関連記事:
学生の未来に期待する夏(@IT Security&Trust)
「実践的であれ」――伊藤直也氏から学生への言葉(@IT 自分戦略研究所)

2/2

Index
Linux Kernel Watch 8月版
 SSDをめぐる議論に浮かび上がるベンダ模様
  Page 1
 混迷深めるdiscardリクエスト
Page 2
 少年よ大志を抱け!

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間