Thursday, November 19, 2009

Diskeeper 2010 の新機能 IntelliWrite がすごい件

Windows のデフラグツールの新バージョン、Diskeeper 2010 (DK14) の新機能 IntelliWrite がすごいので簡易なベンチマークを取ってレビューします。

IntelliWrite とは

IntelliWrite はディスクの断片化(フラグメントの発生)を事前に防止する機能です。日本では 19日に発売となった Diskeeper 2010 に初めて搭載されました。

その昔フラグメントが起こりにくいとされていたくせに、実はめちゃくちゃフラグメントしまくる NTFS の、まさに弱点を補うような機能です。(FAT については追記参照)

IntelliWrite はファイルシステムのフィルタドライバとして実装されています。

IntelliWrite の効果

ベンチマークのテストプログラムは、無駄に並列に、無駄に細切れに、無駄にフラグメントを起こすような形で、ディスクへの書き込みを行なうものにしました。

では、早速、ベンチマークの結果を。

IntelliWrite OS 試行回 所要秒数 超過断片数
無効 Windows XP 1 83 18,810
    2 76 18,810
    3 72 18,810
    4 73 18,810
    5 70 18,810
有効 Windows XP 1 38 30
    2 43 30
    3 36 30
    4 31 30
    5 37 30
IntelliWrite OS 試行回 所要秒数 超過断片数
無効 Windows 7 1 119 18,810
    2 132 18,386
    3 136 18,158
    4 146 18,544
    5 139 18,810
有効 Windows 7 1 51 84
    2 53 84
    3 55 87
    4 60 84
    5 55 85
IntelliWrite OS 試行回 所要秒数 超過断片数

テストプログラムの実行によって発生した超過断片の数と、その所要時間です。Windows XP と Windows 7 の二台は別のマシンで、CPU もディスクもコントローラも性能が異なります。「自動デフラグ」はオフにしてあります。断片数の値にあまりぶれがないのは、かなり地ならしした後の計測だからです。

解説は…いらないかな。IntelliWrite の有効 / 無効のあいだで、所要秒数と超過断片数の違いを見てください。

断片数は桁が三つ違いますから放っておいて、所要秒数の平均値をグラフで見易くすると以下のようになります。(繰り返しますが Windows 7 と Windows XP ではマシンの性能が異なります。Windows 7 と Windows XP の比較ではありません)

DK2020_graph

Netbook や Note PC でバッテリが気になる使い方をしていれば、この違いが強烈に効いてくると分かってもらえると思います。

IntelliWrite を使うと、

  1. 断片化の発生がすごく防止される
  2. 伴なって、ディスク書き込みのパフォーマンスが上がる
    (結果、測定してないけど、読み込みのパフォーマンスは下がらない)

です。

これまでのデフラグソフトは「パフォーマンスを低下させない」あるいは「低下したパフォーマンスを元に戻す」ものでした。しかし Diskeeper 2010 の IntelliWrite はパフォーマンスを向上させます。

この記事、別に回し者じゃないけどべた褒めする気で書いてます。(・∀・;)
もっとも、断片化が発生しないディスク I/O の場合にはそもそも違いはでませんけどね。

見えないとこでも断片化防止

ベンチマークの結果は、もう、なんつーか、びっくりでしょう?ぼくもびっくりしました。

これだけ断片化しまくる NTFS も酷いけどw、対してそれをほとんど阻止する IntelliWrite がすごい。

DK2010_IntelliWrite

Diskeeper 2010 のダッシュボードでは、その日に発生した断片化のうち、IntelliWrite がどれだけ防止したのかが表示されます。このベンチマークのような極端な場合には 99% 表示となりますが、通常の使用では 60% ~ 80% 程度になるようです。公称は最大約 85% と言われています。もちろんディスクの使われ方によりますけど。

Diskeeper 2010 のエディションの選び方

これまで Diskeeper を使ったことがない人にもぜひ試して欲しいので、どのエディションを買ったら良いのか、選び方を書いてみます。この blog の他の記事を見てもらえれば分かりますが、普段はさすがにここまで書かないです…。

Home Edition

安いです。とりあえずあらゆる Windows PC に入れとけ的なエディションです。

それでも、IntelliWrite と InvisiTasking が使えるので、Windows 標準のデフラグや他の似たような製品とは違うのがすぐに体感できると思います。Netbook や Note PC にちょうど良くて、かつ、コストパフォーマンスが抜群だと思います。
いまどきの子ならお小遣いで十分買えるんじゃないかな。

ProPremier Edition

このエディションを最もお勧めします。
ミッドレンジ~ハイエンドのノート PC とデスクトップ PC には ProPremier 一択です。

Diskeeper の特徴的な機能はすべて使えます。サイズ 60GB 以上の HDD ボリュームでは、TVE という特別なデフラグエンジンを利用できます。元はハイエンドサーバ向けのデフラグエンジンでしたが、下位のエディションに降りてきました。いまどき一般的な 250GB 以上とかの HDD 容量があるなら違いが顕著です。500GB ~最近のテラバイト級の HDD を使っているなら下位のエディションとはデフラグ速度の性能差が 4倍~ 5倍くらいは出ると言われています。
母親の PC にこれをインストールしてあげたら 10歳は若返ったと喜んでます。(本人の感想であり効果効能をあらわすものではありませn)
4年前は十ン万円してたエンジンがいまなら一万以下。やりくり上手なあなたならきっと買えますよ。

Server Edition

業務用です。機能は ProPremier 相当です。

