การใช้ RAM Windows Server 2008 R2 Metafile


33

ฉันมีเซิร์ฟเวอร์ที่รัน Windows Server 2008 R2 x64 พร้อม RAM ขนาด 4GB ซึ่งมีไฟล์อยู่ประมาณ 2-3 ล้านไฟล์ส่วนใหญ่เป็นไฟล์ภาพ

ในช่วงหนึ่งสัปดาห์ที่ผ่านมาฉันสังเกตว่าแอปพลิเคชันบนเซิร์ฟเวอร์ช้าลงเนื่องจากการรวบรวมข้อมูลมากเกินไปเนื่องจากเพจจิ้งมากเกินไปเนื่องจากหน่วยความจำเหลือน้อยซึ่งมีผลกระทบกับบริการทั้งหมดที่ทำงานอยู่ในปัจจุบัน ปัญหาประสิทธิภาพการทำงาน

เมื่อตรวจสอบในตัวจัดการงานฉันพบว่าเกือบ 4GB ทั้งหมดถูกใช้งานอยู่ แต่เมื่อคุณดูในแท็บกระบวนการผลรวมของการใช้หน่วยความจำทั้งหมดที่มีจะไม่เพิ่มขึ้นและอย่างน้อยที่สุดเพียง 1.5GB เท่านั้นที่ควรจะใช้งาน

เมื่อใช้ Google เพื่อค้นหาวิธีแก้ไขปรากฏว่า RAM ส่วนใหญ่ถูกใช้ใน "Metafile" ซึ่งเป็นแคชของข้อมูล NTFS สำหรับไฟล์ในระบบไฟล์เพื่อให้ระบบไม่ต้องสืบค้น MFT เพื่อขอข้อมูลอีก แคชนี้ไม่เคยถูกล้างหรือทำเครื่องหมายว่า "แคช" ในตัวจัดการงานหรือ "สแตนด์บาย" ใน RamMap ของ Sysinternal

มีข้อเสนอแนะให้ติดตั้งโปรแกรมแก้ไขด่วน KB979149 แต่เมื่อพยายามติดตั้งจะมีข้อความระบุว่า "การอัปเดตนี้ไม่สามารถใช้ได้กับคอมพิวเตอร์ของคุณ"

การแก้ไขชั่วคราวเท่านั้นที่ฉันพบจนถึงคือ:

  1. ใช้ RAMmap จาก Sysinternals เป็น "Empty System Working Set" ทุก 1-3 วันซึ่งทำเครื่องหมายว่าแคชเป็น "สแตนด์บาย" และ "แคช" ในตัวจัดการงานเพื่อให้ RAM สามารถใช้งานได้โดยแอปพลิเคชันอื่น
  2. รีบูตเครื่องซึ่งไม่พึงประสงค์เนื่องจากเซิร์ฟเวอร์นี้ให้บริการเว็บไซต์สาธารณะ

ในขณะที่ฉันต้องทำการแก้ไข 2. ทุกสองสามวันเพื่อป้องกันไม่ให้ถึงระดับคอขวด

ก่อนหน้านี้: (ใช้ RAM 800 MB - แอปพลิเคชันอื่นไม่สามารถใช้ RAM นี้ได้)

ป้อนคำอธิบายรูปภาพที่นี่

หลัง: (RAM 800 MB ที่ทำเครื่องหมายว่าแคช - พร้อมใช้งานสำหรับแอปพลิเคชันอื่น ๆ )

ดังนั้นคำถามของฉันสำหรับคุณทั้งหมดคือ: มีวิธีการใด ๆ อยู่ที่นั่นเพื่อ จำกัด การใช้ RAM ของ metafile นี้หรือไม่?


4
4GB RAM บนเซิร์ฟเวอร์ที่โฮสต์ไฟล์ 2-3 ล้านไฟล์นั้นเป็นเรื่องไร้สาระ อัพเกรดแรมของคุณหรืออัพเกรดแรมของคุณ
pauska

1
ไม่เป็นไร CacheSet โดย Sysinternals ช่วยให้ฉันสามารถตั้งค่าขนาดแคชขณะนี้เรียกใช้งานตามช่วงเวลาและการทำเช่นนั้นได้แก้ไขปัญหาให้ฉันแล้ว!
al2k4

