Windows Server 2008 R2メタファイルのRAM使用量


33

Windows Server 2008 R2 x64を実行するサーバーに4GBのRAMを搭載し、約2〜3百万個のファイル(その大部分はイメージファイル)をホストしています。

1週間にわたって、サーバー上のアプリケーションが、メモリ不足のためにディスクへの過剰なページングが原因でクロールが遅くなり、現在実行中のすべてのサービスにノックオン効果があり、パフォーマンスの問題。

タスクマネージャーで調査したところ、ほとんどすべての4GBが使用中であることに気付きましたが、[プロセス]タブを見ると、そこにあるすべてのメモリ使用量の合計は加算されず、最大で1.5GBしか使用されていないはずです。

Googleを使用して解決策を見つけると、ファイルシステム上のファイルのNTFS情報のキャッシュである「メタファイル」でRAMの大部分が使用されたため、システムがMFTに再度情報を照会する必要がなくなりました。このキャッシュは、タスクマネージャーで「キャッシュ」として、またはSysinternalのRamMapで「スタンバイ」としてクリアまたはマークされることはありません。

KB979149修正プログラムをインストールするよう提案されましたが、インストールしようとすると、「この更新プログラムはお使いのコンピューターには適用されません」と表示されます。

私がこれまでに見つけた一時的な修正は次のとおりです。

  1. SysinternalsのRAMマップを1〜3日ごとに「空のシステムワーキングセット」に使用します。これにより、タスクマネージャーでキャッシュを「スタンバイ」および「キャッシュ」としてマークし、RAMを他のアプリケーションで使用できるようにします。
  2. マシンを再起動します。このサーバーは公開Webサイトにサービスを提供しているため、望ましくありません。

現時点では、数日ごとに2.修正を実行して、ボトルネックレベルに達しないようにする必要があります。

変更前:(800 MBのRAMを使用-他のアプリケーションはこのRAMを使用できません)

ここに画像の説明を入力してください

後:(キャッシュとしてマークされた800 MB RAM-他のアプリケーションで使用可能)

あなたへの私の質問は次のとおりです。このメタファイルのRAM使用量を制限する方法はありますか?


4
2〜3,000,000個のファイルをホストするサーバー上の4GB RAMはばかげています。RAMをアップグレードするか、RAMをアップグレードします。
pauska

1
気にしないで、SysinternalsのCacheSetを使用すると、キャッシュサイズを設定できます。現在、これを間隔を置いて実行しているため、問題が解決しました。
-al2k4

6
RAMを追加しても問題は解決しません。メタファイルキャッシュもそれをいっぱいにします。4 GBで開始し、12 GBに増やしたVMwareゲストでこれを実行しようとしましたが、同じことが起こります。問題は、このメモリはキャッシュ用ですが、Windowsによればキャッシュとしてマークされていないことです。誤ってアクティブ/使用中メモリとしてマークされていますが、残念ながら、実際のプログラムで使用されている実際のアクティブ/使用中メモリを押しつぶし、ディスクへのページングを開始します。物理RAMがいっぱいになるとすべてが遅くなり、元の投稿で述べた2つのソリューションのいずれかを実行する必要があります。

@ al2k4質問が解決された場合、正解の横にあるチェックマークをクリックして、問題を解決済みとしてマークしてください。サーバー障害へようこそ!
マイケルハンプトン

回答:


16

この問題に対処する最良の方法はSetSystemFileCacheSizeMS KB976618が 指示に 使用する指示に従って APIを使用することです。

定期的にキャッシュをクリアしないでください

SetSystemFileCacheSizeキャッシュを定期的にクリアするのではなく関数を使用すると、パフォーマンスと安定性が向上します。キャッシュを定期的にクリアすると、メタファイルやその他の情報が大量にメモリから削除されるため、Windowsは必要な情報をHDDからRAMに再度読み込む必要があります。これにより、キャッシュをクリアするたびに数秒間パフォーマンスが急激に低下し、その後、メモリがメタファイルデータでいっぱいになるとパフォーマンスが徐々に低下します。

