Windows Server 2008 R2 메타 파일 RAM 사용량


33

약 2 ~ 3 백만 개의 파일을 호스팅하는 4GB RAM으로 Windows Server 2008 R2 x64를 실행하는 서버가 있으며 대부분은 이미지 파일입니다.

일주일 동안 메모리 부족으로 인해 디스크에 대한 과도한 페이징으로 인해 서버의 응용 프로그램이 크롤링 속도가 느려져 현재 실행중인 모든 서비스에 영향을 미쳐 주요한 원인이되는 것으로 나타났습니다 성능 문제.

작업 관리자에서 조사한 결과 거의 모든 4GB가 사용 중이라는 것을 알았지 만 프로세스 탭에서 볼 때 모든 메모리 사용량의 합계가 합산되지 않고 최대 1.5GB 만 사용 중입니다.

구글을 사용하여 해결책을 찾은 결과, 대부분의 RAM은 파일 시스템의 파일에 대한 NTFS 정보 캐시 인 "메타 파일"에서 사용되었으므로 시스템은 정보를 위해 MFT를 다시 조회 할 필요가 없습니다. 이 캐시는 작업 관리자에서 절대로 "캐시"로 표시되거나 Sysinternal의 RamMap에서 "대기"로 표시되지 않습니다.

있었다 제안 KB979149 핫픽스를 설치하기는하지만를 설치하려고 할 때, 그것은 "이 업데이트는 컴퓨터에 적용 할 수 없다"말했다.

지금까지 찾은 유일한 임시 수정 사항은 다음과 같습니다.

  1. 1-3 일마다 Sysinternals에서 "Empty System Working Set"으로 RAMmap을 사용하면 작업 관리자에서 캐시가 "대기"및 "캐시"로 표시되어 다른 응용 프로그램에서 RAM을 사용할 수 있습니다.
  2. 이 서버가 공개 웹 사이트를 제공하므로 바람직하지 않은 시스템을 재부팅하십시오.

현재 병목 수준에 도달하지 않도록 며칠마다 2. 수정을 수행해야합니다.

이전 : (800MB RAM 사용-다른 응용 프로그램에서이 RAM을 사용할 수 없음)

여기에 이미지 설명을 입력하십시오

이후 : (캐시로 표시된 800MB RAM-다른 응용 프로그램에서 사용 가능)

그래서 당신에게 내 질문은 :이 메타 파일의 RAM 사용을 제한하는 방법이 있습니까?


4
2-3 백만 파일을 호스팅하는 서버의 4GB RAM은 터무니 없습니다. RAM을 업그레이드하거나 RAM을 업그레이드하십시오.
pauska

1
Sysinternals의 CacheSet을 사용하면 캐시 간격을 설정할 수 있습니다. 현재 간격을두고이를 실행하면 문제가 해결되었습니다.
al2k4

6
RAM을 추가해도 문제가 해결되지 않습니다. 메타 파일 캐시도 그 내용을 채 웁니다. 4GB로 시작하여 12GB로 늘린 VMware 게스트 에서이 작업을 시도했지만 동일한 일이 발생합니다. 문제는이 메모리가 캐시 용이지만 Windows에 따라 캐시로 표시되지 않는다는 것입니다. 활성 / 사용 중 메모리로 잘못 표시되고 불행히도 실제 프로그램에서 사용하는 실제 활성 / 사용 중 메모리가 가득 차서 디스크로 페이징을 시작합니다. 물리적 RAM이 가득 차면 모든 것이 느려지고 언급 한 원래 게시물과 같이 두 가지 솔루션 중 하나를 수행해야합니다.

@ al2k4 질문이 해결 되었으면 정답 옆에있는 확인 표시를 클릭하여 해결 된 것으로 표시하십시오. 서버 결함에 오신 것을 환영합니다 !
Michael Hampton

답변:


16

이 문제를 처리하는 가장 좋은 방법은 SetSystemFileCacheSizeAPI를 MS KB976618 명령에 지시 하는 데 사용하는 것 입니다.

캐시를 주기적으로 지우지 마십시오

SetSystemFileCacheSize캐시를 지우지 않고 기능을 사용 하면 성능과 안정성이 향상됩니다. 캐시를 주기적으로 지우면 메모리에서 메타 파일 및 기타 정보가 너무 많이 제거되고 Windows에서 필요한 정보를 HDD에서 RAM으로 다시 읽어야합니다. 이렇게하면 캐시를 지울 때마다 몇 초 동안 갑자기 성능이 저하되고 메모리가 메타 파일 데이터로 가득 차면 성능이 저하됩니다.