6
การเพิ่มแรมไม่สามารถแก้ปัญหาได้ แคชเมตาไฟล์จะเติมเต็มเช่นกัน ฉันได้ลองทำสิ่งนี้กับแขกของ VMware ที่เริ่มต้นด้วย 4 GB และเพิ่มเป็น 12 GB และสิ่งเดียวกันก็เกิดขึ้น ปัญหาคือหน่วยความจำนี้มีวัตถุประสงค์เพื่อแคช แต่ไม่ได้ทำเครื่องหมายเป็นแคชตาม Windows มีการทำเครื่องหมายไม่ถูกต้องว่าเป็นหน่วยความจำที่ใช้งาน / ใช้งานและน่าเสียดายที่หน่วยความจำนั้นขยายตัวออกมาหน่วยความจำ REAL Active / In Use ใช้โดยโปรแกรมจริงและเริ่มเพจไปยังดิสก์ เมื่อฟิสิคัลแรมเติมทุกอย่างช้าลงและคุณต้องทำหนึ่งในสองวิธีดังที่โพสต์ต้นฉบับกล่าวไว้

@ al2k4 หากคำถามของคุณได้รับการแก้ไขแล้วโปรดทำเครื่องหมายว่าแก้ไขได้โดยคลิกที่เครื่องหมายถูกถัดจากคำตอบที่ถูกต้อง ยินดีต้อนรับสู่Server Fault !
Michael Hampton

คำตอบ:


16

วิธีที่ดีที่สุดในการจัดการกับปัญหานี้คือการใช้SetSystemFileCacheSizeAPI เป็นMS KB976618 สั่ง ที่ใช้ในการออกคำสั่ง

อย่าล้างแคชเป็นระยะ

การใช้SetSystemFileCacheSizeฟังก์ชันแทนที่จะล้างแคชจะปรับปรุงประสิทธิภาพและเสถียรภาพเป็นระยะ การล้างแคชเป็นระยะจะส่งผลให้ metafile มากเกินไปและข้อมูลอื่น ๆ ถูกลบออกจากหน่วยความจำและ Windows จะต้องอ่านข้อมูลที่จำเป็นกลับไปสู่ ​​RAM จาก HDD สิ่งนี้จะทำให้ประสิทธิภาพการทำงานลดลงอย่างฉับพลันและรุนแรงเป็นเวลาหลายวินาทีเมื่อใดก็ตามที่คุณล้างแคชตามด้วยประสิทธิภาพที่ดีซึ่งจะค่อยๆลดลงเมื่อหน่วยความจำเต็มไปด้วยข้อมูล metafile

การใช้SetSystemFileCacheSizeฟังก์ชั่นตั้งค่าต่ำสุดและสูงสุดที่จะทำให้ Windows ตั้งค่าสถานะข้อมูลเมตาไฟล์เก่าเกินเป็นหน่วยความจำสแตนด์บายที่ฟังก์ชั่นแคชปกติสามารถใช้หรือทิ้งตามความต้องการทรัพยากรในปัจจุบันและลำดับความสำคัญแคชปกติ สิ่งนี้ยังช่วยให้ข้อมูล metafile มากกว่าหน่วยความจำสูงสุดที่คุณใช้งานอยู่ในหน่วยความจำในฐานะข้อมูลสแตนด์บายหาก Windows ไม่ได้ใช้หน่วยความจำอย่างอื่นในขณะที่ยังคงรักษาหน่วยความจำที่มีอยู่มากมาย นี่เป็นสถานการณ์ในอุดมคติที่ทำให้คุณสมบัติของระบบดีตลอดเวลา

โปรแกรมของบุคคลที่สามไม่รองรับโดย MS

