2013/01/25

Adaptive Formatting

現在のHDDの物理的フォーマットに関する基礎資料である、Adaptive Formattingのホワイトペーパーが(Western Digitalの一部門となった)HGSTのサイトから消えていたので、記録の意味を兼ねて再読してみる。

1. 背景


現在のHDDは各プラッタの各記録面の各ゾーンによって記録密度が違うことを説明した、たぶん唯一の公開資料としてHGSTの「Adaptive Formatting in Hitachi Drives」(Adaptive_Format_WP.pdf)があった(他には特許情報が見つかるぐらい)。作成時期は内容から見てIBMの一部門だったときで、元のタイトルは違っていただろうと思うが、記録がない。

特許の出願が1998年5月で、公開が2000年10月、製品化された最初期のシリーズであるTravelstar 5K80の発表が2003年3月なので、時期的にはやや昔話に属する。

で、このAdaptive FormattingがなければHDDの性能上の個体差も基本的にはないし、記録面の仮説もそもそも出てこなかった、という重要な資料だが、内容は1ページ半に収まる短いもの。この関係の話の最初でも取り上げたことがある。

2. 内容


まず技術的背景として、HDDの容量拡大はヘッドの性能と部品公差(head performance and component tolerances)に制約されており、部品のばらつきを許容しつつ、面記録密度(areal density)を増加させるには新しいアプローチが必要になったとする。

従来はHDDの容量に応じて、ヘッドをその性能により選別して使用してきたが、これが生産工程の複雑化に繋がり、生産量を計画するのを難しくしていた。
(注)HGAとはHead Gimbal Assembly(アームの先に付いた、ヘッドとその支持機構が一体となった部品)のことだと思う。

そこで新しいアプローチとして、生産工程にAdaptive Formattingを導入した。これにより各HDDは、その特定のHDDに使用されたヘッドとメディア(プラッタ)に適合するよう工場において個別に調整される(indivisually tuned)。メディアの記録面は、それと対になったヘッドの性能特性に応じて、最適の線記録密度とトラック密度の組み合わせ(an optimized Bits Per Inch / Tracks Per Inch (BPI/TPI) combination)となるようフォーマットされる。

これは特定のヘッドとメディアの組み合わせにおける信頼性と性能の向上に繋がり、Fixed FormattingのHDDで起こり得るような、ぎりぎりの性能のヘッド(marginal heads)が使用される可能性が排除される。

ここまでのとおり、根本的な問題はヘッドの性能にばらつきがあることで、従来のFixed Formattingではヘッドを選別することで対応してきたが、それも生産上大変なので、各ヘッドの性能に応じて記録密度を柔軟に変更することで対応することにした、というのがAdaptive Formattingということになる。これで生産も楽になるし、信頼性も上がって一挙両得だと、そういう話。

それでHDDの性能的にどうなるかというと、従来のFixed FormattingであるTravelstar 40GNXと、Adaptive FormattingであるTravelstar 5K80をH2Benchというベンチマークで比較した図がある。

これが下図。青線が40GNXで、ぎざぎざの赤線が5K80。

この曲線における異なる転送速度の点は、HDD中にある複数のヘッドのうち、特定のヘッドの挙動を示す。Adaptive Formattingを使用すると、線記録密度は各ヘッド/ディスクによって変わり得て、これがドライブ間とヘッド間の両方のばらつきを生み出す。異なる線記録密度は、各ヘッドによって異なる転送速度に変換される。各計測点における速度は、どのヘッドが使用されるかに依存する。

このグラフのサンプリングレートは各ゾーンに多数の点を描くに足るもので、各ヘッドによる線記録密度に依存した転送速度が、各ゾーン中におよそ10回から20回表示されている。これにより、Adaptive FormattingのHDDではグラフが毛羽立って見えること("fuzzy" look)が説明される。

以上だが、ある時期からHGSTのHDDがHD Tuneでぎざぎざのグラフを描くようになって、当時はその理由が分からず、ただそういうものだと理解していたが、今にして思えばFixed FormattingからAdaptive Formattingへの切り替わりの時期だったのだと思う。

しかし改めて読んでみると、このぎざぎざの各点が各ヘッドにおける速度を示すということは、つまりは記録面の仮説と同じということで、したがって答えは初めから示されていたことになる。すごい大回りをした気がするが、一周回ってきたからこそ理解できるようになった、ということでよしとするかな。

