HDDの基本性能を測定してみた

OSのインストールの前に時間的な余裕があるのでHDDの基本性能を測定してみた。
HDDの初期不良チェックのために、全セクタの読み込み・書き出しテストを行った。Linuxでは次のようなコマンド簡単に実効できる。

# dd if=/dev/sdc of=/dev/null bs=1G
2794+1 records in
2794+1 records out
3000592982016 bytes (3.0 TB) copied, 17922.9 s, 167 MB/s

# dd if=/dev/zero of=/dev/sdc bs=1G
dd: writing `/dev/sda': No space left on device
2794+1 records in
2793+1 records out
3000592982016 bytes (3.0 TB) copied, 18065.2 s, 166 MB/s

これはSeagate ST3000DM001の例だが、これを見ると3TBの読み書きには18000秒(今回はきっかり5時間!)かかり、“平均的な”読み書きの速度は166MB/sということがわかる。

このデータを取っておくだけでもイメージバックアップの際の作業時間の見積りに役立つ。しかし、ここで疑問が出てくる。HDDは外側と内側でデータ伝送速度時間が変わってくる(⇒ハードディスク・ドライブの内部構造)。そこで、どの様に変わるのか、10分毎にddコマンドの進捗状況を表示させてみた。

# dd if=/dev/zero of=/dev/sdc bs=1G
118+0 records in
117+0 records out
125627793408 bytes (126 GB) copied, 603.364 s, 208 MB/s

237+0 records in
236+0 records out
253403070464 bytes (253 GB) copied, 1201.76 s, 211 MB/s

356+0 records in
355+0 records out
381178347520 bytes (381 GB) copied, 1803.86 s, 211 MB/s

	:省略

2686+0 records in
2685+0 records out
2882996797440 bytes (2.9 TB) copied, 16809.3 s, 172 MB/s

2746+0 records in
2745+0 records out
2947421306880 bytes (2.9 TB) copied, 17406.1 s, 169 MB/s

2794+1 records in
2794+1 records out
3000592982016 bytes (3.0 TB) copied, 17922.9 s, 167 MB/s

HDDの最外周は200MB/sを超えている。ST3000DM001のデータ・シートでは“最大データ転送速度”は210MB/sとなっているのでほぼスペックどおりの性能が出ていることになる。また、データ・シートでは“平均データ転送速度”は156MB/sとなっているので計測した166MB/sは6パーセント程度の誤差に収まっている。
でも、このデータを見ていると更に疑問が出てくる。最高は210MB/s、平均は166MB/s、では最低はどれ位? ということで、HDDを55のエリアに分けて、各エリアで50GBのデータ読み書きをしてみた。

dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=0
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 263.65 s, 204 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=0 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 267.476 s, 201 MB/s



dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=50
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 251.751 s, 213 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=50 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 255.757 s, 210 MB/s

	:省略

dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=2692
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 497.485 s, 108 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=2692 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 504.389 s, 106 MB/s



dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=2743
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 530.178 s, 101 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=2743 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 536.856 s, 100 MB/s

どうもHDDの内側における最低転送速度は100MB/sとなる。外側の最速値の約半分の速度しか出ないことになる。(平均が156MB/sであれば、こんなものだろう。もっとも線形に変化している訳ではないが。)
これをグラフににしたのが次の画像である:

こうしたデータを取っておくことで、パーティション計画などにも役立てることができる。転送速度を基準にパーティションを切る境界を決め、外側の速い方は仮想ディスクのデータストア用、内側の遅い方は文書ファイルやアーカイブ用などといった具合に。(今回もこのデータを元に全体の10%の外側部分とそれ以外の部分でパーティションを分けることにした。)I

ついでにバックアップ用として買っておいたHGSTのHDS723030ALA640(通称 0S03088)の測定値は次のようになる。

両方の測定結果を1つのグラフにまとめると次のようになる。

さて、こうやって見るとやたら速いように見えるSeagate ST3000DM001だが、速いのは上の計測で行ったようなシーケンシャルアクセスの時だけで、ランダムアクセスになると余り高いスコアにならないようだ(⇒ Seagate Barracuda 3TB Review)。通常のPCで使う環境ではむしろST3000DM001は遅くなる可能性が高い。シーケンシャル・アクセスが速いのは単に円盤(プラッタ)の記録密度が高いからだと考える。プラッタ1枚辺りの容量はSeagate ST3000DM00が1TB、HGST HDS723030ALA640では600GBと半分、とまでは行かないが結構異なる。(Western DigitalのWD30EZRXは750GB。)シーケンシャルアクセスは記録密度の高い方が有利だが、ランダムアクセスはヘッド制御など、その他の要因が影響するから、各社の特徴がでてくるようだ。

あとインタフェース速度について。Seagate ST3000DM001の最高時の210MB/sはSATAの速度に換算すれば2.1Gbpsである。このHDDは一応、6.0GbpsのSATA I/Fを持っているが、そんな速度は必要ないことがわかる。3.0GbpsのSATAポートに接続しても十分最高性能を出せる。まぁ、製品として6.0Gbpsに対応していないと、比較表などで並べられた時に見劣りするから仕方ないのだろうし、SATA I/Fチップも6.0Gbps対応になっているだろうから、選択の余地はないのかも知れないが。今回使うMoBoASUS P8H77-Iには2つの6.0Gbps SATAポートと4つの3.0Gbps SATAポートがある。必然、ST3000DM001は3.0Gbpsポートの方に接続して、6.0Gbpsポートの方はSDDに接続する。実は上の測定も6.0Gbpsポートではなく3.0Gbpsポートを使って行った結果だ。

じつは、5年前程にノートPCを使った簡単な実験をしていた(⇒HDDの外側と内側)。当時はカタログスペック値150MB/sの2.5インチHDDに対して35MB/s程度の性能しか測定できなかったと書いた。しかし、改めて読んでみると、150MB/sと言うのはどうもインタフェース転送速度のSATA 1.5Gbpsを指しているようだ。実際のデータ伝送速度は5,400rpm、63セクタ/トラック@Zone0、16論理ヘッダから計算して371Mbpsで8bit/10bitエンコードとして37MB/s程度ではないだろうか。実測で35MB/s出ればいい方だろう。各社、HDDの性能に関するデータの記述はまちまちで、インタフェース速度をあたかもアクセス速度の様に表現したり、外周部の最高速度だけを表示したり、色々だが、Seagateのように平均伝送速度を明記しているのは良心的だと思う。

自作PCの構築手順

自作PCの構築手順をまとめておく。パーツの初期不良(=購入時点での不良品、DOA、Dead On Arrival)が無いかを確かめるために、1つ1つ手順を確認しながら組み立てて行く必要があり、無計画にパーツを買い集めると後で後悔することになる。

  • 筐体と電源ユニットを買っておく

筐体は納期が長い物もあり、ショップで衝動買いするのでなければ、気に入った筐体を予め通販でオーダーして取り寄せておく。電源ユニットも初期不良が少ないパーツなので先に取り寄せておく。これらのパーツが遅れて、通電するのが遅れて、初期不良保証期間が過ぎちゃった、ということがないように。

  • メモリテスト用の起動CDやUSBを作成しておく。

電源を入れてBIOS動作の確認後、最初に行うのはメモリテストになるので別のPCを使って予めメディアを用意しておく。Linuxの場合は、LiveCDやインストールCDで立ち上げるとメモリテストを実行できるし、UbuntuなどではLiveCDで作成した起動用USBからもメモリテストを走らせることができる。私はネットワーク・ブートを使ってネットワーク経由でメモリテストを起動するので、これは省略している。

  • MoBo、CPU、メモリ、CPUクーラーを買う。

これらのパーツは一気に買う。出来ればショップで相談して部品の干渉とか無いか、組合せに矛盾がないかを確認しておく。これらの部品は何かあった時のために同じショップで買い揃えておいた方がいい。場合によっては持ち込んで状況確認してもらうこともあり得る。またメモリの相性保証を付けておく方がいい。確かにMoBoとの相性もあるのだが、メモリの初期不良のためでもある。以前、メモリの初期不良に出くわし、メモリテストの結果を証拠として写真に撮ってショップに持っていったが、確認のために半日位テストしなければならず、ショップでのテストが通ってしまうと交換にはお応じられないと言われた。でも幸い、相性保証を付けていたので相性問題ということでスンナリ交換してもらった。(ただ、元のメモリは不良品ではなく、商品としてまた棚に戻されるのを見ているので、以降、そのショップではパーツは買わないことにしている。)

  • MoBoにCPU、CPUクーラー、メモリを取り付ける。

PCとして動作する最低限のパーツ、CPU、CPUクーラー、メモリを取り付けて、パーツ相互に干渉がないか確認する。今回、CPUクーラーが大きくて、CPUクーラーを取り付けた後だと、メモリを取り付けることが出来なかった。仕方ないので、一旦、CPUクーラーを取り外してからメモリを取り付け、再度CPUクーラーを取り付けている。取り付け後の干渉はない。

  • 電源を接続して通電する。

筐体に入れる前に、新聞紙の上などにMoBoを置いて通電してみる。勿論、キーボードやディスプレも接続しておく。まず、BIOSが起動するか、BIOSの設定(CPUやメモリの認識)は正しいかを確認する。上手く起動せず原因が分からない場合は、これらのパーツを取り付けた状態でショップに持ち込み見てもらうという手もある。
また、BIOSのバージョンも確認しておこう。MoBoが新製品の場合、BIOSのバージョンは頻繁にアップするので、出来る限り最新のものにしておく。最近のBIOSはWebからUSBメモリにダウンロードして、それをMoBoに挿して起動するするとアップデートできるようになっているので簡単だ。

  • 筐体にMoBo、電源を取り付け配線する。

MoBoと電源ユニットを筐体に取り付け、干渉が無いかを確認する。もっとも、この段階で干渉が見つかってもパーツを変更するしかないが。電源スイッチなどを配線し、電源ケーブルの取り回しなどを確認する。なお、これは仮取り付けということで、ネジなどは軽く締め付ける程度にしておく。DVDやBLドライブを接続する場合は、これらも取り付けてみて、干渉を確認しておく。組合せによってはMoBoとドライブが当たるということもあり、ビニールテープなどで保護する必要もある。

  • 電源を入れて、メモリテストを実行する。

MoBoが裸の状態で長時間通電するのは危険なので、筐体に入れてからメモリテストを実施する。私はMemtest86+を使っている。プログラムを起動して、メモリの認識や設定に間違いないかを確認して、1日程度テストプログラムを走らせておく(今回は16GBのメモリで1回約3時間かかる)。以前のメモリの初期不良ではこの段階で、特定のアドレスが書き込みエラーとなっていた(書き込んだデータと読み出したデータが合わないビットがあった)。このテストをやらずに行き成りOSを動かしても、不具合の原因の特定が困難だったり、保障期間が過ぎてから分かったりすることになってしまうので、じっくりとテストしておきたい。
今回の場合はこんな感じ。

      Memtest86+ v4.20
Intel Core Gen2 2500 MHz
L1 Cache:   32K  83335 MB/s
L2 Cache:  256K  37879 MB/s
L3 Cache: 8192K  28409 MB/s
Memory  :   16G  17482 MB/s
IMC:         Intel(R) Core(TM) i7-3770T CPU @ 2.50GHz  / BCLK : 100 MHz
Settings: RAM : 800 MHz (DDR3-1600) / CAS : 11-11-11-28  / Dual Channel

WallTime    Cached  RsvdMem   MemMap   Cache  ECC  Test  Pass  Errors ECC Errs
---------   ------  -------  --------  -----  ---  ----  ----  ------ --------
 15:00:00      16G    2780K    e820      on   off   std     5       0
------------------------------------------------------------------------------
  • HDDを買って来てテストする。

メモリのテストが終わってからHDDを買ってきて取り付ける。私の場合は、Linux(具体的にはUbuntu)をLiveCDなどで起動してHDDのテストを行う。Live CDに不慣れな場合やWindows環境しかない場合は、一時的にHDDを他の稼働中のPCに接続して試験するのが簡単だろう。なお、UbuntuのLive CDを使う場合は起動後、smartユーティリティをインストールしておく。

$ sudo -s
# apt-get install smartmontools

OSをインストールする前にHDDを徹底的にテストしておく。最初にやらなければならないは、S.M.A.R.Tの情報の読み出しとSMARTのロング・セルフテストである。まず、SMARTの最初の情報を取得しておく。

# smartctl -a /dev/sda > smart.log
# cat smart.log
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-26-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     ST3000DM001-9YN166
Serial Number:    W1FXXXXX
LU WWN Device Id: 5 abcdef 012345678
Firmware Version: CC4B
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Thu Jul 21 08:53:33 2012 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

	:省略

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   100   100   006    Pre-fail  Always       -       15776
  3 Spin_Up_Time            0x0003   094   094   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       6
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   100   253   030    Pre-fail  Always       -       36
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       0
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       6
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   253   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   067   067   045    Old_age   Always       -       33 (Min/Max 31/33)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       5
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       6
194 Temperature_Celsius     0x0022   033   040   000    Old_age   Always       -       33 (0 27 0 0)
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   253   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       47098611367936
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       0
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       1616

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]


SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

この状態で既にErrorが発生していたり、異常な値があれば、交換してもらう。なお、上の例では“Head_Flying_Hours”が非常に大きな値になっているが、これは“生値”でSeagateの場合には実際のヘッドの稼働時間以外の情報も上位バイトに含まれており、“2AD6 0000 0000”を10進数で表しているので、下位バイトはゼロであり、実際に稼働時間はまだゼロ時間ということで正常値だ。このように“生値”はメーカーによって値が違うので、この値が大きいからと言って騒ぐと恥ずかしいことになってしまう。最悪値(WORST)が閾値(THRESH)以下になっていなければ一応はOK。

ここで、ファームのバージョンも確認しておく。今回買ったSeagateのHDDはメーカーのホームページに最新ファームが載っている。もし、購入したHDDが最新ファームでなければ、直ぐに最新ファームに変更する。上の例は“CC4B”で最新ファームは“CC4H”だったので、このあと直ぐにファームを書き換えた。(しかし、IBM/日立や東芝といったHDDを使って来た私としてはユーザによるHDDのファームアップなんて信じられない話だが。)SeagateのST3000DM001は海外ではトラブルが多いようなので、速攻で最新ファームに上げておいた。

SMARTの初期値を確認したら次にSMARTのロング・セルフテストを実施する。

# smartctl -t long /dev/sda

3TBのHDDで約5時間かかる。気長に待とう。(セルフテスト中にHDDを使うこともできるがセルフテストを少しでも早く終わらせるためには、無負荷の状態で実行する方がいい。)なお、セルフテストは終わっても何もメッセージを出してくれないので、適当な間隔で“smartctl -a”で進行状況と結果を確認する。

# smartctl -a /dev/sda
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.2.0-26-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     ST3000DM001-9YN166
Serial Number:    W1FXXXXX
LU WWN Device Id: 5 abcdef 012345678
Firmware Version: CC4H

	:省略

Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.

	:省略

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%         5         -

	:省略

もし、ここでエラーが記録されたら直ぐに交換してもらおう。
SMARTのセルフテストがパスしたら、次に念のためOSからHDDの全セクタの読み出しと書き込みを実行する。

# dd if=/dev/sda of=/dev/null bs=1G && dd if=/dev/zero of=/dev/sda bs=1G

HDDにもよるが読み出しと書き込みを合わせて10時間程度掛かるので、セルフテストも含めると1日作業となる。

なお、この試験を実行する前にHDDの内容を見てみたが、SeagateのST3000DM001では最初の10GBは“ゼロ”で埋まっていたが、それ以降はランダムぽいデータが入っていた。最初は“中古品”を売りつけられたのか、と思ったがSMARTの情報を見る限りはその形跡はない。どうも、出荷検査を最初の10GBしかやっていないのではないか、と思われる。日立のHDDは新品でも頭の天辺から足のつま先まで綺麗に“ゼロ”になっているのだが....。やはり、その辺が品質にも表れるのだろう。

余談だが、HDDはメカニカルな構造を持っているので初期テストはしっかりやっておいた方が良いが、SSDは別だ。電子回路だけで構成されるSSDは精々SMARTの確認程度で良いだろう。逆に全セクタの書き込みテストなどは厳禁だ。

  • OSをインストールする。

ここまでメモリ、HDDをテストしておけば初期不良でトラブルになる可能性は極めて少なくなるので、配線を再確認しつつ、ネジを増し締めしてハードウェアとしては完成となる。あとはいつもの通りOSのインストールとなる。

新サーバの構成

CPU Intel Core i7 3770T 2.6GHz
Memory 16GB DDR3 1600
MoBo ASUS P8H77-I
HDD Seagate ST3000DM001 (3TB) x2 (Software RAID1 3TB)
  Intel SSDSC2CT060A3 (60GB)
OS Ubuntu 12.04 LTS server amd64
Chassis LIAN-LI PC-Q25B
PSU 玄人志向 KRPW-PT500W

CPU:
瞬間的なTurbo Boostを別にすれば2.6GHzで若干は非力だが、他の複数のPCやデバイスに対するファイルサーバ(NFS/CIFS)、ディスクサーバ(iSCSI)が主な役割なので十分だろう。(スレッド単位で見ればIO待ちが多くなるので)単一コアの性能よりは複数マルチスレッドによる負荷分散を目指す。また常時稼働という性質から消費電力を抑えたいので、結論としてはCore i7 3770Tとなる。

Memory:
時価で安いものということでCentury製のメモリとなった。CAS Latencyが11と若干遅いが、どちらかと言えばメモリはキャッシュとしての役割で、がんがんメモリ操作をするような演算はしないので、これでOK。

MoBo
Mother Boardはコンパクトに組み上げるということでmini-ITXサイズのASUS P8H77-Iというボードを使う。前回のサーバもASUSのボードだったが、別にASUSファンということではない。P8H77-IはSATAインタフェースを6つ持っている。つまり、拡張ボード無しで最大で6台のHDDを接続できる。ファイルサーバにはもってこいのMoBoである。PCIeスロットが1つあるのでチーミング用のGiga NICを挿す予定。

HDD:
HDDはIBM!(前日立、現WD?)と決めているのだが、今回は価格重視でSeagateのST3000DM001とする。海外のフォーラムなど見ると使用してしばらくするとエラーを起こしたり認識不能となる不具合が結構多い様だが、日本では異音がする以外は殆んど話題になっていないようだ。RAID1構成で組むので、若干品質が悪いのは我慢しよう。
http://article.gmane.org/gmane.linux.raid/39284
http://forums.seagate.com/t5/Barracuda-XT-Barracuda-Barracuda/ANNOUNCEMENT-New-firmware-update-for-Barracuda-1TB-platter/td-p/162362
(元々RAIDの起源は、民生用の安価なHDDを使ってメインフレームディスクシステムと同等の品質と容量を確保しようというところから来ている。つまり品質の悪いHDDを組み合わせてダウンタイムの少ないシステムを構成しようというのだからST3000DM001でOK。)RAIDとは別にバックアップ用にもう1台必要なので、そちらはHGSTにしようと思う。
なお、新サーバではファイル共有用の大容量HDDとLinuxのroot FSのHDDは分けることにした。ルート・ファイルシステムは、適宜バックアップを取っていればRAID1で強化する必然性もないし、管理も楽になる。ルート・ファイルシステムを格納するのはSSDにして消費電力を抑えようと思う。GUIを含まないサーバ用のルート・ファイルシステムであれば8GBもあればお釣りが来るが、今時のSSDでそんな容量は無い。そこで、60GBのIntel SSDSC2CT060A3を使うことにした。60GBでも大きいので30GBのパーティションに分けて使う(残りの30GBは使わずにSDDの延命用にリザーブしておく)。

OS:
OSはLinuxをベースにしようと思うが、どれを使うか。現サーバはUbuntu 8.04を使っている。勝手知ったるUbunuが第一候補だが、海外のフォーラムを見ると、最新の12.04はPCが固まる(Perfect Freeze)らしく、マウスもキーボードも反応がなくなるようだ。
https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/993187
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/999910
ただ、調べて行くとUbuntuに限ったことではなくLinux 3.X系の問題らしい。サーバ用途で多く使われているOSのLinuxで信じられないことだが、どうも事実のようだ。安定して動かすと言えばCentOSになるが、最新の6.3で採用しているカーネルは2.6.32であり、SSDに対するTrimコマンドをサポートしているのは残念ながら2.6.33からなので、今回は使えない。Fedoraは人柱要素が強い上にサポート期間も短いので、長期で利用するには避けたい。
そうなるとやはりUbuntuが良いのだが、カーネルのバックポート・パッチが出るまで試験的に運用するしかなさそうだ。

Chassis:
筐体はLIAN-LI PC-Q25Bにしてみる。小型の筐体ながらホットスワップ3.5インチベイを5台分持ちファイルサーバ用としてはうってつけだ。更に筐体底部にHDDを3台程取付けられる。ここにSSDを設置することにする。筐体前面は電源ボタン以外は何もない。DVD/BLドライブもUSBコネクタも無い。DVD/BLドライブは必要ないので要らない(Linuxの場合、ISOファイルで入手すれば、マウントして使えるので)。USBに関してはUSB 3.0用のハブをそばに設置して置けば問題ないだろう。吸気口が少なく冷却が気になるが、CPUやGPUをガンガン使う訳でもないので大丈夫だろうと踏んでいる。
デザイン的には非常にスッキリしていて気に入っている。

PSU
電源ユニットには玄人志向のKRPW-PT500Wを使う。これを採用した理由は2つ。80PLUS PLATINUMの高効率性と奥行きが125mmと他の電源ユニットに比べてコンパクトであること。電源の効率性は低消費電力には結構効いてくる。ただ、今回の構成ではピーク時でも150W行くか行かないかなので、500Wだとオーバースペック気味である。電源は定格の半分程度の消費電力の時に最も効率が良く、それ以下だと効率が下がる傾向にあるので、本来であれば250W〜300Wの電源が理想的だ。しかし、300Wで80PLUS PLATINUMの製品がなく、玄人志向のホームページによれば負荷20%でも90%の効率がでるようなので、これにした。
また、LIAN-LIの筐体はコンパクトなので、通常の140mmの奥行の電源ユニットだと配線の取り回しが結構大変そうだ。ここで15mmの余裕があるのは非常に嬉しい。


以上のような構成でパーツを集めてみる。

サーバを新しくしようと思う

暫く家を空けていたのでブログもすっかりご無沙汰していたが久しぶりに再開しようと思う。というのも、改めて我が家のサーバを構築しようと思っているので、構築過程のメモ書きが必要になったからだ。

前回サーバを構築したのは2007年12月だから、もう4年半以上経っている。超安定稼働していてるのでサーバを新しくしようという動機がなかった。前回はVMware仮想マシンを動かすエンジンという機能を主軸としたため、複数の仮想ディスクを格納することを考慮して2TB(1TB×3によるRAID5)を搭載した。そのお蔭もあってHDDの容量も十分足りていたのだが、昨今、動画品質がフル・ハイビジョンになり、録画のファイルサイズも巨大化してきたので、そろそろ窮屈になってきた。現在、1.6TB程度を消費して、あと300GB程度の余力しか無くなってきた。サーバの構築と安定稼働までに数か月は見ておいた方が良いので、そろそろ構築を始めた方が良いだろう。

現在使っているサーバの主な仕様は以下の通り:

CPU Intel Core2 Duo E8600 3.33GHz
Memory 8GB DDR2 800
MoBo ASUS P5K-VM (Intel G33 Chipset)
HDD HITACHI HDT721010SLA360 (1TB) x3 (Software RAID5 2TB)
OS Ubuntu 8.04 LTS server amd64
VM VMware Server 2.0

と、ザッとこんなスペックだが、さすがに4年の歳月を感じさせる。実は数か月前にCore2 DuoからCore2 Quadにアップグレードしようと調べたら、既にCore2シリーズが販売中止になっていたことに初めて気づいた。

さて、どの様なサーバにしようか思案してみたのだけど、次のような概要にしようと考えている。

  • 仮想マシンエンジンの機能を分離して、大容量NASの機能をメインに考える。
  • とは言え、運用管理用に仮想マシンは必要なので、KVMを使って最小限の構成にする。
  • 他のマシンはディスクレスにしたいので、NFS/iSCSIによるブート機能を提供する。
  • OSは管理が簡単なLinuxを使う。管理はリモート(別室)からCLIしか使わないのでLinuxの方が簡単。それにGUI使わないのであればLinuxの方が圧倒的に軽い。
  • 前回と同様に消費電力を抑えた構成とする。
  • RAIDはSoftware Raid1として3TB以上の実用量を確保する。

という感じだ。

本当は、仮想マシンエンジンとしても使いたかったのだけど、使おうとしているVMwareが既にVMkernl専用ハイパーバイザしか出していないので、前回のようにLinuxの上に仮想環境を構築することはできない。そこで、仕方なく仮想マシン・エンジンは別のマシンとして独立させ、このサーバは主にストレージの提供、ネットワーク管理(ネームサーバとDHCPサーバ)機能、そしてその統合機能として他のマシンへのネットブート機能の提供をメインとして考える。

CPU:
ファイルサーバ機能だけであればCeleron程度のものでもよいのだが、複数のディスクレスに対してサーバ機能を提供するとなると、そこそこのネットワークのトラフィックをこなして、更にHDDとのIOもマルチプロセス/スレッドによるアクセスとなる。また、小規模だがKVMを使って仮想マシンを内部に持たせ、外出先からのアクセスサーバやWindows XPによる家事手伝いマシンを動かす予定。すなわち各スレッドにはそれ程の性能を必要としないが、スレッドの数が多い方が良いことになる。となるとCore i7によるハイパースレッディング 8Coreだろか。消費電力を考えれば3770Tということになる。

メモリ:
ファイルサーバとして使うのであれば16GBにしておこう。これらのメインメモリはHDDの大容量2次キャッシュ効果が期待できる。OSの先読みや遅延書き込みによりメインメモリをバッファとして利用できる。(ただし、遅延ん書き込みは突然のサーバのダウンによってデータが消失する可能性があるので注意が必要。でも、家の中でトランザクションするわけではないので、余り気にしない。)それに、今は16GBでも1万円そこそこで買えてしまう。数千円をケチって8GBで我慢する必要もない。

ストレージ構成:
今回はSoftware RAID1にする。前回はHDDの利用効率を考えてRAID5にしてしまったが、これが遅い。書き込み時にパリティを生成したりするオーバーヘッドがあるので遅くなる。RAIDカードを使う方法もあるが、安物では高性能CPUを使ったソフトRAIDよりも遅くなってしまう上に、障害時の普及に結構制限があったりする。実際に使いものになるのは数万円のクラスになるので、HDDが数台買えてしまう。だったら、速度低下が殆んどないソフトRAID1でOKということになる。
RAID10で6TBのファイルシステムも考えてみたがやめた。RAIDと言えども内容が壊れない保証はない。複数のHDDでストライピングして大容量化した場合、RAID自身が壊れた場合、全ての内容が読み出せなくなる可能性がある。そうした被害を局所化するためにも1ボリュームで大容量化するのではなく、ボリューム毎にマウントポイントを変えておく。それに個人ユースで1ファイルで3TBを超えることは先ず有り得ない。

ネットワーク:
ネットワークはギガビット2つによるチーミングにより帯域と可用性を確保する。これでネットワークがボトルネックになることは、まず無いと思う。

消費電力:
昨今の省エネのトレンドと、今後の電気料の値上げを考えると、出来る限り電気は喰わない方が良い。前回はCPUに低消費電力のE8600を採用したが、当時の技術ではそれでも65Wで、HDDを3台搭載していので、システムでは90W程度だったと記憶している。今回は、通用時(低負荷時)で50W以下を目指したい。


さて、こんな感じで構成を考えてみよう。

マルチタッチの特許

閑話。

先週、Appleにマルチタッチの特許が下りた。AppleファンのページやつぶやきではAndroidは終わったと狂喜乱舞の様相だ。でも、本当にそうなるのだろうか。

私は、今回の特許取得は確かにAppleにとって大きなアドバンテージだと考える。しかし、これは“一本”ではなく“技あり”程度のものではないだろうか。実際のビジネスを考えれば、携帯端末という製品を具現化するにはApple自身も他社の特許を必要とするところも多い。携帯端末の分野では競合しても、別の分野では依存しているケースもあるだろう。そうなると特許のクロスライセンスという形なってゆくのではないだろうか。

また、Appleが基本的な特許を出願中であることは以前から報道されていた。それを承知で多くの一流メーカーが後先を考えずにAndroidを採用してきたとは思えない。当然、特許を取得した場合の対応策も考えた上で採用してきただろう。でなければAndroidなど使えない。既に多くのユーザを抱えるキャリアやメーカーが「我社は今日でAndroid製品は止めます」とは言えない。無効申請を出す企業も出てくるだろう。

歴史的に見てもIBMXeroxなどは多くの基本特許を持ちながらも、それに対抗する競合企業があり、それら競合も市場の拡大と共に成長してきている。それにこの場合、Apple対その他企業の連合体、という構図になっているのも面白い。

まぁ、私としてはAndroidでもiOSでもどちらでも構わない派だし、別に製品を製造・販売している訳ではないのでAndroidでも構わない。

一つ言えるのは、この特許によって(他社の動向は別として)Apple自身は更に業績向上が見込めるようになったことだろう。しかし、今のところ株価の動きは冷静だ。

IS-04のマイナー・アップデート:その2


昨日付け(5月26日)でIS04のソフトウェアの更新がリリースされている。
au携帯電話「IS04」の「ソフトウェア更新」についてのお知らせ
来月の頭にはAndroid 2.2へのアップデートが控えているのに、何でこの時期に今更?と思ってKDDIのホームページを見たら、

今回のケータイアップデートは上記のCDMA1Xエリアでのデータ送受信機能の追加の他に、6月上旬以降に予定しております「Android2.2へのOSバージョンアップ実施」に必要な機能も追加いたします。よって、OSバージョンアップの際には今回のソフトウェア更新が完了済みであることが条件となります。

だって。つまり、昨日リリースされたソフトウェアに更新しておかないと来月2.2へもアップグレードできないらしい。どうも、2.2へのアップグレードへの準備をしていて、アップグレードに不足している機能がみつかったようだ。

これは、ソフトウェアの更新をしておいた方がいいな、と思った矢先、
IS04の「ケータイアップデート」停止について

本日、「ソフトウェア更新」を開始いたしましたIS04に関して、ケータイアップデートによる更新を実施した際に一部不具合の発生が確認されたため、ケータイアップデートを一時停止させていただきます。

アドレス帳のデータが消えてしまうらいいのだが。う〜ん、東芝さん(今は富士通か)も相当ヤキが回ったようだ。

どうせ、直ぐにRC4というソフトウェアがリリースされるだろうから、今回の更新はちょっと待った方が良いかも。

あら、大変な事になっている?

5月30日付けで、さらに悪い事態に。
IS04/IS06のソフトウェア更新の中止について

本日「パソコンを利用した更新」についても同様の不具合が発生する可能性があることが分かりましたので、「パソコンを利用した更新」についても一時停止させていただきます。

あらら、大丈夫かな。2.2へのアップデート遅れないといいけど。

Google Calendar Syncを使って快適Android環境

ガラケーからAndroid携帯(IS04)に切り替えてから、メールの転送経路や家のPCの環境も含めて色々と設定を変えて快適Android環境を構築している。

クラウド連携を前提としたAndroid携帯は確かに便利なのだが、個人的にはGoogleに全ての個人データを置きたくない、という気持ちもある。スケジュールに関してはネットワークに接続できない環境でも使えて、後でネット上のデータと同期がとれるGoogle Calendarは大変重宝する。でも、PC上にある全ての個人スケジュールをGoogle Calendarへ移行する気にはなれず、ごくプライベートなスケジュール(Outlookに保存)とビジネスなどで使うスケジュール(Google Calendarに保存)は分けておきたい。とは言ってもPCでスケジュールを確認する場合はネット上のスケジュール情報とPCのOutlookを1つの画面で管理してたい、と思っていた。

GoogleMicrosoft Outlookの予定表の内容とGoogle Calendarの内容を同期して相互に共有できるGoogle Calendar SyncというWindows上で動作するソフトウェアを提供している。確かにこれは便利で、Outlookで入力した予定も携帯で確認・変更できるし、その逆も可能だ。つまりGoogle Calendar Syncを使えば、次のような同期により、外出先でアンドロイド携帯の“カレンダー”で入力した予定を、会社や自宅に帰ってからPCのOutlookで確認したり編集したりできるようになる。

	Android携帯のカレンダー ⇔ ネット上のGoogle Calendar ⇔ PCのOutlook

また、Backoffice等を使わなくてもGoogle Calendarを中継して複数のPCのOutlook予定表を同期して使うこともできる。
ただし、Google Calendar Syncをインストールして最初に同期をかけた瞬間に、Outlookに蓄積されていた全ての予定表の情報がGoogleに読み取られてしまう。私は長年に渡ってスケジュールをOutlookに入れているので、その間の動向が全て裸にされてしまう。それはイヤだ。

さて、何かいい方法はないものか、とOutlookの機能を調べてみた。そうしたら、複数の予定表を重ね合わせて1つの画面で見ることができる、という機能があった。通常は、他人やグループの予定表と自分の予定表を重ね合わせて表示したりする。企業などのBackOfficeを使った環境では良く使うようだが、私のような個人ユーザでは余り使わない機能だろう。しかし、通常のOutlookでもこの機能は利用できる。

つまり、Outlookの予定表を本当にプライベートな予定表とGoogle Calendarと同期をとって使う予定表に分けて、両方を重ね合わせて使うといい。また、祝日の情報も、祝日の情報だけをもった予定表を作って、それを重ね合わせるといい。そうしないと、Google Calendarで見た時にOutlookの祝日の情報とGoogle Calendarの祝日の情報が2重に表示されたりするので見た目が悪くなる。

さて、その方法だが。どうも、Google Calendar Syncは基本的にはOutlookのメインのプロファイルの予定表とだけ同期をとるらしい(未確認)。そこで、次のようにした。

  1. できれば、システムバックアップをとっておいた方が無難だろう。
  2. 既にOutlookの予定表は使い込んでいると仮定して、プライベート、ビジネス、祝日の情報が混在しているとする。そこで先ず、祝日の情報を移す予定表フォルダを作成する。
  3. 次にプライベートの予定を移す予定表フォルダを作成するが、ここでは単にフォルダを作成するのではなく(将来、PCローカルとネット共有の情報を分けて管理できるように)プライベートな情報を保持するOutlookファイルを新規に作り、そこに予定表フォルダを作成する。
  4. 作成した祝日の予定表フォルダ、プライベートの予定表フォルダへデータを移動する。
  5. この状態でGoogle Calendar Syncをインストールして同期をとる。当然、Outlookにはビジネスのデータしか入っていないのでGoogle側にデータが出ていくのはこれだけ。既にGoogle Calendarにデータが登録されている場合には、そのデータがOutlook側へダウンロードされる。

このように設定するとOutlookの予定表が3つあることになるが、Google Calendar Syncからアクセスするのは“標準の予定表”だけで、プライベートや祝日の方は独立していると“思われる”(これは、Google Calendar Syncのドキュメントなどが少なく、どこまでの機能があるが推定に過ぎない、が、実際に使ってみている限りにおいてプライベートの予定表は同期の対象とはなっていない。)

なお、一つ断っておくが、私はメールの読み書きにOutlookは使っていない。そこで、以下の方法を適用した場合、メールの設定がどの様になるのかは試していないので悪しからず。(セキュリティの観点からもメイラとしてOutlookはお勧めできないが。)メールの情報は標準のプロファイルに残るので、特に何も起こらないとは思うが。

さて、以下具体的な手順を追っていく。(ただし、私は“Windows野郎”ではないので、このやり方が正しいのかどうかは分からない。結果論的に言えば、問題なく使えているが。)例ではOSにWindows XPOutlookに2007を使っているが、Windows 7Outlook 2010でも手順は殆ど変わらない筈だ。

まず、統合前のOutlookGoogle Calendarの登録状況を載せておく。(なお、図はOutlook左側のナビゲーション ウィンドウの“予定表”を選択した状態。以下同様)Outlookは色々な情報が混在した状態になっている。Google Calendarはまだ何も登録されていない状況(別に既に何か登録されていても手順には何の影響もない)。


まず、祝日の予定を移動する“日本の祝日”予定表ファイルを作成する。[ファイル]メニューから[新規作成]⇒[予定表]を選択する。

名前を“日本の祝日”として、アイテムが“予定表 アイテム”であることを確認。作成する場所は“個人用フォルダ”を選択する(別に予定表フォルダのサブフォルダとして作成しても良いが、あとは好みの問題)。最後に[OK]をクリックする。

すると、Outlook左側のナビゲーション ウィンドウの中ほどに“個人用の予定表”として“日本の祝日”が追加されていることが確認できる。(ナビゲーション ウィンドウの下側で“予定表”が選択されている状態で。)

さて、次にプライベートな予定を移動する予定表フォルダを作成するが、祝日とは異なり、Outlookのファイル自身を別のファイルとして作成するようにする(別に、現在のファイル(標準のプロファイル)に追加しても構わないと思うが、あとは好みの問題)。[ファイル]メニューから[新規作成]⇒[Outlook データファイル]を選択する。

新しく作成するOutlookデータファイルの種類を聞かれるので、適切な方を選んで[OK]。(旧バージョンのOutlookとデータを共有する必要がないのであれば、最新のもの(Office Outlook 個人用フォルダファイル)を選択すべきだろう。)

新規に作成するファイル名を聞かれるので、ここでは“Outlook.Private”という名前にしてみる。

次に作成する個人用フォルダの名前を聞かれる。ここでは“プライベート”にしてみる。(任意でパスワードとか設定できる。)

Outlookの画面に戻り、左側のナビゲーション ウィンドウの下側にある“フォルダ”アイコンを選択すると、“すべてのOutlookアイテム”に追加したプライベートフォルダが現れる。

さて、今作ったプライベートフォルダにプライベートな予定を移動する予定表フォルダを作成する。ナビゲーション ウィンドウ下部で“予定表”を選んでから、[ファイル]メニューから[新規作成]⇒[予定表]を選択する。

作成するフォルダの情報を聞かれるので、名前は“予定表”、アイテムは“予定表 アイテム”、作成する場所は今作成した“プライベート”とする。[OK]をクリック。

Outlookの画面に戻るとナビゲーション ウィンドウ中ほどの“個人用の予定表”に“プライベート内の予定表”が追加されていることが確認できる。

以上で予定データを移す下準備ができたので、実際にデータを移す。まず、データを移しやすくするためにデータの表示形式を変える。[表示]メニューから[現在のビュー]⇒[すべての予定]を選択する。

すると予定データが一覧形式で表示されるが、色々な情報が混在した形である。

そこで一覧表の上にある項目名の“分類項目”をクリックして、分類項目でソート(=分類項目ごとに表示)する。

まず、祝日のデータを移動する。例では“分類項目: 祝日 (118件)”を表示されているところをマウスでドラッグすると祝日全部が選択されるので、そのまま、左側のナビゲーション ウィンドウにある“日本の祝日”フォルダへマウスを移動させドロップする。これで祝日のデータが“日本の祝日”に移動する。

次に同様にプライベートのデータを“プライベート内の予定表”へ移動する。例では“分類項目: プライベート (11件)”をドラッグしてナビゲーション ウィンドウ中ほどにある“プライベート内の予定表”へドラッグする。(もし、移動するデータに分類項目がついていなかったり、同じ分類項目でも混在する場合は、1つ1つドラッグ&ドロップするしかない。)

これで標準の予定表(=Google Calendarと同期をとる予定表)にはビジネスの予定しか残っていない。[表示]メニューから[現在のビュー]⇒[日/週/月]を選択して表示をもとに戻しておく。


ナビゲーション ウィンドウの個人用の予定表には現在3つの予定表が表示されているので、3つ全てで左側のチェックボックスにチェックをいれる。すると3つの予定表が1画面で表示される。


ただ、この状態では見にくいので、この3つの予定表を重ねておく。3つある右側の2つの予定表の“タブ”には“←”が付いているので、この矢印をクリックする。

予定を確認するだけであれば、どの予定表が一番上でも構わないが、予定を入力する場合は一番上の予定表に書き込まれる。予定表を一番上に移動するには“タブ”をクリックすればよい。

これでGoogle Calendarと同期をとる準備ができた。ここで一旦Outlookを終了して、次のページの中にある手順2のリンクからGoogle Calendar Syncのインストールファイル(googlecalendarsync_installer.exe)をダウンロードしてインストールする。
http://www.google.com/support/calendar/bin/answer.py?answer=89955
Google Calendar Syncのインストールは単純だ。基本的にはインストールのオプションやインストール先のフォルダは標準のままで良いだろう。




なお、Outlookを終了していないと次のような警告ダイアログが出るのでOutlookを終了してから[OK]を押す。

最後にGoogleのアカウント情報と同期の方法(双方向で同期する、Google CalendarOutlookで同期する、OutlookGoogle Calendarで同期する)と同期の間隔(標準で120分)を設定すれば終了となる。入力にミスがなければ[Save]を押すと最初の同期が始まる。

インストールが終了し、Google Calendar Syncが起動するとWindowsの右下の通知領域にアイコンが表示される。同期中は上下の矢印のアニメーション表示となる。また、Google Calendar Syncのアイコンにマウスのカーソルを合わせると、Google Calendar Syncのバージョンと最後に同期をとった日時が表示される。なお、インストーラではWindowsへのログオン時に自動的にGoogle Calendar Syncが起動するようには設定しないので、自動起動したい場合にはGoogle Calendar SyncWindowsの[スタートメニュー]⇒[すべてのプログラム]⇒[スタートアップ]に登録しておく。


同期終了後のGoogle Calendarの内容は次の様になっている。

次に双方向で同期がとれるのか試してみよう。例では、Google Calendar側では5月27に“試験立ち会い”という予定を追加する。Outlook側では5月23日にビジネスの予定として“納品”を、5月23日にプライベートの予定として“バーベキュー”を追加する。


これで約2時間待てばGoogle Calendarと同期するが、それまでは待てないのでGoogle Calendar Syncのアイコンをマウスで右クリックして[Sync]を選択することで、直ちに同期する。(Google Calendar Syncのインストール時にはOutlookを終了しておく必要があるが、インストール後の同期の際にはOutlookを終了する必要はない。)

以下が同期した結果である。


ひとこと

カレンダーに関しては上の方法でネット上に置いておくものとPCだけで管理するものを分けることができるので大変便利になった。

今、2台のWindowsマシンにGoogle Calendar Syncをインストールして、PC2台、Google CalendarAndroid携帯の間でスケジュールを共有している。
ただ、1台のマシンで何回かいじくっていたら、Google Calendar Syncで同期をかける度に、“どのOutlookプロファイルと同期するのか”と聞かれるようになってしまった。(逆に考えれば上手く設定すれば任意のプロファイルと同期がとれるかも知れないということだが。) 問題なのはプロファイルを指定して“既定のプロファイルとして設定”を指定しても、同期の度にまたダイアログが出て聞いてくるのでうっとおしい。同期を30分毎にかけると30分毎にダイアログが出てきてしまう。これは、どうもGoogle Calendar Sync側のからのメッセージではなくOutlook側のメッセージのようだ。Google Calender Syncをアンインストール&再インストールしても症状は改善されない。Outlookでもpstファイルの再構築をしたがダメだった。こうなってくるとMicrosoft製品は良くわらなくなって来てしまう。分厚くて(しかも高額の)入門書を読む気にはならない。多分、Outlookをアンインストール&再インストールすれば改善するかもせれないが、最悪Office製品全部の再インストールが必要になるので、手間を考えるをちょっとやる気がでない。

そのマシンは今のところ、そう頻繁には同期を掛ける必要もないので放っておいてあるが、こんな状況に陥ることもあるので予めバックアップは取っておいた方が良いと思う。

今回は、Google Calendar Syncが同期するのは“標準の予定表”という前提作業したが、欲を言えば、Google Calendar Sync側で“同期をとるのはOutlookのどの予定表なのか”を設定できると嬉しい。(以前使っていたガラケーの同期ツールは指定できたのだが。)