このSetSystemFileCacheSize関数を使用すると、Windowsが余分な古いメタファイルデータをスタンバイメモリとしてフラグ付けする最小値と最大値を設定し、通常のキャッシュ機能は現在のリソース要求と通常のキャッシュ優先度に従って使用または破棄できます。これにより、設定したアクティブメモリの最大値よりも多くのメタファイルデータが使用可能になり、Windowsが十分なメモリを維持しながら、他の目的でメモリを使用していない場合にスタンバイデータとしてメモリに格納されます。これは、システムのパフォーマンス特性を常に良好に保つ理想的な状況です。

サードパーティのプログラムはMSでサポートされていません

あなたが私のようであり、実稼働サーバーで未知のサードパーティのバイナリを実行したくない場合は、それらのサーバーで実行する前に公式のMSツールまたは検査可能なコードが必要です。2008 R2のDynCacheツールは、サポートケースに費用をかけることなくM $から取得することは事実上不可能であり、率直に言って、2008年のコードに基づいて、Windowsには動的なサイズ調整に必要な組み込みロジックが既に含まれているため、タスクに対して過度に肥大化しているようですキャッシュ—システムに適切な最大値を知る必要があるだけです。

上記のすべての解決策

64ビットマシンで動作するPowershellスクリプトを作成しました。昇格された特権を持つ管理者として実行する必要があります。10 / Server 2012 R2までの任意のRAMを搭載したVista / Server 2008までのx64 Windows上で、そのまま実行できるはずです。追加のソフトウェアをインストールする必要はありません。その結果、サーバー/ワークステーションがMSによって完全にサポートされたままになります。

設定を永続的にするには、昇格された特権でこのスクリプトを起動するたびに実行する必要があります。Windowsタスクスケジューラがこれを行います。Windowsインストールが仮想マシン内にあり、そのVMに割り当てられたRAMの量を変更する場合、変更後にも実行する必要があります。

システムを再起動したり、サービスをシャットダウンしたりすることなく、運用中であっても、実行中のシステムでいつでもこのスクリプトを実行できます。

# Filename: setfc.ps1
$version = 1.1

#########################
# Settings
#########################

# The percentage of physical ram that will be used for SetSystemFileCache Maximum
$MaxPercent = 12.5

#########################
# Init multipliers
#########################
$OSBits = ([System.IntPtr]::Size) * 8
switch ( $OSBits)
{
    32 { $KiB = [int]1024 }
    64 { $KiB = [long]1024 }
    default {
        # not 32 or 64 bit OS. what are you doing??
        $KiB = 1024 # and hope it works anyway
        write-output "You have a weird OS which is $OSBits bit. Having a go anyway."
    }
}
# These values "inherit" the data type from $KiB
$MiB = 1024 * $KiB
$GiB = 1024 * $MiB
$TiB = 1024 * $GiB
$PiB = 1024 * $TiB
$EiB = 1024 * $PiB


#########################
# Calculated Settings
#########################

# Note that because we are using signed integers instead of unsigned
# these values are "limited" to 2 GiB or 8 EiB for 32/64 bit OSes respectively

$PhysicalRam = 0
$PhysicalRam = [long](invoke-expression (((get-wmiobject -class "win32_physicalmemory").Capacity) -join '+'))
if ( -not $? ) {
    write-output "Trying another method of detecting amount of installed RAM."
 }
if ($PhysicalRam -eq 0) {
    $PhysicalRam = [long]((Get-WmiObject -Class Win32_ComputerSystem).TotalPhysicalMemory) # gives value a bit less than actual
}
if ($PhysicalRam -eq 0) {
    write-error "Cannot Detect Physical Ram Installed. Assuming 4 GiB."
    $PhysicalRam = 4 * $GiB
}
$NewMax = [long]($PhysicalRam * 0.01 * $MaxPercent)
# The default value
# $NewMax = 1 * $TiB


#########################
# constants
#########################

# Flags bits
$FILE_CACHE_MAX_HARD_ENABLE     = 1
$FILE_CACHE_MAX_HARD_DISABLE    = 2
$FILE_CACHE_MIN_HARD_ENABLE     = 4
$FILE_CACHE_MIN_HARD_DISABLE    = 8


################################
# C# code
# for interface to kernel32.dll
################################
$source = @"
using System;
using System.Runtime.InteropServices;