หากคุณเป็นเหมือนฉันและไม่ต้องการเรียกใช้ไบนารีจากบุคคลที่สามที่ไม่รู้จักในเซิร์ฟเวอร์การผลิตของคุณคุณต้องการเครื่องมือ MS อย่างเป็นทางการหรือรหัสบางอย่างที่คุณสามารถตรวจสอบก่อนที่จะทำงานบนเซิร์ฟเวอร์เหล่านั้น เครื่องมือ DynCache สำหรับ 2008 R2 เป็นไปไม่ได้ในทางปฏิบัติที่จะได้รับจาก M $ โดยไม่ต้องจ่ายเงินสำหรับกรณีการสนับสนุนและค่อนข้างตรงไปตรงมาตามรหัสสำหรับปี 2008 ดูเหมือนว่าป่องๆมากเกินไปสำหรับงานเนื่องจาก Windows มีตรรกะในตัว แคช - เพียงแค่ต้องการทราบค่าสูงสุดที่เหมาะสมสำหรับระบบของคุณ

วิธีแก้ปัญหาทั้งหมดที่กล่าวมา

ฉันเขียนสคริปต์ Powershell ที่ทำงานบนเครื่อง 64 บิต คุณต้องเรียกใช้ในฐานะผู้ดูแลระบบด้วยสิทธิ์ระดับสูง คุณควรจะสามารถรันมันได้ตามที่เป็นอยู่ใน x64 windows Vista / Server 2008 ใด ๆ จนถึงและรวมถึง 10 / Server 2012 R2 ด้วย RAM จำนวนเท่าใดก็ได้ คุณไม่จำเป็นต้องติดตั้งซอฟต์แวร์เพิ่มเติมใด ๆ และทำให้เซิร์ฟเวอร์ / เวิร์กสเตชันของคุณรองรับอย่างเต็มที่โดย MS

คุณควรรันสคริปต์นี้ทุกครั้งที่มีการยกระดับสิทธิ์เพื่อให้การตั้งค่าเป็นแบบถาวร Windows Task Scheduler สามารถทำสิ่งนี้ให้คุณได้ หากการติดตั้ง Windows อยู่ในเครื่องเสมือนและคุณเปลี่ยนจำนวน RAM ที่จัดสรรให้กับ VM นั้นคุณควรรันหลังจากการเปลี่ยนแปลง

คุณสามารถเรียกใช้สคริปต์นี้ได้ตลอดเวลาบนระบบที่ใช้งานแม้ในขณะที่ใช้งานจริงโดยไม่ต้องรีบูตระบบหรือปิดบริการใด ๆ

# 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ว่าตั้งค่าชุดการทำงานสูงสุดใหม่ (หน่วยความจำที่ใช้งาน) เป็น 12.5% ​​ของ RAM ทั้งหมดที่มีอยู่จริง Windows จะปรับขนาดข้อมูล metafile ในหน่วยความจำที่ใช้งานอยู่ตามความต้องการของระบบแบบไดนามิกดังนั้นคุณไม่จำเป็นต้องปรับค่าสูงสุดนี้แบบไดนามิก

นี่จะไม่แก้ไขปัญหาใด ๆ ที่คุณมีกับแคชไฟล์ที่แมปมีขนาดใหญ่เกินไป

ผมได้ทำยังมีGetSystemFileCacheSizeสคริปต์ Powershell และโพสต์ไว้ใน StackOverflow


แก้ไข: ฉันควรชี้ให้เห็นว่าคุณไม่ควรเรียกใช้สคริปต์ 2 ตัวใดตัวหนึ่งจากอินสแตนซ์ Powershell เดียวกันมากกว่าหนึ่งครั้งหรือคุณจะได้รับข้อผิดพลาดที่มีการAdd-Typeโทรแล้ว

แก้ไข: SetSystemFileCacheSizeสคริปต์ที่อัปเดตเป็นรุ่น 1.1 ที่คำนวณค่าแคชสูงสุดที่เหมาะสมสำหรับคุณและมีโครงร่างเอาต์พุตสถานะ nicer

แก้ไข: ตอนนี้ฉันได้อัพเกรดแล็ปท็อป Windows 7 ของฉันฉันสามารถบอกคุณได้ว่าสคริปต์ทำงานได้สำเร็จใน Windows 10 แม้ว่าฉันจะยังไม่ได้ทดสอบว่ายังจำเป็นต้องใช้หรือไม่ แต่ระบบของฉันยังคงมีเสถียรภาพแม้ในขณะที่ย้ายไฟล์ HDD เครื่องเสมือนไปรอบ ๆ