2012/12/29

High DPI Cursor Changer

High DPI Windows 8 Cursor Setで作成したカーソルファイルの導入と設定を自動化するツールとして、High DPI Cursor Changerを作成しました。Windows 8でDPIを200%以上に上げたときにカーソルの輪郭が汚くなる問題に対応するものです。

DPIを200%にしたときの見た目はこんな感じです。標準のカーソルに似せていますが、全てスクラッチで、個人的に気になった点は変えたりもしているので、微妙に違いがあります。

現状、DPIを200%以上にしている人は少ないかもしれませんが、おいおい需要が増えてくるものと予想して。

プロジェクトサイト: High DPI Cursor Changer 英語 / 日本語 at SourceForge.net
実行ファイル from SourceForge.net

2012/12/21

ReadyNASにSSD

大容量SSDの価格低下もそこそこ進んでいるので、先々はNASにもSSDを入れることを考えて、ReadyNAS Ultra 2にIntel X25-M G1を入れてみるテスト。

1. SMART


HDDと入れ替えると、HDDと同様にRAIDiatorがインストールされて(X-RAID2を指定)普通に起動。FrontViewからSSDの情報も見られる。
Intel X25-M in FrontView

温度は1C/33Fと出ているが、RAIDar Protocolで返ってくるのを見ると-1C/31Fで、食い違っていた。

ここからSMARTも一応表示される。
Intel X25-M SMART in FrontView

が、この中に温度はない。また、寿命に関係するAvailable Reserved SpaceとMedia Wearout Indicatorは項目には出ているが、正しい値は取れてない。

このSMARTはPCに接続してCrystalDiskInfo、SSD Toolbox、Smartmotoolsで見たときには、それぞれこんな感じ。
Intel X25-M SMART by CrystalDiskInfo
Intel X25-M SMART by SSD Toolbox
Intel X25-M SMART by Smartmontools

温度


先に温度について考えると、一見して明らかなように、このSSDはSMARTのデータに温度(IDは16進数でC2、10進数で194)を含んでいない。SSDの中には0Cと返すものもあるようだが、このSSDはそもそも温度のデータを返さない。

したがって、ReadyNASが示す1C/33Fあるいは-1C/31Fはダミーの数字で、それもたぶん-1C/31Fの方が本来の数字で(コードの世界では該当するものが存在しないときに-1を返したりする)、その摂氏のマイナス符号を認識し損ねて1Cと取った上で華氏をそれに合わせて計算したのが1C/33Fではないか、という気がする。

寿命


意外だったのはReadyNASがIntelのSSDに特有のAvailable Reserved Space(E8)とMedia Wearout Indicator(E9)を認識したことで、このIDが示すもののデータを持っていなければこの名前は出てこないはず……。

と、ReadyNASではたぶん字数を減らすために「e」を抜いて「Available Reservd Space」となっているが、上にある「Reallocated Sector Count」は字数が多いにもかかわらずそのままで、少し不自然。一方、この「Available Reservd Space」はSmartmontoolsの表記と同じで、「Intel Internal」も同じ。ということから、ReadyNASは標準的な項目以外はSmartmontoolsと同じデータを利用しているのではないか、という推測を立て得る。

それはともかくとして、値の方は出してくるものを間違えていて、意味を成してないわけだが。この当たり、各ベンダー独自の仕様に合わせてデータを処理するようにしないと意味のある数字は拾い出せない、という当然のことを示している。

2. 評価


NASの動作としてはごく普通で、スピンダウン時でもスピンアップを待つことなくすぐにアクセスできる(SSDの場合にスピンダウンが実際にどう動いているのかは未確認)。

という意味で普通に使う分には問題なさそうだが、SMARTの監視は実質的にできず、各ベンダーの仕様がばらばらである限り、NAS側の対応もなかなか進まないような気がするので(add-onでも出てくれば別だが)、SSDの状態が気になるなら時々外してPCに接続してチェックするしかないと思う。

[追記1]

そういえばSmartmontoolsはたいていのLinuxディストリビューションに含まれている……ことを思い出して、ReadyNASのSSHアクセスを有効にしてログインすると、しっかりRAIDiatorにも入っていた。

これでSMARTを見てみると、PCとの接続時と同じように表示される。
Intel X25-M SMART by Smartmontools on RAIDiator (Linux) through SSH