namespace MyTools
{
    public static class cache
    {
        [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool GetSystemFileCacheSize(
            ref IntPtr lpMinimumFileCacheSize,
            ref IntPtr lpMaximumFileCacheSize,
            ref IntPtr lpFlags
            );

        [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool SetSystemFileCacheSize(
          IntPtr MinimumFileCacheSize,
          IntPtr MaximumFileCacheSize,
          Int32 Flags
        );

        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        public static extern int GetLastError();

        public static bool Get( ref IntPtr a, ref IntPtr c, ref IntPtr d )
        {
            IntPtr lpMinimumFileCacheSize = IntPtr.Zero;
            IntPtr lpMaximumFileCacheSize = IntPtr.Zero;
            IntPtr lpFlags = IntPtr.Zero;

            bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags);

            a = lpMinimumFileCacheSize;
            c = lpMaximumFileCacheSize;
            d = lpFlags;
            return b;
        }


        public static bool Set( IntPtr MinimumFileCacheSize, IntPtr MaximumFileCacheSize, Int32 Flags )
        {
            bool b = SetSystemFileCacheSize( MinimumFileCacheSize, MaximumFileCacheSize, Flags );
            if ( !b ) {
                Console.Write("SetSystemFileCacheSize returned Error with GetLastError = ");
                Console.WriteLine( GetLastError() );
            }
            return b;
        }
    }

    public class AdjPriv
    {
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

        [DllImport("advapi32.dll", SetLastError = true)]
        internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        internal struct TokPriv1Luid
        {
            public int Count;
            public long Luid;
            public int Attr;
        }
        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
        internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
        internal const int TOKEN_QUERY = 0x00000008;
        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

