2011年11月11日金曜日

Office 起動高速化Tips(目指せ3秒台)



Office 起動高速化Tips(目指せ3秒台)
あなたの Office もこれで爆速

正直なところ Office を仮想化すると起動が遅いです。

理由としては、仮想化しているからです。(爆)

だからと言って諦めたらダメです。
これから説明するTipsを全て適用すると
25.0秒3.9秒になります。

起動してしまえば、インストールされている物と大差はありません。



余談ですが、アプリの世界には、4秒ルールという物があるみたいです。
4秒を超えると、著しく遅く感じるようです。
そして4秒を超えてしまうと、10秒でも15秒でも大差がなくなるという。
そのため、アプリの開発者はスプラッシュスクリーンを早めに出して
頑張っている感をユーザーにフィードバックしたり
とにかく、4秒以内にユーザーに何かを伝えないといけないと言われているようです。

と言う訳で目標は4秒を切る!になります。

ざっくり比較すると
標準的なPC( Windows7 が動く位いのスペック)
標準的なインストールをした「 Excel2007 」
ダブルクリックしてから、 Excel2007 のスプラッシュスクリーンが表示されるまで。
※セルに文字を入力できる状態まではもう少し時間が掛かります。

【 App-V の条件】
・まったくチューニングしていない物
・クライアントPCに Excel2007 の起動用データがローカルキャッシュされている状態
ストリーミングは行われない状態、ストリーミングが行われる状態だと
その分時間が更にかかります。

【 ThinApp の条件】
・まったくチューニングしていない物
・無圧縮パッケージ
・クライアントPCのHDDに仮想アプリを置いている状態

計測結果
1.PCを起動してから、ログインし少し落ち着いた状態での「初回の初回起動」
物理 Excel2007   3秒程度
ThinApp Excel2007 10秒程度
App-V Excel2007  25秒程度
※「初回の初回起動」はログインしたユーザーが初めて仮想アプリを利用する状態を指します。
少し落ち着いた状態と言うのは、起動直後はWindowsが色々と処理を動かし出すので
CPUの負荷が落ち着いた頃です。

2.一度Excelを終了させて、「2回目の起動」(90秒以内)
物理Excel2007   1秒程度
ThinApp Excel2007 6秒程度
App-V Excel2007  10秒程度
※90秒に明確な答えがあるわけではありませんが、
体感的に90秒以内が良い感じでした。特にApp-V

3.PCを再起動してから、ログインし少し落ち着いた状態での「初回起動」
物理 Excel2007   3秒程度
ThinApp Excel2007 8秒程度
App-V Excel2007  20秒程度
※仮想アプリのスコアが良くなっているのは、仮想アプリ独自の
ユーザーデータの保存先作成等の初期タスクが完了しているからです。

Excel2007タイプ初回の初回起動2回目の起動初回起動
物理3秒程度1秒程度3秒程度
ThinApp10秒程度6秒程度8秒程度
App-V25秒程度10秒程度20秒程度

では、どうしたらよいのか
起動時間をいかに短くするか
車で言えばドラッグレース専用にチューニングする事になります。
スタートダッシュをいかに決めるか、トップスピードまで
どれだけ早く到達するかです。
ポイントは、
・軽量化
・環境、風土に合わせた最適化
・過給器の搭載(ターボ)

しかし。。。チューニングを頑張って地道にやるよりも
簡単に速くすることができます。
それは、速いマシンに乗り換えることです。(笑)
当たり前ですが、メモリ、CPU、特にHDDのI/Oが速い物を使う事が
最も簡単で効果的です。SSDを使うだけで爆速です。
※お約束ですがチューニングなので、逆におかしくなったりするかもしれませんので
くれぐれも自己責任でお願いします。

チューニング戦略
前置きが長くなりますが、限られたマシンパワーというレギュレーションの中での
チューニングについて説明したいと思います。

チューニングの戦略です。以下の3点
1.パッケージのサイズを減らす(軽量化)
Office2007 を普通に作ると1.5GBくらいのサイズになってしまいます。
デカすぎます。
※パッケージの圧縮オプションではなく、無圧縮の状態でのサイズを
まずは削ります。

2.仮想環境で管理する物を減らす(ネイティブへのパススルー)
Font やサービス等、必ずしも仮想環境で管理しなくても良いものは
極力ネイティブ環境に事前に設置しておく
※車で言えば、爽快な気候で昼間で晴天時しか走らないなら
エアコン、ヘッドライト、ワイパー等はいらないですよね
利用状況を把握して不要な物を選択して仮想アプリから削ぎ落とし、
ネイティブ側に設置しておきます。

3.ターボの搭載を検討する(スタートアップ時に裏側で仮想環境の準備を行わせる)
例えば Windows にログインした時に、裏側で仮想環境の準備を行わせておく
仮想アプリを起動したときには既に仮想環境の準備が終わっている状態にしておきます。
仮想環境の準備をログイン時にずらす事により、アプリ起動時の速度を上げます。
ちょっとズルイ方法ですが、手段の1つです。
車と一緒で最後は過給器に頼るってことです。

さっそくやってみる。詳細手順
1.パッケージのサイズを減らす(軽量化)
まずは、ThinApp / App-V 共にとにかく不要なファイルを消しまくります。
基本は通常の仮想化の手順となりますのでフルインストールです。
フルインストールを行った後に、不要なファイルを手動で消します。
消しすぎると、当たり前ですが動かなくなったりしますのでご注意を
簡単で効果的なのは