SetSystemFileCacheSize기능을 사용하면 Windows에서 초과 된 오래된 메타 파일 데이터를 대기 메모리로 플래그 지정하여 일반 캐싱 기능이 현재 자원 요구 및 일반 캐시 우선 순위에 따라 사용하거나 삭제할 수있는 최소값과 최대 값을 설정합니다. 또한 Windows에서 사용 가능한 메모리를 많이 유지하면서 다른 용도로 메모리를 사용하지 않는 경우 설정 한 활성 메모리 최대 값보다 많은 메타 파일 데이터를 대기 데이터로 사용할 수 있습니다. 이것은 시스템의 성능 특성을 항상 양호하게 유지하는 이상적인 상황입니다.

MS는 타사 프로그램을 지원하지 않습니다

나와 같은데 프로덕션 서버에서 알려지지 않은 타사의 바이너리를 실행하지 않으려면 공식 MS 도구 또는 해당 서버에서 실행하기 전에 검사 할 수있는 코드가 필요합니다. 2008 R2 용 DynCache 도구는 지원 사례에 대한 비용을 지불하지 않고 M $에서 구할 수 없으며 2008 년 코드를 기반으로 솔직히 말해서 Windows가 이미 동적 크기 조정에 필요한 내장 논리를 가지고 있기 때문에 작업에 과장된 것처럼 보입니다. 캐시 — 시스템에 적절한 최대 값 만 알고 있으면됩니다.

위의 모든 솔루션

64 비트 컴퓨터에서 작동하는 Powershell 스크립트를 작성했습니다. 관리자 권한으로 관리자 권한으로 실행해야합니다. 모든 크기의 RAM이있는 10 / Server 2012 R2를 포함하여 모든 x64 Windows Vista / Server 2008에서 그대로 실행할 수 있어야합니다. 추가 소프트웨어를 설치할 필요가 없으므로 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 인스턴스 에서이 두 스크립트 중 하나를 두 번 이상 실행해서는 안되며 Add-Type호출이 이미 작성되었다는 오류가 표시됩니다 .

편집 : SetSystemFileCacheSize적절한 최대 캐시 값을 계산하고 상태 출력 레이아웃이 더 좋은 스크립트를 버전 1.1로 업데이트했습니다 .

편집 : 이제 Windows 7 랩톱을 업그레이드했는데 스크립트가 여전히 필요한지 테스트하지는 않았지만 Windows 10에서 스크립트가 성공적으로 실행된다는 것을 알 수 있습니다. 그러나 가상 시스템 HDD 파일을 옮기더라도 시스템은 여전히 ​​안정적입니다.


DynCache 도구는 microsoft.com/en-us/download/details.aspx?id=9258 에서 무료로 다운로드 할 수 있으며 2008 R2를 지원합니다.
Jakub Berezanski

지금이야. R2 windows 릴리스와 DynCache 릴리스 사이에는 오랜 시간이 걸렸습니다. ms 블로그 게시물 업데이트는 blogs.technet.com/b/yongrhee/archive/2010/02/16/… 을 참조하십시오 . 아직 다른 서비스를 실행하기 위해 추가 리소스가 필요하지 않기 때문에 여전히 솔루션을 선호합니다. 우리 서버는 스크립트로 매우 안정적이어서 DynCache로 변경하지 않습니다.
BeowulfNode42

@ BeowulfNode42-매핑 된 파일 캐시가 커지는 데 문제가 있습니다. 그것을 해결하는 방법에 대한 조언이 있습니까? 시스템 파일 캐시 크기를 설정하면 문제가 해결 될 것이라고 가정했습니다! 당신이 경우 어떤 생각이 있습니까 (비 대한) DynCache 도구는 그 문제를 해결할를?
Lieven Keersmaekers

fwiw-테스트 서버에서 방금 시도한 결과 Mapped File (rammap)이 12GB Active, 0GB Standby에서 8GB Active, 4GB Standby로 변경되었습니다. 모든 의도와 목적을 위해 이것은 매핑 된 파일에서도 작동하는 것 같습니다!
Lieven Keersmaekers