เครื่องมือ DynCache นั้นสามารถดาวน์โหลดได้ฟรีจากmicrosoft.com/en-us/download/details.aspx?id=9258และรองรับ 2008 R2
Jakub Berezanski

มันคือตอนนี้ มีเวลานานในการเปิดตัว Windows R2 และ DynCache ดูblogs.technet.com/b/yongrhee/archive/2010/02/16/…สำหรับการอัพเดทบล็อก MS ฉันยังคงต้องการโซลูชันของฉันเนื่องจากไม่ต้องใช้ทรัพยากรเพิ่มเติมในการเรียกใช้บริการอื่น เซิร์ฟเวอร์ของเรามีความเสถียรกับสคริปต์ของฉันดังนั้นฉันจึงไม่เปลี่ยนเป็น DynCache
BeowulfNode42

@ BeowulfNode42 - เรากำลังประสบปัญหากับแคชไฟล์ที่แมปเข้ามามีขนาดใหญ่ คุณมีพอยน์เตอร์เกี่ยวกับวิธีการแก้ไขนั้นหรือไม่? ฉันอยู่ภายใต้การสันนิษฐานว่าการตั้งค่าขนาดแคชไฟล์ระบบจะแก้ไขปัญหานั้นได้หรือไม่! คุณมีความคิดใด ๆ ว่าเครื่องมือ DynCache (ป่อง)จะแก้ปัญหานั้นได้หรือไม่?
Lieven Keersmaekers

fwiw - ฉันเพิ่งลองใช้งานเซิร์ฟเวอร์ทดสอบและไฟล์ Mapped (rammap) ได้รับจาก 12GB ที่ใช้งานอยู่, 0GB สแตนด์บายเป็น 8GB ที่ใช้งานอยู่, 4GB ที่ใช้งานอยู่ สำหรับทุกเจตนาและวัตถุประสงค์นี้ดูเหมือนว่าจะทำงานกับไฟล์ที่แมปด้วยหรือไม่!
Lieven Keersmaekers

@LievenKeersmaekers ที่แปลก บางทีมันอาจจะมีผลกระทบบางอย่างเกิดขึ้น ฉันยังไม่พบวิธีที่ดีในการแก้ปัญหาแคชไฟล์ที่แมปเมื่อใช้การคัดลอกไฟล์จากที่จัดเก็บข้อมูลที่รวดเร็วจนถึงช้า แต่ฉันไม่ได้ลองใช้เครื่องมือ DynCache เพราะสำหรับเราปัญหาแคชของไฟล์ที่แมปนั้นเป็นปัญหาชั่วคราวที่น่ารำคาญ ชะลอตัวลงในเซิร์ฟเวอร์ของเราที่จัดการการสำรองข้อมูลของเรา สำหรับการอ้างอิงในอนาคตระบบทดสอบนั้นมีหน่วยความจำเท่าใดและคุณรันสคริปต์ตามที่โพสต์ด้วยการตั้งค่า 12.5% ​​และหากคุณจำหรือบันทึกขนาดหน่วยความจำประเภทอื่นได้
BeowulfNode42

4

ฉันไม่ได้อ้างว่าเป็นผู้เชี่ยวชาญเกี่ยวกับการทำงานภายในของหน่วยความจำหรือแคชดิสก์ใน Windows OS แต่ฉันมีข้อสังเกตสองประการ:

  1. หากระบบปฏิบัติการไม่ได้แคชข้อมูลในหน่วยความจำมันจะต้องอ่านจากดิสก์ซึ่งเป็นสื่อเก็บข้อมูลที่ช้าลงอย่างมากจากนั้นหน่วยความจำดังนั้นปัญหาด้านประสิทธิภาพที่คุณเห็นตอนนี้จะแย่ลงอย่างแน่นอน

  2. คุณกำลังพยายามที่จะแก้ปัญหาโดยการรักษาอาการของปัญหาแทนสาเหตุของปัญหา สาเหตุของปัญหาคือการขาดแรมทางกายภาพที่เพียงพอและข้อเสนอแนะของฉันคือการแก้ไขปัญหานั้น