        public static bool EnablePrivilege(long processHandle, string privilege, bool disable)
        {
            bool retVal;
            TokPriv1Luid tp;
            IntPtr hproc = new IntPtr(processHandle);
            IntPtr htok = IntPtr.Zero;
            retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
            tp.Count = 1;
            tp.Luid = 0;
            if(disable)
            {
                tp.Attr = SE_PRIVILEGE_DISABLED;
            } else {
                tp.Attr = SE_PRIVILEGE_ENABLED;
            }
            retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
            retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
            return retVal;
        }
    }
}
"@
# Add the c# code to the powershell type definitions
Add-Type -TypeDefinition $source -Language CSharp

#########################
# Powershell Functions
#########################
function output-flags ($flags)
{
    Write-output ("FILE_CACHE_MAX_HARD_ENABLE  : " + (($flags -band $FILE_CACHE_MAX_HARD_ENABLE) -gt 0) )
    Write-output ("FILE_CACHE_MAX_HARD_DISABLE : " + (($flags -band $FILE_CACHE_MAX_HARD_DISABLE) -gt 0) )
    Write-output ("FILE_CACHE_MIN_HARD_ENABLE  : " + (($flags -band $FILE_CACHE_MIN_HARD_ENABLE) -gt 0) )
    Write-output ("FILE_CACHE_MIN_HARD_DISABLE : " + (($flags -band $FILE_CACHE_MIN_HARD_DISABLE) -gt 0) )
    write-output ""
}

#########################
# Main program
#########################

write-output ""

#########################
# Get and set privilege info
$ProcessId = $pid
$processHandle = (Get-Process -id $ProcessId).Handle
$Privilege = "SeIncreaseQuotaPrivilege"
$Disable = $false
Write-output ("Enabling SE_INCREASE_QUOTA_NAME status: " + [MyTools.AdjPriv]::EnablePrivilege($processHandle, $Privilege, $Disable) )

write-output ("Program has elevated privledges: " + ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") )
write-output ""
whoami /PRIV | findstr /I "SeIncreaseQuotaPrivilege" | findstr /I "Enabled"
if ( -not $? )  {
    write-error "user Security Token SE_INCREASE_QUOTA_NAME: Disabled`r`n"
}
write-output "`r`n"


#########################
# Get Current Settings
# Init variables
$SFCMin = 0
$SFCMax = 0
$SFCFlags = 0
#Get Current values from kernel
$status = [MyTools.cache]::Get( [ref]$SFCMin, [ref]$SFCMax, [ref]$SFCFlags )
#typecast values so we can do some math with them
$SFCMin = [long]$SFCMin
$SFCMax = [long]$SFCMax
$SFCFlags = [long]$SFCFlags
write-output "Return values from GetSystemFileCacheSize are: "
write-output "Function Result : $status"
write-output "            Min : $SFCMin"
write-output ("            Max : $SFCMax ( " + $SFCMax / 1024 / 1024 / 1024 + " GiB )")
write-output "          Flags : $SFCFlags"
output-flags $SFCFlags


#########################
# Output our intentions
write-output ("Physical Memory Detected : $PhysicalRam ( " + $PhysicalRam / $GiB + " GiB )")
write-output ("Setting Max to " + $MaxPercent + "% : $NewMax ( " + $NewMax / $MiB + " MiB )`r`n")

#########################
# Set new settings
$SFCFlags = $SFCFlags -bor $FILE_CACHE_MAX_HARD_ENABLE # set max enabled
$SFCFlags = $SFCFlags -band (-bnot $FILE_CACHE_MAX_HARD_DISABLE) # unset max dissabled if set
# or if you want to override this calculated value
# $SFCFlags = 0
$status = [MyTools.cache]::Set( $SFCMin, $NewMax, $SFCFlags ) # calls the c# routine that makes the kernel API call
write-output "Set function returned: $status`r`n"
# if it was successfull the new SystemFileCache maximum will be NewMax
if ( $status ) {
    $SFCMax = $NewMax
}


#########################
# After setting the new values, get them back from the system to confirm
# Re-Init variables
$SFCMin = 0
$SFCMax = 0
$SFCFlags = 0
#Get Current values from kernel
$status = [MyTools.cache]::Get( [ref]$SFCMin, [ref]$SFCMax, [ref]$SFCFlags )
#typecast values so we can do some math with them
$SFCMin = [long]$SFCMin
$SFCMax = [long]$SFCMax
$SFCFlags = [long]$SFCFlags
write-output "Return values from GetSystemFileCacheSize are: "
write-output "Function Result : $status"
write-output "            Min : $SFCMin"
write-output ("            Max : $SFCMax ( " + $SFCMax / 1024 / 1024 / 1024 + " GiB )")
write-output "          Flags : $SFCFlags"
output-flags $SFCFlags

上部近くに、$MaxPercent = 12.5新しい最大ワーキングセット(アクティブメモリ)を合計物理RAMの12.5%に設定する行があります。Windowsは、システムの要求に基づいてアクティブメモリ内のメタファイルデータの量を動的にサイズ調整するため、この最大値を動的に調整する必要はありません。

これは、マップされたファイルキャッシュが大きくなりすぎるという問題を解決するものではありません。

また、GetSystemFileCacheSizePowershellスクリプトを作成し、StackOverflowに投稿しました


編集:また、同じPowershellインスタンスからこれらの2つのスクリプトのいずれかを複数回実行しないでください。そうしないと、Add-Type呼び出しが既に行われているというエラーが表示されます。

編集:SetSystemFileCacheSizeスクリプトをバージョン1.1に更新し、適切な最大キャッシュ値を計算し、ステータス出力レイアウトを改善しました。

編集:Windows 7ラップトップをアップグレードしました。Windows10でスクリプトが正常に実行されることを伝えることができますが、まだ必要かどうかはテストしていません。しかし、仮想マシンのHDDファイルを移動しても、システムは安定しています。


DynCacheツールはmicrosoft.com/en-us/download/details.aspx?id=9258から無料でダウンロードでき、2008 R2をサポートしています。
ヤクブベレザンスキ14年

今です。R2ウィンドウのリリースとDynCacheのリリースの間には長い時間がありました。msブログ投稿の更新については、blogs.technet.com / b / yongrhee / archive / 2010/02/16 /…を参照してください。さらに別のサービスを実行するために余分なリソースを必要としないため、私は今でも私のソリューションを好んでいます。私たちのサーバーは私のスクリプトで非常に安定しているので、DynCacheに切り替えるつもりはありません。
BeowulfNode42 14年

@ BeowulfNode42-マップされたファイルキャッシュが大きくなる問題があります。それを解決する方法についての指針はありますか?システムファイルのキャッシュサイズを設定することで、その問題も解決されると思いましたか?!場合は、任意のアイデアを持っていますか(肥大化) DynCacheツールは、その問題を解決するのでしょうか?
リーベン・キースメーカーズ

fwiw-テストサーバーで試してみたところ、マップされたファイル(rammap)が12GBアクティブ、0GBスタンバイから8GBアクティブ、4GBスタンバイになりました。すべての意図と目的のために、これはマップされたファイルでも機能するようです?!
リーベン・キースメーカーズ

@LievenKeersmaekersそれは奇妙です。おそらく、それは何らかの効果の流れです。高速ストレージから低速にファイルをコピーするときに発生するマップファイルキャッシュの問題を解決する良い方法に出くわしていませんが、DynCacheツールを試したことがありません。バックアップを管理するサーバーの速度が低下します。将来の参考のために、そのテストシステムにはどのくらいのRAMがあり、12.5%の設定でポストされたスクリプトを実行しましたか?
BeowulfNode42

4

Windows OSでのメモリまたはディスクキャッシュの内部動作に関する専門家であるとは言いませんが、次の2つの見解があります。

  1. OSがメモリにデータをキャッシュしなかった場合、メモリよりも指数関数的に遅いストレージメディアであるディスクからデータを読み取る必要があるため、現在表示されているパフォーマンスの問題はほぼ確実に悪化します。

  2. 問題の原因ではなく、問題の症状を処理して問題を解決しようとしています。この問題の原因はほぼ確実に十分な物理RAMの不足であり、私の提案はそれに対処することです。

さらに、キャッシュが1.5GBのRAMを使用している場合、他のプロセスやサービスのメモリ使用量はどれくらいか、そして解決策は潜在的な問題についてその使用量を調査することかもしれません。


まさに。OPがメタファイルのRAM使用量を削減した場合、システムはメモリ内のメタデータが少なくなるため、ディスクからより多くのメタデータをロードする必要があり、事態が悪化します。
デビッドシュワルツ

1
フィードバックをお寄せいただきありがとうございます。サーバーは主にMySQLデータベースを備えたWebサーバーであり、ファイルをあまり頻繁に読み取らないため、キャッシュにないメタデータのわずかな影響は最小限であり、クリアするとパフォーマンスが劇的に向上します。キャッシュサイズがますます大きくなるのは、時間とともに読み取るさまざまなファイルの数です。より多くのRAMで解決できることはよくわかっていますが、ページングを回避するためにサーバー上のアプリケーションまたはスクリプトが本当に必要なときにメモリを解放するのが「キャッシュ」の概念ではないでしょうか。この特定のキャッシュが常にアクティブとしてマークされている理由は私を混乱させます。
al2k4

明らかに、この問題を自分で経験したことはありません。32、64、および128 GBのRAMを搭載した多くの人々がこの問題を抱えています。メタファイルデータによってRAMが過剰に消費され、ウィンドウがアクティブではなくスタンバイ(キャッシュ)メモリとしてマークされているために解放されません。回答で説明したようにSetSystemFileCacheSize APIを使用すると、Windowsはメタファイルデータの多くをスタンバイメモリとして強制的にフラグを立て、キャッシュ管理システムはRAMに保持するものと破棄するものに優先順位を付けることができます。
BeowulfNode42 14年

たくさんトロール?この質問は2年以上前のものです。
joeqwerty 14年

@joeqwerty私はこの問題に関するネット上の新しい投稿を常に見ます。関連する検索の多くがこの質問に到達します。私は自分の答えを更新していたので、あなたの答えは「役に立たない」と思うので、そのようにマークして理由をコメントしました。それが私を荒らしにするなら、それである。
BeowulfNode42 14年

3

RAMを追加するだけの明らかで効果のないソリューションを提供した人々には、この問題を直接対処していないことは明らかです。

以前のポスターで述べたように、問題でどのくらいのRAMを投入しても問題ありません...すべてがいっぱいになります。32ビット(2003)から64ビット(2008)に移行したアトラシアンツールセットをアプリサーバーで実行しています。パフォーマンスの低下があることがすぐに明らかになりました。

タスクマネージャーを見ると、ほとんどすべてのメモリが消費されていました。実行中のプロセスはこれを反映していませんが。メモリを8 GBから16 GBに増やすと、問題により追加のメモリも消費されました。

問題を処理する唯一の方法は、サーバーを再起動することでした。これにより、プロセスと同じメモリ使用量(約3.5 GB)が削減されました。これは1日かそこらで再び登り始めました。

これはMicrosoftの新しいバグ/機能であることがわかっていたので、この記事を喜んで見つけました。マイクロソフトがこの重要な詳細をユーザーが理解できるようにする方法を気に入っています。ネイティブユーティリティと思われるRamMapをダウンロードしましたが、メタファイルの使用状況を確認できます。キャッシュは数日ごとにクリアされるように設定しますが、これで問題が解決することを願っています。

興味深いのは、移行したサーバーのいくつかでこの問題が発生したことだけであるため、メタファイルが特定の種類のアプリケーションからのみ供給されているのではないかと考えています。


1
私の経験では、メタファイルのメモリ使用量は、ファイルシステムメタデータのサイズを超えて大きくなることはありません(結局キャッシュです)。したがって、RAMをアップグレードして、ファイルシステムメタデータがメモリに収まるようにすることは、少なくともいくつかの場合に実行可能なソリューションです。また、クライアントは、数か月間は触れられていない数百万の一時ファイルなどの不要なものを削除することにより、ファイルシステムのメタデータのサイズを小さくすることを推奨しています。Windowsがアプリケーションメモリよりもメモリ内のNTFSメタデータを効率的に好むのはかなり厄介ですが、メモリ内のMFTがないと、ファイルのクラスターの検索がひどく遅くなる可能性があります。
ジェームズL

2
私は同意します-ラムを追加しても問題は修正されません。それはさらに消費し、他のすべてのプロセスは最終的に停止します。私は最近24 GBにアップグレードしましたが、SQLは8(罰金)を使用し、メタファイルには12しかありません。JamesN-定期的にクリアするためにどのツールを使用していますか?
サートーマ

2

この問題は、SysInternals CacheSetツールを使用して迅速かつ無料で対処できます。ワーキングセットの最大値を、システムRAMの量よりも少ない適切な値に設定して適用するだけです。


1

とても直接的なことで申し訳ありませんが、サーバーを最近のワークステーションより少し高いRAMにアップグレードするのはどうですか?16GBのmemroyは非常に安価です。あなたの時間の半日よりも安価です。


2
これで問題は解決しますが、サーバーはサードパーティによってリモートでホストされます。ホストは毎月RAMを増やすためだけに多額を請求します。したがって、可能であればそれを避けたいと思います。
al2k4

2
うん。推測してください;)これが私が私のハードウェアを買う理由です。ホストはクレイジーです-3か月でRAMを購入できます。さて、学ぶべき教訓:専門外の設定があなたに噛み付くように戻ってきます。
トムトム

すべての64ビットWindowsシステムでは、アクティブメモリに保持するメタファイルデータの最大量を1TBに設定しています(他のメモリがさらに必要な場合に使用できるキャッシュスタンバイメモリとして扱われません)。私はあなたのことは知りませんが、それだけのメモリを搭載したウィンドウボックスはまだ見ていません。HDDに保存されているより多くのファイルを使用するために、RAMを追加する必要はありません。NTFSは、ボリュームあたり最大4,294,967,295ファイルをサポートすることになっています。単一の4TB NTFSドライブは、9億を超えるファイルをサポートできるはずです。その上でデフラグまたはバックアップを実行してみてください。失敗またはクロールされます。
BeowulfNode42 14年

1
はい、「サーバー」のRAMが強力なラップトップよりも少ない場合に必要です。これは「途方もなく高くなる」ことではありません。それは「サーバーがその名前にふさわしいことを十分に得る」ことです。
トムトム14年

1

Microsoft DynCacheツールをダウンロードするためのリンクがあります-チケットを作成したり、支払いをする必要はありません。 http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258

(おologiesび-これはR2バージョンではないことに気づいただけです)

知られている継続的なキャッシュ成長のための問題は、Microsoftのブログでここで説明されています http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx

[更新] Windows Server 2008 R2の動作修正。

CodeplexでサンプルC#コードを見つけ、Visual StudioでコンソールC#プロジェクトをすばやく作成し、コンパイルし、動作しました。

https://asstoredprocedures.svn.codeplex.com/svn/ASSP/FileSystemCache.cs

注:ここにあるMicrosoft.AnalysisServices.AdomdClientへの参照を追加する必要があります。

C:\ Program Files(x86)\ Microsoft.NET \ ADOMD.NET

(私の場合は)XMLaDiscoverへの不要な参照を使用してClearAllCaches()メソッドをコメントアウトします。これをTaskSchedulerに投げます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.