したがって、ReadyNASに入れたままでも、これで定期的にチェックするようにすればSMARTの値を監視できることになる。

以上、後はしいて言えばTrimがどうなるかという点を除けば、ReadyNASでSSDを使う上での障害は実質的になさそうということが分かった。

[追記2]

WindowsのクライアントPCからSMARTの値をチェックするためのスクリプトを書いてみた。PuTTYを使ってSSHアクセスし、smartctlを実行して、結果からSMARTの目的の項目を拾い出してCSV形式で保存する。

手順としては、
  1. ReadyNASに「Enable Root SSH Access」Add-onをインストールしてSSHアクセスを可能にする。
  2. PuTTYをダウンロードして適当なフォルダーに置く。使うのはコマンドライン用のPLINK.EXE。
  3. 以下の内容のバッチファイルを作成して、ファイル名はここでは「smartctl.bat」として同じフォルダーに保存する。
    plink nas-XX-XX-XX -l root -pw netgear1 ^
     "smartctl -A -f brief /dev/sda" > result.txt
    
    • nas-XX-XX-XXはReadyNASのホスト名かIPアドレス
    • -pwの後ろは管理者パスワード
    • /dev/sdaは1番目のディスクの意味

  4. 以下の内容のVBScriptを作成して、ファイル名はここでは「checksmart.vbs」として同じフォルダーに保存する。ATTRIBUTESで目的の項目を指定。
    Option Explicit
    
    Dim FILE_BAT 'Batch file to execute smartctl through SSH
    Dim FILE_RLT 'File to store result of smartctl temporarily
    Dim FILE_RCD 'File to record (append) result of smartctl
    FILE_BAT = "smartctl.bat"
    FILE_RLT = "result.txt" 'Must be the same file in batch file
    FILE_RCD = "record.csv"
    
    Dim ATTRIBUTES 'SMART attributes (separated by space)
    ATTRIBUTES = "Available_Reservd_Space Media_Wearout_Indicator"
    
    'Execute smartctl through SSH
    Dim objShell
    Set objShell = WScript.CreateObject("WScript.Shell")
    Dim result 'Return value to avoid error in using Run method
    result = objShell.Run(FILE_BAT, 0, True)
    Set objShell = Nothing
    
    'Process result of smartctl
    Dim strBuf
    
    Dim objFSO
    Dim objFile
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(FILE_RLT)
    strBuf = objFile.ReadAll
    Set objFile = Nothing
    Set objFSO = Nothing
    
    Dim strLines
    strLines = Split(strBuf, vbLf)
    
    Dim strSer 'Array to hold names of attributes
    strSer = Split(ATTRIBUTES)
    
    Dim strVal 'Array to hold values of attributes
    ReDim strVal(UBound(strSer))
    
    Dim objRegExp
    Set objRegExp = New RegExp
    objRegExp.Pattern = " \d{3} " 'Pattern of value of attributes
    objRegExp.IgnoreCase = True
    objRegExp.Global = True
    Dim i
    Dim j
    For i = 0 To UBound(strLines)
        For j = 0 To UBound(strSer)
            If 0 < InStr(1, strLines(i), strSer(j), 1) Then
                Dim objMatches
                Set objMatches = objRegExp.Execute(strLines(i))
                If 0 < objMatches.Count Then
                    strVal(j) = objMatches(0).Value
                End If
                Set objMatches = Nothing
            End If
        Next
    Next
    Set objRegExp = Nothing
    
    'Record result of smartctl
    Dim strRec
    strRec = Now() & ","
    For j = 0 To UBound(strVal)
        strRec = strRec & Trim(strVal(j)) & ","
    Next
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    If Not objFSO.FileExists(FILE_RCD) Then
        'If first record, add header line
        strRec = "Date," & Join(strSer, ",") & "," & vbCrLf & strRec
    End If
    Set objFile = objFSO.OpenTextFile(FILE_RCD, 8, True)
    objFile.Write(strRec & vbCrLf)
    Set objFile = Nothing
    Set objFSO = Nothing
    
    (smartctl.batの内容をFILE_BATの部分に直接書いても良さそうなものだが、そうするとなぜかrecord.txtがホスト側に作成されてしまうので、分けた。)
これで、このchecksmart.vbsを定期的に実行するように設定すれば、結果がCSVファイルに記録されていく。