นอกจากนี้ในขณะที่แคชอาจใช้ RAM ขนาด 1.5GB ฉันสงสัยว่าการใช้หน่วยความจำสำหรับกระบวนการและบริการอื่น ๆ อย่างไรและวิธีแก้ปัญหาคือการตรวจสอบการใช้งานสำหรับปัญหาที่อาจเกิดขึ้น


เผง หาก OP ลดการใช้ RAM ของ metafile ระบบจะต้องโหลดข้อมูลเมตาเพิ่มเติมจากดิสก์เนื่องจากมีหน่วยความจำน้อยกว่าทำให้หน่วยความจำแย่ลง
David Schwartz

1
ขอบคุณสำหรับความคิดเห็น. มีบางสิ่งที่เซิร์ฟเวอร์ส่วนใหญ่เป็นเว็บเซิร์ฟเวอร์ที่มีฐานข้อมูล MySQL และไม่อ่านไฟล์บ่อยครั้งดังนั้นผลกระทบเล็กน้อยของเมตาดาต้าที่ไม่ได้อยู่ในแคชนั้นมีเพียงเล็กน้อย มันเป็นจำนวนไฟล์ที่แตกต่างกันที่มันอ่านเมื่อเวลาผ่านไปคือสาเหตุที่ขนาดแคชเพิ่มสูงขึ้นเรื่อย ๆ ฉันตระหนักดีว่า RAM มากขึ้นจะแก้ปัญหาได้ แต่ความคิดของ "แคช" ไม่ใช่เพื่อเพิ่มหน่วยความจำเมื่อแอปพลิเคชันหรือสคริปต์บนเซิร์ฟเวอร์ต้องการเพื่อหลีกเลี่ยงการเพจ เหตุใดแคชนี้จึงถูกทำเครื่องหมายว่าแอ็คทีฟทำให้ฉันสับสน
al2k4

เห็นได้ชัดว่าคุณไม่เคยพบปัญหานี้ด้วยตนเอง คนจำนวนมากที่มี 32, 64 และ 128 GB ของ RAM มีปัญหานี้ซึ่งข้อมูล RAM มากเกินไปถูกนำไปใช้โดยข้อมูล metafile และ windows ไม่ปล่อยเนื่องจากมีการทำเครื่องหมายว่าเป็นหน่วยความจำที่ใช้งานอยู่และไม่ใช่สแตน (aka แคช) การใช้ SetSystemFileCacheSize API ดังที่ฉันได้อธิบายไว้ในคำตอบของฉันบังคับให้ Windows ตั้งค่าสถานะข้อมูล metafile ส่วนใหญ่เป็นหน่วยความจำสแตนด์บายและระบบการจัดการแคชนั้นสามารถจัดลำดับความสำคัญของสิ่งที่ต้องเก็บไว้ใน RAM และสิ่งที่จะทิ้ง
BeowulfNode42

หมุนรอบมาก? คำถามนี้มีอายุมากกว่าสองปี
joeqwerty

@ joeqwerty ฉันเห็นโพสต์ใหม่ทั่วเน็ตเกี่ยวกับปัญหานี้ตลอดเวลา การค้นหาที่เกี่ยวข้องจำนวนมากมาถึงคำถามนี้ เนื่องจากฉันกำลังอัปเดตคำตอบของฉันเองและฉันเชื่อว่าคำตอบของคุณคือ "ไม่มีประโยชน์" ฉันทำเครื่องหมายเป็นเช่นนั้นและแสดงความคิดเห็นว่าทำไม ถ้านั่นทำให้ฉันหมุนรอบดังนั้นไม่ว่าจะเป็น
BeowulfNode42

3

สำหรับผู้ที่ให้วิธีการแก้ปัญหาที่ชัดเจน แต่ไม่มีประสิทธิภาพในการเพิ่ม RAM เพิ่มเติมคุณไม่ได้จัดการกับปัญหานี้โดยตรง