@LievenKeersmaekers 이상합니다. 아마도 그것은 일종의 흐름에 영향을 미칩니다. DynCache 도구를 사용해 보지 않았지만 빠른 저장소에서 느린 파일로 파일을 복사 할 때 발생하는 매핑 된 파일 캐시 문제를 해결하는 좋은 방법을 찾지 못했습니다. 매핑 된 파일 캐시 문제는 주로 성가신 임시 문제이므로 백업을 관리하는 서버의 속도가 느려집니다. 나중에 참조 할 수 있도록 테스트 시스템이 얼마나 많은 램을 가지고 있고 12.5 % 설정으로 게시 된대로 스크립트를 실행 했습니까? 다른 유형의 메모리 크기를 기억하거나 기록하고 있습니까?
BeowulfNode42

4

Windows OS에서 메모리 또는 디스크 캐싱의 내부 작업에 대해 전문가라고 주장하지는 않지만 두 가지 관찰 사항이 있습니다.

  1. OS가 메모리의 데이터를 캐시하지 않으면 디스크에서 데이터를 읽어야합니다. 즉, 저장 매체보다 메모리가 기하 급수적으로 느리므로 현재보고있는 성능 문제는 거의 확실하게 나빠질 것입니다.

  2. 문제의 원인 대신 문제의 증상을 치료하여 문제를 해결하려고합니다. 문제의 원인은 거의 충분한 물리적 RAM이 부족한 것이므로 내 제안은이를 해결하는 것입니다.

또한 캐시가 1.5GB의 RAM을 사용하는 동안 다른 프로세스 및 서비스에 대한 메모리 사용이 무엇인지 궁금하고 솔루션이 잠재적 인 문제에 대한 사용을 조사하는 것일 수 있습니다.


정확하게. OP가 메타 파일의 RAM 사용량을 줄인 경우, 시스템은 디스크에 더 적은 양의 메타 데이터를 메모리 에로드 하기 때문에 디스크에서 더 많은 메타 데이터 를로드해야 하므로 상황이 악화됩니다.
David Schwartz

1
피드백 감사드립니다. 서버가 주로 MySQL 데이터베이스가있는 웹 서버이고 파일을 자주 읽지 않으므로 캐시에없는 메타 데이터의 영향이 최소화되는 경우가 거의 없습니다. 시간이 지남에 따라 읽는 다른 파일 수는 캐시 크기가 점점 커지는 이유입니다. 더 많은 RAM이이를 해결한다는 것을 잘 알고 있지만 "캐시"의 개념은 서버의 응용 프로그램이나 스크립트가 페이징을 피하기 위해 실제로 필요할 때 메모리를 확보하는 것이 아닙니까? 이 특정 캐시가 항상 활성으로 표시되어있는 이유는 무엇입니까?
al2k4

이 문제를 직접 경험 한 적이 없습니다. 32, 64 및 128GB의 RAM을 가진 많은 사람들은 메타 파일 데이터가 너무 많은 RAM을 차지하고 Windows가 메모리가 아닌 대기 (일명 캐시) 메모리로 표시되어 해제하지 않는 경우이 문제를 겪습니다. 내 대답에서 설명한대로 SetSystemFileCacheSize API를 사용하면 Windows에서 메타 파일 데이터의 많은 부분을 대기 메모리로 플래그 지정하고 캐시 관리 시스템은 RAM에 보관할 항목과 버릴 항목의 우선 순위를 지정할 수 있습니다.
BeowulfNode42

많이 트롤? 이 질문은 2 세 이상입니다.
joeqwerty

@ joeqwerty 나는이 문제에 대해 그물에 새로운 게시물을 항상 봅니다. 많은 관련 검색이이 질문에 도달합니다. 나는 내 자신의 답변을 업데이트하고 있고 귀하의 답변이 "유용하지 않다"고 생각하기 때문에 그 내용을 표시하고 이유를 설명했습니다. 그것이 트롤이된다면, 그렇게하십시오.
BeowulfNode42

3

RAM을 추가하는 분명하고 비효율적 인 솔루션을 제공 한 사람들에게이 문제를 직접 다루지 않았습니다.

이전 포스터에서 언급했듯이 문제에 RAM을 얼마나 많이 넣는지는 중요하지 않습니다. 모두 채워집니다. 32 비트 (2003)에서 64 비트 (2008)로 마이그레이션 된 앱 서버에서 Atlassian 도구 세트를 실행하고 있습니다. 성능 손실이 있음을 즉시 알 수있었습니다.

작업 관리자를 볼 때 거의 모든 메모리가 사용되었습니다. 실행중인 프로세스가이를 반영하지 않더라도. 메모리를 8GB에서 16GB로 늘리면 문제가 추가 메모리도 소비했습니다.

이 문제를 해결하는 유일한 방법은 서버를 다시 시작하는 것인데, 이로 인해 메모리 사용량이 프로세스 (약 3.5GB)와 동일 해졌습니다. 하루 만에 다시 등반을 시작했습니다.

