Windows 7 / Windows Server 2008 R2 環境でのDynamic Cache Service 利用について
こんにちは。Windows プラットフォームサポートの新川です。
以前、リソース不足について – 番外編1 (64bit 環境での注意点) という記事で、64 bit 環境でシステムキャッシュ (RAMMap で確認した場合は Mapped File や Metafile) で物理メモリを大量に使用してしまう動作についてご紹介しました。この記事の中では、Windows 7 以降の OS ではシステム キャッシュ周りのデザイン変更が行われているとご説明しましたが、やはり Windows Server 2008 R2 でも同様の状況が発生するとのお問い合わせをいただく事があります。
Windows 7 以降の OS では、システムキャッシュをより早く解放出来るようになっているので、物理メモリの大半をシステムキャッシュが占めていてもメモリ確保には問題がない場面も多いのですが、それでも一度にまとまった要求が行われた場合などには「メモリ不足」のエラーになってしまう事があります。対処策としては、システムキャッシュのワーキングセットの閾値を指定する事になりますが、これを行うためのツールとして弊社が公開している Microsoft Windows Dynamic Cache Service では、Windows 7 以降 (OS バージョン 6.1 以降) では意図的に動作しないように制限がかけられているため、これを解除してビルドし直す必要があります。今回の投稿では、Windows Server 2008 R2 環境でMicrosoft Windows Dynamic Cache Serviceを利用する方法についてご紹介します。
[2014 年更新]
最新版の Microsoft Windows Dynamic Cache Service では、Windows 7 / Windows Server 2008 R2 でも動作するように変更が加えらえれました。Windows 7 以降の OS で DynCache サービスをご利用いただく場合は、以下のダウンロード センターより、最新版をダウンロードしてご利用ください。
Microsoft Windows Dynamic Cache Service
OS バージョンのチェックの箇所
Microsoft Windows Dynamic Cache Service には、ダウンロード ファイルの中にこのツールのソースコードも含まれています。この中の DynCache.cpp の 1141 行目付近がバージョン チェックを実施していますが、Windows Server 2008 R2 環境で利用するには下記の (OSVerInfo.dwMinorVersion > 0) を (OSVerInfo.dwMinorVersion > 1) に変更する必要があります。
// Make sure that the OS is not later than Windows Server 2008 OSVerInfo.dwOSVersionInfoSize = sizeof(OSVerInfo); if ( (GetVersionEx (&OSVerInfo) == NULL) ) { dwStatus = GetLastError(); DebugMessage(L"GetVersionEx failed with error code 0x%X!\n", dwStatus); SvcCleanup(dwStatus); return (FALSE); } else { if (OSVerInfo.dwMajorVersion == 6) { if (OSVerInfo.dwMinorVersion > 1) // 0 から 1 に変更します { DebugMessage(L"Dynamic Cache Service only runs on Windows Server 2008 or earlier versions.\n"); SvcCleanup(ERROR_RMODE_APP); return (FALSE); } } else if (OSVerInfo.dwMajorVersion > 6) { DebugMessage(L"Dynamic Cache Service only runs on Windows Server 2008 or earlier versions.\n"); SvcCleanup(ERROR_RMODE_APP); return (FALSE); } } |
ビルド方法
ここでは Microsoft Windows SDK for Windows 7 (以下 SDK) と Windows Driver Kit Version 7.1.0 (以下 WDK) を用いた方法をご紹介します。
1. 以下のダウンロードセンターから、ビルド環境にあったものをダウンロードします。(ISO ファイルになっているので DVD に一旦焼くか、Hyper-V や Virtual PC のゲスト環境でビルド環境を構築できる場合には、ISO のキャプチャで読み込む事になります。)
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 (ISO)
Windows Driver Kit Version 7.1.0
自動再生でインストールが始まりますが、始まらない場合は SDK の場合は setup.exe をクリックしてインストールを開始します。SDK のインストールはウィザードに沿って既定のまま進めて問題ありません。
WDK のインストールは、KitSetup.exe を実行し、インストールのチェックボックスでは Full Development Environment にチェックを入れ、インストールを実行します。
2. インストール完了後、SDK のインストールフォルダ内にある以下を C:\SDK など、スペースを含まないパスへコピーします。
- Include
- Lib
3. Microsoft Windows Dynamic Cache Service 内の DynCache\source フォルダ内にある sources を右クリックのプロパティで読み取り専用を外した後に notepad.exe などのテキスト エディタで開き、以下のように書き換えます。(項目 2 のフォルダを C:\SDK 配下にコピーした場合の例です)
############## DynCache sources file ####################
TARGETNAME=DynCache TARGETPATH=.\obj TARGETTYPE=PROGRAM
# Use the Windows SDK include and lib paths. # The WDK does not contain files for using performance counters. INCLUDES=C:\SDK\Include
SOURCES=DynCache.cpp \ Service.cpp \ debug.cpp \ DynCache.rc
C_DEFINES=-DUNICODE -D_UNICODE
# specify which C runtimes to link with (default is libc.lib) USE_LIBCMT=1
UMENTRY=wmain UMTYPE=console
UMLIBS= C:\SDK\Lib\x64\kernel32.lib \ C:\SDK\Lib\x64\user32.lib \ C:\SDK\Lib\x64\advapi32.lib \ C:\SDK\Lib\x64\Psapi.lib \ C:\SDK\Lib\x64\Pdh.lib |
4. DynCache.cpp の内容変更後 (こちらも読み取り専用のチェックを外す必要があります)、以下のコマンドプロンプトを起動します。
[スタート] - [すべてのプログラム] - [Windows Driver Kits] - [WDK 7600.16385.1] - [Build Environments] - [Windows 7] - [x64 Free Build Environment]
5. 起動したコマンドプロンプト内で、DynCache の source フォルダへ移動し、以下のコマンドでビルドが開始されます。
(画面出力例)
source フォルダ内の obj\amd64 フォルダに DynCache.exe が生成されます。Microsoft Windows Dynamic Cache Service はこのファイルに置き換えて利用ください。Microsoft Windows Dynamic Cache Service のご利用方法については、Read me や Dynamic Cache Service について をご参照ください。