ตามที่ระบุไว้โดยผู้โพสต์ก่อนหน้านี้มันไม่สำคัญว่าแรมเท่าไหร่ที่คุณโยนปัญหา ... มันจะเติมเต็ม ฉันกำลังเรียกใช้ชุดเครื่องมือ Atlassian บนแอปเซิร์ฟเวอร์ของเราที่ย้ายมาจาก 32 บิต (2003) เป็น 64 บิต (2008) เห็นได้ชัดทันทีว่ามีการสูญเสียประสิทธิภาพ

เมื่อดูที่ Task Manager หน่วยความจำเกือบทั้งหมดถูกใช้หมด แม้ว่ากระบวนการที่รันอยู่จะไม่สะท้อนสิ่งนี้ เมื่อเราเพิ่มหน่วยความจำจาก 8 GB เป็น 16 GB ปัญหาก็ใช้หน่วยความจำเพิ่มเติมเช่นกัน

วิธีเดียวในการจัดการปัญหาคือการรีสตาร์ทเซิร์ฟเวอร์ซึ่งทำให้การใช้งานหน่วยความจำลดลงเท่ากับกระบวนการ (ประมาณ 3.5 GB) สิ่งนี้เริ่มปีนเขาอีกครั้งภายในหนึ่งวัน

ฉันรู้ว่านี่เป็นข้อผิดพลาด / คุณสมบัติใหม่ของ Microsoft และดีใจที่ได้พบบทความนี้ ฉันชอบที่ไมโครซอฟต์ให้รายละเอียดที่สำคัญทั้งหมดนี้เพื่อให้ผู้ใช้สามารถเข้าใจได้ ฉันดาวน์โหลด RamMap ซึ่งคุณคิดว่าน่าจะเป็นยูทิลิตี้ดั้งเดิมและตอนนี้ฉันสามารถเห็นการใช้งาน Metafile เราจะตั้งค่าแคชให้ล้างทุกสองสามวันและหวังว่าจะช่วยแก้ปัญหาได้

เป็นเรื่องที่น่าสนใจที่ฉันได้เห็นปัญหานี้ในเซิร์ฟเวอร์ที่โยกย้ายของเราหนึ่งในหลาย ๆ เครื่องดังนั้นฉันจึงสงสัยว่าเมตาไฟล์จะถูกป้อนจากแอปพลิเคชันบางประเภทเท่านั้น


1
จากประสบการณ์ของฉันการใช้หน่วยความจำ metafile จะไม่เติบโตเกินขนาดของเมตาดาต้าระบบแฟ้ม (นั่นคือสิ่งที่แคชหลังจากทั้งหมด) ดังนั้นการอัพเกรด RAM เพื่อให้เมตาดาต้าระบบแฟ้มให้พอดีกับหน่วยความจำ ฉันยังแนะนำให้ลูกค้าลดขนาดของข้อมูลเมตาของระบบไฟล์ด้วยการลบ cruft เช่นไฟล์ชั่วคราวหลายล้านไฟล์ที่ไม่ได้สัมผัสมาหลายเดือน เป็นเรื่องที่น่าอึดอัดใจที่ Windows ชอบเมตาดาต้า NTFS อย่างมีประสิทธิภาพในหน่วยความจำมากกว่าแอปพลิเคชันหน่วยความจำ แต่การค้นหากลุ่มไฟล์อาจช้าลงอย่างมากโดยไม่ต้องใช้ MFT ในหน่วยความจำ
James L

2
ฉันเห็นด้วย - การเพิ่ม ram มากขึ้นไม่สามารถแก้ไขปัญหาได้มันจะกินมากขึ้นและกระบวนการอื่น ๆ ทั้งหมดจะหยุดชะงักในที่สุด ฉันเพิ่งอัพเกรดเป็น 24 GB เพียงเพื่อให้ SQL ใช้งานได้ 8 (ดี) และมี 12 ใน metafile .. James N - เครื่องมือใดที่คุณใช้เพื่อล้างเป็นระยะ?
sirthomas

2

ปัญหานี้สามารถแก้ไขได้อย่างรวดเร็วและฟรีโดยใช้เครื่องมือ SysInternals CacheSet เพียงตั้งค่าสูงสุดของชุดการทำงานเป็นค่าที่เหมาะสมน้อยกว่าจำนวน RAM ระบบและใช้