이것이 새로운 Microsoft 버그 / 기능임을 알고이 기사를 찾아서 기뻤습니다. Microsoft가 사용자에게이 중요한 세부 정보를 남기는 방법을 좋아합니다. 기본 유틸리티 인 RamMap을 다운로드했는데 메타 파일 사용법을 볼 수 있습니다. 며칠마다 캐시를 ​​지우도록 설정하면 문제가 해결되기를 바랍니다.

흥미롭게도 마이그레이션 된 여러 서버 중 하나에서만이 문제가 발생 했으므로 메타 파일이 특정 유형의 응용 프로그램에서만 제공되는지 궁금합니다.


1
필자의 경험에 따르면 메타 파일 메모리 사용량은 파일 시스템 메타 데이터의 크기 (결국 캐싱)보다 크게 증가하지 않으므로 파일 시스템 메타 데이터를 메모리에 맞추기 위해 RAM을 업그레이드하는 것이 최소한의 경우에는 실행 가능한 솔루션입니다. 또한 클라이언트는 몇 달 동안 손대지 않은 수백만 개의 임시 파일과 같은 cruft를 제거하여 파일 시스템 메타 데이터의 크기를 줄이는 것이 좋습니다. Windows가 응용 프로그램 메모리보다 메모리에서 NTFS 메타 데이터를 효과적으로 선호하는 것은 다소 어색하지만 메모리의 MFT가 없으면 파일에 대한 클러스터를 찾는 것이 엄청나게 느릴 수 있습니다.
James L

2
나는 더 많은 램을 추가해도 문제가 해결되지 않고 더 많이 소비하고 다른 모든 프로세스는 결국 중단됩니다. 최근에 24GB로 업그레이드하여 SQL이 8 (정밀)을 차지하고 메타 파일에 12를 갖도록했습니다. James N-주기적으로 지우는 데 사용하는 도구는 무엇입니까?
sirthomas

2

SysInternals CacheSet 도구를 사용하면이 문제를 신속하고 무료로 해결할 수 있습니다. 작업 세트 최대 값을 시스템 RAM의 양보다 적은 적절한 값으로 설정하고 적용하십시오.


1

너무 직접적이어서 죄송하지만 요즘에는 워크 스테이션보다 약간 높은 램으로 서버를 업그레이드하는 것은 어떻습니까? 16 기가 바이트 멤로 이는 저렴합니다. 반나절보다 비싸지 않습니다.


2
그렇게하면 문제가 해결되지만 서버는 타사에서 원격으로 호스팅됩니다. 호스트는 월 단위로 RAM을 늘리기 위해 많은 금액을 청구합니다. 따라서 가능하면이를 피하고 싶습니다.
al2k4

2
네. 무엇을 생각하십시오;) 이것이 내 하드웨어를 구입하는 이유입니다. 호스트는 미쳤다-3 개월 안에 RAM을 구입할 수 있습니다. 음, 배울 교훈 : 비전문가가 당신을 물게됩니다.
TomTom

모든 64 비트 Windows 시스템은 최대 양의 메타 파일 데이터가 활성 메모리에 있도록 1TB로 설정됩니다 (다른 메모리가 더 필요할 때 사용할 준비가 된 캐시 된 대기 메모리로 처리되지 않음). 나는 당신에 대해 모르지만 아직 많은 메모리가 들어있는 창 상자를 보지 못했습니다. HDD에 저장된 더 많은 파일을 사용하기 위해 더 많은 RAM을 설치할 필요는 없습니다. NTFS는 볼륨 당 최대 4,294,967,295 개의 파일을 지원해야합니다. 그러면 단일 4TB NTFS 드라이브가 9 억 개가 넘는 파일을 지원할 수 있어야합니다. 조각 모음이나 백업을 시도하면 실패하거나 크롤링됩니다.
BeowulfNode42

1
예, "서버"에 강력한 랩톱보다 램이 적어야합니다. 이것은 "말도 안될 정도로 높은"것이 아닙니다. 그것은 "서버가 그 이름을 가질만한 가치가있다"는 것입니다.
TomTom

1

다음은 Microsoft DynCache 도구를 다운로드 할 수있는 링크입니다. 티켓을 만들거나 지불 할 필요가 없습니다. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258

(사과-이제 R2 버전이 아님을 알게 됨)

알려진 지속적인 캐시 성장을위한 문제는 마이크로 소프트 블로그에 여기에 설명되어 있습니다 : 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.