IntelliWrite は本来サーバでこそ待ち望まれた機能だと思います。一般的な web サーバ、ファイルサーバ、その他なんでも Windows Server ならこれで(Home Server は除く)。
SQL Server 使ってますか?効きますよ。お父さんなら決済通せるよね。

企業のネットワークで効率的に Diskeeper を展開・管理する場合、Administrator Edition の使用を検討してください。プッシュインストール便利です。

学校・企業で導入の場合、また、クライアント版で 10本以上、サーバー版で 2本以上を導入する場合には、ボリュームライセンスが利用できます。

EnterpriseServer Edition

エンタープライズ用、あるいは廃人用です。

現在最高性能のデフラグエンジン Titan Defrag Engine を積んでます。数年未来を先取りしたい人、デフラグがどうしても好きな人、これで勝てます。2TB のディスクいっぱい繋いじゃってボリューム組んでるとか(棒読み)、痛なんとか Itanium の人もこれです。

DK2010_EnterpriseServer
うふふ。

エディション選択の注意

Diskeeper の各エディションが動作可能な Windows の SKU は購入前に必ず確認してください。トライアル版で試用してみるのが安心です。

Home エディションは Windows のビジネス向け SKU (Vista Business, Vista/7 Enterprise) にはインストールできません。但し、7 Professional にはインストールできます。

今回紹介した IntelliWrite は Diskeeper 2010 の Administrator を除く全エディションに搭載されています。テストプログラムの実行環境では ProPremier を使いました。

以前のバージョンにあったエディションごとの最大ボリュームサイズの制限は、Diskeeper 2010 から無制限になったようです。

SSD も使う場合は "with HyperFast" 版か "HyperFast 追加パック" で。

関連記事

販売元の記事
他サイトの記事
開発元の記事

以下は開発元 Diskeeper Corporation のサイト。ぜんぶ英語です。

テストプログラム

ベンチマークに使ったテストプログラムは以下の Perl スクリプトです。

あんまり老齢なディスクに厳しい条件で動かすと、とどめ刺しそうな気もするのでほどほどにどうぞ…。

#!perl
# -*- mode: cperl; coding: utf-8-dos; -*-

use utf8;
use strict;
use warnings;
use threads;

use File::Spec::Functions qw(catfile);
use Getopt::Long qw(GetOptions);
use IO::File;

sub worker {
    my ($id, $files, $bytes, $total, $filename, $verbose) = @_;

    print "S$id " if $verbose;

    my @fh = ();
    for my $i (1 .. $files) {
        my $fh =
          IO::File->new(sprintf($filename, $id, $i), '>');
        push @fh, $fh
          if defined $fh;
    }

    for (1 .. $total) {
        for my $fh (@fh) {
            print {$fh} random_alnum() x $bytes;
            threads->yield();
        }
    }

    for my $fh (@fh) {
        $fh->close();
    }

    print "E$id " if $verbose;

    return;
}

sub random_alnum {
    return substr(join('', ('0' .. '9', 'a' .. 'z', 'A' .. 'Z')),
                  int(rand(62)), 1);
}

sub analyze {
    my($filemask) = @_;
    my $result = 0;

    my @stats_result = `contig -a $filemask`;
    my $s = "@stats_result";
    while ($s =~ m/(?: is in (\d+) fragments| is defragmented)/msg) {
        my $fragments = defined $1 ? $1 : 1;
        $result += $fragments;
    }

    return $result;
}

MAIN: {
    local $| = 1;
    my $workers   = 3;
    my $files     = 10;
    my $bytes     = 4096;
    my $total     = 10000;
    my $directory = '.';
    my $verbose   = 0;

    GetOptions('workers=i'   => \$workers,
               'files=i'     => \$files,
               'bytes=i'     => \$bytes,
               'total=i'     => \$total,
               'directory=s' => \$directory,
               'verbose'     => \$verbose,
              )
      or die;

    my $filemask = catfile($directory, 'IntelliWriteBench_testfile_*.txt');
    my $filename = catfile($directory, 'IntelliWriteBench_testfile_%s_%d.txt');
    print "test file name: $filename\n" if $verbose;

    my $time_start = time();

    print "writing..." if $verbose;
    my @threads = ();
    for my $worker_id (1 .. $workers) {
        push @threads,
          threads->new(\&worker,
                       $worker_id, $files, $bytes, $total, $filename,
                       $verbose);
    }
    for my $thread (@threads) {
        $thread->join();
    }
    print "done\n" if $verbose;

    my $elapse = time() - $time_start;

    print "analysing..." if $verbose;
    my $fragments = analyze($filemask);
    $fragments -= $workers * $files;
    print "done\n" if $verbose;

    print "unlink..." if $verbose;
    unlink glob($filemask);
    print "done\n" if $verbose;

    print "time: $elapse sec\n";
    print "frag: $fragments excess fragments\n";
}

実測にはこれを PDK でコンパイルして実行可能ファイルにしたものを使っています。普通に ActivePerl で実行しても問題無く測定できます。 
ファイルのフラグメント数の取得には Sysinternals の Contig を使っています。

FAT について

追記@Tue Dec 08 21:43:53 2009
IntelliWrite は NTFS をはじめ旧来の FAT もサポートしています。build 897 時点で exFAT は Diskeeper 2010 自体がサポートしておらず、将来的にサポート予定とのこと。

日本語版のアップデート

2010/09 以降の Windows XP SP3 への対応

追記@Mon Sep 13 19:37:02 2010
正常にインストールできない不具合に対応した新しいインストーラーが公開されています。14.0.900a

追記@Sun Mar 20 00:52:56 2011

リンクからアフィリエイトを削除しました。

No comments:

Post a Comment