KVM上のWindows XP SP3とWndows 8 ReleasePreviewのベンチマーク

思ったほど(あと体感ほど)スコアに差はなかったが、XPくんは放っておくとどんどん重くなっていって再起動が一定間隔で必要だったりアカン子。余っているライセンスはこの際ぜんぶWindows8にアップグレードしてしまうのがいいのかも…?

ハードウェア、ホスト

Model CPU Memory HDD OS
HP ML110 G7 Celeron G530 ECC 2GB x 2 WD30EZRX x 6 Scientific Linux 6.3 x86_64

ゲスト

Windows XP SP3 32bit

virtioは不安定なため使用しない

インストール

# virt-install \
--name xp \
--ram 2048 \
--vcpus 1 \
--os-type windows \
--os-variant winxp \
--hvm \
--virt-type kvm \
--disk vol=images/xp,cache=writeback \
--disk /path/to/WindowsXP-SP3.iso,device=cdrom \
--vnc \
--vncport 5900 \
--vnclisten 0.0.0.0 \
--keymap ja \
--network bridge=br0

物理コアと1:1で割り当てておく

# virsh vcpupin winxp 0 0

Windows 8 ReleasePreview 64bit

インストール

# virt-install \
--name win8 \
--ram 2048 \
--vcpus 1 \
--os-type windows \
--os-variant win2k8 \
--hvm \
--virt-type kvm \
--disk vol=images/win8,bus=virtio,cache=writeback \
--disk /path/to/Windows8-ReleasePreview-64bit-Japanese.iso,device=cdrom \
--disk /path/to/virtio-win-0.1-30.iso,device=cdrom \
--vnc \
--vncport 5901 \
--vnclisten 0.0.0.0 \
--keymap ja \
--network bridge=br0,model=virtio 

物理コアと1:1で割り当てておく

# virsh vcpupin win8 0 0

スコア

Windows XP SP3 32bit

------------------------------------------------------------------------------
CrystalMark Result
------------------------------------------------------------------------------
   Display Mode : 1024 x 768 32bit (ClearType)

    CrystalMark :  103189

[ ALU ]              9989
      Fibonacci :    3376
      Napierian :    2181
   Eratosthenes :    1577
      QuickSort :    2833
[ FPU ]             12840
        MikoFPU :    1129
     RandMeanSS :    7421
            FFT :    2406
     Mandelbrot :    1862
[ MEM ]             18172
           Read : 5936.97 MB/s (  5936)
          Write : 5979.13 MB/s (  5979)
     Read/Write : 3741.58 MB/s (  3741)
          Cache : 24941.83 MB/s (  2494)
[ HDD ]             33377
           Read :  306.85 MB/s (  7034)
          Write :  234.13 MB/s (  6341)
 RandomRead512K :  544.13 MB/s (  8220)
RandomWrite512K :   89.49 MB/s (  3579)
 RandomRead 64K :  243.45 MB/s (  6434)
RandomWrite 64K :   44.23 MB/s (  1769)
[ GDI ]              9340
           Text :    2526
         Square :    1963
         Circle :    3661
         BitBlt :    1190
[ D2D ]             17948
   Sprite    10 :  692.92 FPS  (    69)
   Sprite   100 :  627.67 FPS  (   627)
   Sprite   500 :  457.10 FPS  (  2285)
   Sprite  1000 :  334.26 FPS  (  3342)
   Sprite  5000 :  111.48 FPS  (  5574)
   Sprite 10000 :   60.51 FPS  (  6051)
[ OGL ]              1523
  Scene 1 Score :    1456
  Lines (x1000) : ( 183960)
  Scene 1  CPUs : (     32)
  Scene 2 Score :      67
Polygons(x1000) : (    477)
  Scene 2  CPUs : (      1)

Windows 8 ReleasePreview 64bit

------------------------------------------------------------------------------
CrystalMark Result
------------------------------------------------------------------------------
   Display Mode : 1024 x 768 32bit (ClearType)

    CrystalMark :  107585

[ ALU ]             12837
      Fibonacci :    4639
      Napierian :    2453
   Eratosthenes :    2010
      QuickSort :    3713
[ FPU ]             11527
        MikoFPU :    1125
     RandMeanSS :    6138
            FFT :    2391
     Mandelbrot :    1851