1

ขออภัยเป็นโดยตรง แต่สิ่งที่เกี่ยวกับคุณอัพเกรดเซิร์ฟเวอร์เป็นจำนวนหน่วยความจำที่สูงกว่าเล็กน้อยวันนี้มีเวิร์กสเตชัน? memgb ขนาด 16gb ราคาถูก ราคาถูกกว่าครึ่งวัน


2
นั่นจะช่วยแก้ปัญหาได้ดี แต่เซิร์ฟเวอร์ของเราโฮสต์โดยบุคคลภายนอก โฮสต์ของเราจะเรียกเก็บเงินก้อนใหญ่เพื่อเพิ่มแรมเป็นรายเดือน ดังนั้นเราจึงต้องการหลีกเลี่ยงปัญหานี้หากเป็นไปได้
al2k4

2
ใช่. คาดเดาสิ่ง;) นี่คือเหตุผลที่ฉันซื้อฮาร์ดแวร์ของฉัน โฮสต์เป็นบ้าคุณสามารถซื้อแรมได้ใน 3 เดือน บทเรียนที่ต้องเรียนรู้: การตั้งค่าที่ไม่เป็นมืออาชีพกลับมากัดคุณ
TomTom

ระบบ windows 64 บิตทั้งหมดมีการตั้งค่า 1TB สำหรับข้อมูล metafile สูงสุดที่มีอยู่ในหน่วยความจำที่ใช้งานอยู่ (ไม่ถือว่าเป็นหน่วยความจำสแตนด์บายแคชพร้อมที่จะใช้เมื่อสิ่งอื่น ๆ ต้องการหน่วยความจำมากขึ้น) ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันยังไม่เห็นกล่องหน้าต่างที่มีหน่วยความจำขนาดใหญ่อยู่ในนั้น คุณไม่ควรติดตั้ง RAM เพิ่มเติมเพื่อใช้ประโยชน์จากไฟล์ที่เก็บไว้ใน HDD NTFS ควรรองรับไฟล์ได้สูงสุด 4,294,967,295 ไฟล์ต่อโวลุ่ม ไดรฟ์ NTFS 4TB เดียวจะสามารถรองรับไฟล์ได้มากกว่า 900 ล้านไฟล์ ลองและเรียกใช้ defrag หรือสำรองข้อมูลนั้นและมันจะล้มเหลวหรือรวบรวมข้อมูล
BeowulfNode42

1
ใช่คุณควรมีถ้า "เซิร์ฟเวอร์" ของคุณมี RAM น้อยกว่าแล็ปท็อปที่มีประสิทธิภาพ นี่ไม่เกี่ยวกับ "รับสูงขัน" มันเกี่ยวกับ "ขอให้เพียงพอที่เซิร์ฟเวอร์สมควรได้รับชื่อ"
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

ฉันพบรหัสตัวอย่าง C # บน Codeplex สร้างโครงการ C # อย่างรวดเร็วด้วย Visual Studio และรวบรวมทำงานได้

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

หมายเหตุคุณจะต้องเพิ่มการอ้างอิงถึง Microsoft.AnalysisServices.AdomdClient ซึ่งสามารถพบได้ที่นี่:

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

และแสดงความคิดเห็นกับวิธี ClearAllCaches () ด้วย (ในกรณีของฉัน) การอ้างอิงที่ไม่จำเป็นไปยัง XMLaDiscover โยนสิ่งนี้ลงใน TaskScheduler


0

คุณสามารถรับเครื่องมือ DynCache จาก MS ที่จะอนุญาตให้ จำกัด การใช้ RAM โดย metafile

คลิกที่นี่เพื่อรับเครื่องมือจาก MS


ลิงก์นั้นไม่ได้ให้อะไรสำหรับระบบ 2008 R2 M $ ยังคงต้องการบัตรเครดิตของคุณเพื่อให้คุณสามารถชำระเงินเพื่อแก้ไขปัญหาที่ทราบนี้
BeowulfNode42
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.