MSOCache フォルダを仮想パッケージから消します。
これだけで700MB位減らせます。
このフォルダはOffice自体がおかしくなった場合に
自動的に修復を行うためのインストールファイルが詰まっています。
イメージ的には、CD-ROMの内容がまるごとコピーされています。
仮想アプリでは、そもそも修復処理が動かないし、動かす必要がない状態を提供するため
このフォルダはオモリ(ゴミ)です。
後は、Installer フォルダにある*.msiファイルも。
*.msp/msiは消しすぎると、逆に上手く動かなくなるのでご注意を。
色々とファイルを削って楽しんでください。樽に剣を刺す「黒ひげ危機一発」ゲームみたいに

2.仮想環境で管理する物を減らす(ネイティブへのパススルー)
まずは、Font を消しましょう。(100MB位あります。)
仮想アプリにFontが含まれていると、便利です。
それは、Fontがインストールされていなくても
そのアプリを利用するときだけ、必要なFontが利用できるからです。
しかしながら、Office の場合はネイティブにも別のバージョンのOfficeが
インストールされている事が多いので、仮想アプリ側にあえて持たなくても
ネイティブの物を利用することにすれば問題ないかとおもいます。

App-V の場合は CSIDL_FONTS
ThinApp の場合は %Fonts%

Office 関連のサービスを無効にしてしまいましょう。
・Machine Debug Manager (MDM)
・Office Source Engine (OSE)

やり方は、
キャプチャ中にOfficeのインストールが終わったらサービスから
この2つを無効にしてしまい、その後キャプチャを終わらせる

【ThinAppの場合】
直接仮想レジストリのサービスの起動タイプを無効に設定する。
HKEY_LOCAL_MACHINE.txtを編集します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\MDM
「Start」を4(無効)にします。


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\OSE
「Start」を4(無効)にします。


更に、念押しです。
Package.iniの[BuildOptions]にAutoStartServices = 0を追加します。


【 App-V の場合】
Sequencerのサービスタブの開いて、この2つのサービスの起動タイプを無効にします。

その他
App-V 限定ですが、仮想で管理するオブジェクト(Mutex等の同期オブジェクト)を
仮想で管理せずにOS側に任せる機能があります。
OSDファイルの<POLICIES>タグに<LOCAL_INTERACTION_ALLOWED>を追加し
TRUEにします。
<VIRTUALENV TERMINATECHILDREN="TRUE">
  <POLICIES>
    <LOCAL_INTERACTION_ALLOWED>TRUE</LOCAL_INTERACTION_ALLOWED>
  </POLICIES>
</VIRTUALENV>


とにかく不要な物は、仮想ファイルシステム/仮想レジストリから消しまくります。

3.ターボの搭載を検討する(スタートアップ時に裏側で仮想環境の準備を行わせる)
2.までのチューニングでかなり速くなると思いますが、4秒の壁がどうしても突破できない場合には
これをやります。

具体的な例としては、Excelを起動して即、終了させる処理をVBScriptで作ります。
それを、スタートアップの処理で実行するイメージです。
これにより、仮想環境が事前に作成されるため、2回目の起動に近い起動パフォーマンスを
得る事ができます。

手順
turbo.vbsと名前をつけたファイルを1つ作ってパッケージに入れて、一緒に仮想化します。
仮想化したTurboのショートカットをスタートアップに追加しておきます。

turbo.vbs記述例
On Error Resume Next
Dim objExcel
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
objExcel.Quit
Set objExcel = Nothing
Call WScript.Sleep(1000*60*60*8)'8時間WScript.exeを仮想環境で動かしておく。

これをパッケージに一緒に入れておきます。
例)Microsoft Office\Office12\turbo.vbs

【 App-V の場合】
配信するアプリの設定画面でWScript.exeを追加します。
起動パラメータにturbo.vbsのフルパスを渡すようにします。
App-Vサーバーのショートカットの作成先で、このWScriptが
スタートアップに追加されるように設定します。

【 ThinApp の場合】
エントリーポイントにWscript.exeを追加します。
Package.iniに以下のように追加する事になります。
[Turbo.exe]
Source=%SystemSystem%\wscript.exe
Shortcut=Microsoft Office Professional 2007.dat ←環境にあわせて変更してください。
CommandLine=%SystemSystem%\wscript.exe "%ProgramFilesDir%\Microsoft Office\Office12\turbo.vbs"
Shortcuts=%Startup%



まとめ
チューニングは簡単ではありませんが、

Officeを仮想化して起動速度の遅さにより、アプリ仮想化の導入を
断念される事がなければ、いいな。と思います。

1.パッケージのサイズを減らす(軽量化)
2.仮想環境で管理する物を減らす(ネイティブへのパススルー)
3.ターボの搭載を検討する(スタートアップ時に裏側で仮想環境の準備を行わせる)
本気で頑張れば、どうにかなるもんですので。
ただし、やりすぎて動かなくなってしまう事もあるので、注意して
楽しみながら、チューニングしてください。
きっと、もっともっと速く出来るはずです。
みなさんの一助にでもなれば幸いです。ということで
フィードバックやご意見あれば、@tunemickyへお願いします。



参考
ThinApp Performance Enhancing Techniques
http://communities.vmware.com/community/vmtn/desktop/thinapp/bootcamp