[ MEM ]             18250
           Read : 6047.52 MB/s (  6047)
          Write : 6032.33 MB/s (  6032)
     Read/Write : 3686.27 MB/s (  3686)
          Cache : 24635.21 MB/s (  2463)
[ HDD ]             50012
           Read : 1648.89 MB/s ( 13744)
          Write :  146.59 MB/s (  4931)
 RandomRead512K : 1758.64 MB/s ( 14293)
RandomWrite512K :  152.33 MB/s (  5046)
 RandomRead 64K :  561.39 MB/s (  8306)
RandomWrite 64K :   92.31 MB/s (  3692)
[ GDI ]              9995
           Text :    3975
         Square :     958
         Circle :    2921
         BitBlt :    2141
[ D2D ]              3580
   Sprite    10 :  345.38 FPS  (    34)
   Sprite   100 :  266.29 FPS  (   266)
   Sprite   500 :  116.97 FPS  (   584)
   Sprite  1000 :   68.31 FPS  (   683)
   Sprite  5000 :   19.53 FPS  (   976)
   Sprite 10000 :   10.37 FPS  (  1037)
[ OGL ]              1384
  Scene 1 Score :    1323
  Lines (x1000) : ( 168501)
  Scene 1  CPUs : (     32)
  Scene 2 Score :      61
Polygons(x1000) : (    431)
  Scene 2  CPUs : (      1)

RAID6上のLVM上のExt4のベンチマーク

以下のようなスペックのマシンをセットアップしたのでメモ。

Model CPU Memory HDD OS
HP ML110 G7 Celeron G530 ECC 2GB x 2 WD30EZRX x 6 Scientific Linux 6.3 x86_64

AFT

最近の大容量ディスクはみんなAFT。うまくパーティションを切らないとパフォーマンスが低下しちゃいます。さらに今回はRAID6上のLVM上のExt4(!)であることも考慮しなければなりません。といってもそれほど複雑なことを考える必要はなく、新しめのOSであればもうほぼデフォルトの設定で問題ないはずです。

パーティション

今回は/boot/と、ここで使うRAIDアレイ用のパーティションを分けることにしました。 このような場合は、パーティションが正しく切られているかが重要です。 1.00 MiB = 1,048,576 byteで、これは4096 byteで割り切れます。つまりMiB, GiB単位で分けておけばよいことになります。partedで以下のように簡単にパーティションを作成できます。

# parted /dev/sdX
(parted) mklabel gpt
(parted) mkpart boot 1mib 300mib
(parted) mkpart system 300mib 40gib
(parted) mkpart storage 40gib -0gib
(parted) quit

LiveCDなどで作業をしてもいいですが、OSのインストーラを立ち上げた後、Alt + F2で仮想コンソールに切り替え、Alt + F6でインストーラに戻るのが簡単です。

RAID6

ここで考える必要があるのは、metadata version、およびchunk sizeです。 metadataは --metadata 1.0 を指定して、Arrayの後方に配置します。chunk sizeはAFTのセクタサイズ、4KBの倍数になるようにします。

# mdadm --create /dev/md2 --metadata 1.0 --raid-devices=6 --level=6 --chunk=128 /dev/sd[abcdef]3
mdadm: array /dev/md2 started.

LVM

LVMではヘッダサイズが重要ですが、新しいOSではデフォルトで問題ない値になるようです。

# vgcreate VolGroup01 /dev/md2
  No physical volume label read from /dev/md2
  Writing physical volume data to disk "/dev/md2"
  Physical volume "/dev/md2" successfully created
  Volume group "VolGroup01" successfully created
# lvcreate -l 100%VG -n  LogVol00 VolGroup01

でPVとVGとLVを作成し、以下のコマンドでヘッダサイズが適切かどうか確かめます。

# pvs -o+pe_start
  PV         VG         Fmt  Attr PSize  PFree 1st PE 
  /dev/md1   VolGroup00 lvm2 a--  39.70g 2.59g   1.00m
  /dev/md2   VolGroup01 lvm2 a--  10.76t    0    1.00m

1st PEが1.00mになっています。これは適切な値です。

ヘッダサイズを手動で設定するならば --dataalignmentオプションをpvcreateに渡します。データの開始がこの値の倍数になるので、ここではRAIDアレイのchunk sizeにしておくのがいいでしょう。

# pvcreate -M2 --dataalignment 128K /dev/md2

Ext4

ここで考えるべきはblock size、stride、およびstripe-widthです。 block sizeは4096の倍数であれば適切です。 stride, stripe-widthは次の式で求められます:

stride = RAIDアレイのchunk size / Ext4のblock size
stripe-width = stride * (RAIDアレイを構成するディスク数 - 2)

block sizeは4096にすることとし、ディスク数は6、chunk sizeは128なので、stride=32, stripe-width=128となりました。

# mke2fs -t ext4 -v -m 1 -b 4096 -E stride=32,stripe-width=128 /dev/VolGroup01/LogVol00
mke2fs 1.41.12 (17-May-2010)
fs_types for mke2fs.conf resolution: 'ext4', 'default'
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=32 blocks, Stripe width=128 blocks
722083840 inodes, 2888322048 blocks
28883220 blocks (1.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
88145 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 
        2560000000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

テスト

さて、ここまでで、恐らくRAID6上のLVM上のExt4が適切な設定で作成されたはずですが、確かめてみなければなんとも言えません。 バーンインも兼ねて、ちょっと時間のかかるベンチマークを取ってみます。

  • /dev/sdXのスケジューラ
    • cfq (default)
    • deadline
    • noop
  • RAID6のstripe_cache_size
    • 256 (default)
    • 768
    • 2048
    • 8192
    • 32768
  • Ext4のマウントオプション
    • "barrier=1,data=ordered" (default)
    • "barrier=0,data=ordered"
    • "barrier=1,data=writeback"
    • "barrier=0,data=writeback"
    • "barrier=1,data=writeback,nobh"
    • "barrier=0,data=writeback,nobh"
    • "barrier=1,data=journal"
    • "barrier=0,data=journal"

の全通りに対して、以下の2種類のテストを行いました。

  • テスト
    • bonnie++ -q -x 1 -s 32G
    • dbench 100

スクリプト

結果

シーケンシャルリード、シーケンシャルライトは最大それぞれ400MB/s、450MB/s程度。十分な性能が出ているようです。もちろんこの場合はパフォーマンス最優先なので、その点には注意が必要ですが。

bonnie++ put_block

bonnie++ rewrite

bonnie++ get_block

dbench

Dropboxのカメラアップロードテストのボーナスを最後の500MBまで容赦なくゲットする方法

フォーラムに「4.5GBまでしか貰えないよー」という声が多数あったので調べてた。
http://forums.dropbox.com/topic.php?id=53104&replies=807


「ギガバイトサイズのをインポートしたら増えたよー」「10GB送りつけたら最後に増えた」「10GBアップロードしたけどだめだった」「12GBアップロードしたけど4.5GBのまま」「ビデオと画像別々で計算してるんじゃ?」
という流れで、以下のPostで結論です。

Sin L.

Alright, after experimenting for a while. The way to get the full 5GB bonus 
requires you to:

おーけー、実験してきたよ。5GBのボーナスをフルにゲットするには、

1. Successfully import either a photo or video into your Dropbox account. 
You'll get credit for 500MB.

画像かビデオをインポートすること。+500MB

2. Either successfully imported and sync'ed 4GB worth of photo(s) or video(s),
 to get the 4GB credit.

それから、4GBの画像かビデオをインポート、同期すること。+4GB

3. If you successfully imported and sync'ed only photo(s), you need to do
 at least another 500MB of video(s) to get that final 500MB credit. Same 
applies vice versa, if you only do 4GB of video(s), you need to do at least
 500MB of photo(s).

画像をアップロードした場合は、最後の500MBのボーナスをゲットするために、
更に500MB以上のビデオをアップロードする必要がある。同様に、ビデオを4GB
アップロードした場合は、500MB以上の画像をアップロードする必要がある。

Following this, you will only need to upload exactly 4.5GB of data to get
 5GB of credit space. 4GB of it being either Photo(s) or 4GB Video(s) then
 a +500MB of either Photo(s) or Video(s).

こうすれば、5GBのボーナスをゲットするために必要なのは4.5GBのアップロード
(4GBの写真かビデオ、そして500MBの写真かビデオ)だけ。

Also, I believe if you do a single 4GB video file, it will only count as
 being credited for 500MB. So do smaller size video(s) and nothing greater
 than 500MB.

それから、4GBの単一のビデオをアップロードしても、それは500MBのボーナスに
しかならない。なので、500MBを超えない小さいビデオをアップロードしよう。

For those that are on 2GB~ accounts, you just need to free up space once 
you've accumulated additional spaces to upload again. For example, if you're
 stuck on 3GB data filled and cannot upload more photo(s) or video(s), just
 delete the existing one(s) and re-upload new one(s).

アカウントの容量が2GBちょいだったりするときは、アップロードしたものを消して、
開いたスペースに新しくアップロードするだけ。
例えば(2.4GBからアップロードを始めて)3GBでデータが一杯になって、
それ以上アップロードできなくなったときは、古いのを消して、新しく
アップロードするだけ。

Proof in the link: http://img13.imageshack.us/img13/4030/db5gbbonusverified.png

証拠のリンク。

Edit: Please follow the link to an updated topic regarding the missing 
500MB bonus issue: http://forums.dropbox.com/topic.php?id=53120

http://forums.dropbox.com/topic.php?page=6&id=53104&replies=806#post-393497


僕の環境でも+5GBになり、再現できました!

そしてこれが一番書きたかったこと

以下のリンクから新規アカウントを作ると+250MBで開始できます!
https://www.dropbox.com/referrals/NTE2NTE5MTc5

ふえろーふえろー

Windows7 Home Premiumでバックアップ先をネットワークドライブにする(偽

Windows7 Professionalには搭載されているという噂の、ネットワークドライブにバックアップしちゃうという機能を、擬似的にWin7 Home Premiumでやっちゃおうという試みです。
やや煩雑ですが、わりとイケそうな感触なので記事にしておきます。

Windows7には、VHDをマウントできる機能がある。

はい、勘の良い人はここでもう僕の言いたいことが分かってしまいましたね。VHDファイルをネットワーク上に置いて、それをローカルにマウント、バックアップドライブに指定しましょうということです。

初回の手順

VHDを作成する

”コンピュータの管理”=> ”ディスクの管理”=> ”ディスクの操作”=>”その他”=>”VHDの作成” 

VHDをバックアップ先に選び、バックアップを実行する
VHDを切断

”コンピュータの管理”=> ”ディスクの管理”にて、対象のVHDを右クリック => ”切断”
ネットワーク上のVHDへの接続がうまく行かなければ自動的に切断されるので、放っておいてもいいかもです。

二回目以降の手順

VHDを作成する

”コンピュータの管理”=> ”ディスクの管理”=> ”ディスクの操作”=>”その他”=>”VHDの接続”
ドライブレターは(空いていれば)自動的に以前のものが選ばれます。 

VHDをバックアップ先に選び、バックアップを実行する
VHDを切断

初回と同様

以上です

  • 購入後、最初に一度だけシステムイメージのバックアップをしておきたい場合

などに重宝しそうです。
また、

  • ときどきシステムイメージのバックアップをしたい場合、
  • ファイルのバックアップをしたい場合。

これらの場合は、手動でその度にVHDを接続、あるいは作成することになるでしょう。やや煩雑ですが、それでもノートPCに外付けHDDを挿抜するよりは楽なんじゃないかと思います。

VHDマウント機能で気をつけること

Sambaを使ってる人は

strict allocate = yes

がsmb.confに含まれているかチェックしてください。

strict allocate = no、または記載なしの場合、

VHDは、”ディスクの操作”=> ”その他” => ”VHDの作成”で作るわけですが、ここで ”可変容量”を選んじゃいけません、ゼッタイ。

  • 作成はOK
  • 書き込みもOK

しかし…

  • アンマウント NG => ”このバージョンでは、このファイル形式のバージョンはサポートされません。”
  • 再マウント NG => ”このバージョンでは、このファイル形式のバージョンはサポートされません。”

という感じで、バックアップしてるのに後で開けず、そもそもアンマウントさえもできないという呪われた感じになっちゃいます。ご注意を。
ファイルサーバー上にあるVHDとのネットワークが切れると、VHDが読み込めなくなる。

届いたノートパソコンが悲しかったのでメモ

Thinkpad E420が届いたのだけれど、液晶に汚れ(ドット欠けじゃなく埃でも入ってるみたい)があり、さらにキーボードの右下隅が浮いていてペコペコと間抜けな音をたてるので到着早々なんだけど、修理の旅に出てもらうことにした。
先代のThinkpad Edge14も右下隅が浮いてる症状で入院した記憶がある。Thinkpadといえばキーボードのタッチと赤いポッチなわけで、ここで手を抜いてもらうと困ってしまう。僕は赤いポッチには興味が無いのでこれはなくなってもいい。でもキーボードだけは…。
幸いというかなんというか、Edge14からタッチは向上してると思う。素性はいいんだ。キーボードのフィーリング。エラーが出るわけでもない些細な問題と現場が思っているなら、悲しい事だなぁ。


謎の汚れ


右下隅を押すとわずかに沈む

StormのTopologyをグラフにして見る(手抜き

StormのTopologyBuilderの設計はいまいち好きじゃないんですが(idで指定なのと、setBolt・setSpoutが分かれているところ)、それはともかく、できあがったTopologyはグラフにしないとパッと理解できないので、Pythonで適当に書いてみました。

    builder = TopologyBuilder()
    builder.setSpout(1, Spout())
    builder.setBolt(2, Bolt()).allGrouping(0)
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@Spout x(default)"];
2 [label="2@Bolt x(default)"];
1 -> 2 [label="all"];
}

    class TestWordSpout(Spout):
        pass
    class ExclamationBolt(Bolt):
        pass
    builder = TopologyBuilder()        
    builder.setSpout(1, TestWordSpout(), 10)        
    builder.setBolt(2, ExclamationBolt(), 3).shuffleGrouping(1)
    builder.setBolt(3, ExclamationBolt(), 2).shuffleGrouping(2)
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@TestWordSpout x10"];
2 [label="2@ExclamationBolt x3"];
3 [label="3@ExclamationBolt x2"];
1 -> 2 [label="shuffle"];
2 -> 3 [label="shuffle"];
}

    class RandomSentenceSpout(Spout):
        pass
    class SplitSentence(Bolt):
        pass
    class WordCount(Bolt):
        pass
    builder = TopologyBuilder()
    builder.setSpout(1, RandomSentenceSpout(), 5)        
    builder.setBolt(2, SplitSentence(), 8).shuffleGrouping(1)
    builder.setBolt(3, WordCount(), 12).fieldsGrouping(2, Fields("word"))
    builder.graphviz_format()
digraph topology {
1 [shape=box, label="1@RandomSentenceSpout x5"];
2 [label="2@SplitSentence x8"];
3 [label="3@WordCount x12"];
1 -> 2 [label="shuffle"];
2 -> 3 [label="fields[word]"];
}

だいぶわかりやすいですね。

TopologyBuilderは

TopologyBuilder builder = new TopologyBuilder();
        
builder.setSpout(1, new RandomSentenceSpout(), 5);        
builder.setBolt(2, new SplitSentence(), 8)
        .shuffleGrouping(1);
builder.setBolt(3, new WordCount(), 12)
        .fieldsGrouping(2, new Fields("word"));

より

TopologyBuilder builder = new TopologyBuilder();
builder.set("random_sentence_spout", 
        new Node(new RandomSentenceSpout()).setPallalelismHint(5));
builder.set("split_sentence", 
        new Node(new SplitSentence()).setPallalelismHint(8).shuffleGrouping("random_sentence_spout")) ; 
builder.set("word_count", 
        new Node(new WordCount()).setPallalelismHint(12).fieldGrouping("split_sentence", new Fields("word"))) ; 

とかのほうがわかりやすいような気がしますが、僕はもう少し抽象的な定義からTopologyを生成して使おうとしているので、出来上がりさえ検証できれば問題ないですね。

コード

InputDeclarerのstreamIdは使わなそうなので実装していません。

Apple IDを変更した

AppleIDはエイリアスを使ってid+alias@gmail.comのかたちで登録していた。これが非常にややこしい。出先でApple関連のサービスにログインするとき、意味のわからないエイリアスを入力することを毎回のように強要され発狂しそうになった。誰だよエイリアスとか考えた天才!遅れてきた中ニ病と相性抜群じゃねーか!

方法

Apple IDの編集」→「名前、ID、メールアドレス」にて「代替メールアドレス」を登録する
登録したアドレスにメールが飛んでくるのでクリックして認証する
同じく「Apple IDの編集」→「名前、ID、メールアドレス」にて「AppleIDと主要メールアドレス」を編集する
編集したアドレスにメールが飛んでくるのでクリックして認証する
完了!

後始末

PCのiTunesにて、ログアウト→新しいIDでログイン
iPhone/iPod touchにてiCloudのログアウトができない?ので削除(これが実質ログアウト?)→新しいIDでログイン
iPhone/iPod touchにてStoreでログアウト→新しいIDでログイン


以上。これで問題なく使えてます。