Sử dụng RAM Metafile Windows Server 2008 R2


33

Tôi có một máy chủ chạy Windows Server 2008 R2 x64 với 4GB RAM, lưu trữ khoảng 2-3 triệu tệp, phần lớn là các tệp hình ảnh.

Trong suốt một tuần, tôi nhận thấy rằng các ứng dụng trên máy chủ bị chậm thu thập dữ liệu do phân trang quá nhiều vào đĩa do bộ nhớ thấp, gây ảnh hưởng đến tất cả các dịch vụ hiện đang chạy trên nó, gây ra lỗi chính vấn đề hiệu suất.

Khi điều tra trong Trình quản lý tác vụ, tôi nhận thấy rằng hầu hết tất cả 4GB đã được sử dụng nhưng khi bạn nhìn vào tab Quy trình, tổng số tất cả mức sử dụng bộ nhớ không được thêm vào và tối đa chỉ có 1,5 GB được sử dụng.

Sử dụng Google để tìm giải pháp, có vẻ như hầu hết RAM được sử dụng trong "Metafile" là bộ đệm thông tin NTFS cho các tệp trên hệ thống tệp để hệ thống không phải truy vấn lại MFT để lấy thông tin. Bộ đệm này không bao giờ bị xóa hoặc được đánh dấu là "bộ đệm" trong Trình quản lý tác vụ hoặc là "Chế độ chờ" trong RamMap của Sysiternal.

một đề xuất để cài đặt hotfix KB979149 nhưng khi cố gắng cài đặt nó, nó nói "Bản cập nhật này không áp dụng cho máy tính của bạn".

Các sửa chữa tạm thời duy nhất tôi đã tìm thấy cho đến nay là:

  1. Sử dụng RAMmap từ Sysiternals để "Bộ làm việc hệ thống trống" cứ sau 1-3 ngày đánh dấu bộ đệm là "chế độ chờ" và "bộ đệm" trong Trình quản lý tác vụ để các ứng dụng khác có thể sử dụng RAM.
  2. Khởi động lại máy, điều không mong muốn vì máy chủ này đang phục vụ các trang web công cộng.

Hiện tại tôi phải thực hiện 2. sửa lỗi vài ngày một lần để ngăn nó đạt đến mức tắc nghẽn.

Trước: (800 MB RAM được sử dụng - các ứng dụng khác không thể sử dụng RAM này)

nhập mô tả hình ảnh ở đây

Sau: (800 MB RAM được đánh dấu là bộ đệm - có sẵn cho các ứng dụng khác)

Vì vậy, câu hỏi của tôi cho tất cả các bạn là: Có phương pháp nào tồn tại ngoài đó để hạn chế việc sử dụng RAM của siêu dữ liệu này không?


4
RAM 4GB trên máy chủ lưu trữ 2-3 triệu tệp là vô lý. Nâng cấp RAM của bạn hoặc nâng cấp RAM của bạn.
pauseka

1
Đừng bận tâm, CacheSet của Sysiternals cho phép tôi đặt kích thước bộ đệm, hiện đang chạy này theo chu kỳ và làm như vậy đã giải quyết được vấn đề cho tôi!
al2k4

6
Thêm RAM không giải quyết được vấn đề. Bộ đệm ẩn metafile cũng sẽ lấp đầy điều đó. Tôi đã thử làm điều này trên một máy khách VMware bắt đầu với 4 GB và tăng lên 12 GB và điều tương tự cũng xảy ra. Vấn đề là bộ nhớ này dành cho mục đích lưu trữ, nhưng không được đánh dấu là bộ đệm theo Windows. Nó được đánh dấu không chính xác là bộ nhớ Active / In Use, và thật không may, khi nó phát triển thành bộ nhớ REAL Active / In Use được sử dụng bởi các chương trình thực và bắt đầu phân trang vào đĩa. Khi RAM vật lý đầy lên, mọi thứ sẽ chậm lại và bạn phải thực hiện một trong hai giải pháp như bài viết gốc đã đề cập.

@ al2k4 Nếu câu hỏi của bạn đã được giải quyết, vui lòng đánh dấu nó là đã giải quyết bằng cách nhấp vào dấu kiểm bên cạnh câu trả lời đúng. Chào mừng bạn đến với Lỗi Máy chủ !
Michael Hampton

Câu trả lời:


16

Phương pháp tốt nhất để xử lý vấn đề này là sử dụng SetSystemFileCacheSizeAPI như hướng dẫn MS KB976618 được sử dụng để hướng dẫn .

Không định kỳ xóa bộ nhớ cache

Sử dụng SetSystemFileCacheSizechức năng thay vì xóa bộ nhớ cache định kỳ giúp cải thiện hiệu suất và tính ổn định. Xóa bộ nhớ cache định kỳ sẽ dẫn đến quá nhiều siêu dữ liệu và thông tin khác bị xóa khỏi bộ nhớ và Windows sẽ phải đọc lại thông tin cần thiết trở lại vào RAM từ ổ cứng. Điều này tạo ra hiệu suất giảm đột ngột và nghiêm trọng trong vài giây bất cứ khi nào bạn xóa bộ nhớ cache, sau đó là hiệu suất tốt sẽ giảm dần khi bộ nhớ lấp đầy dữ liệu siêu dữ liệu.

Việc sử dụng các SetSystemFileCacheSizehàm đặt tối thiểu và tối đa sẽ dẫn đến việc Windows đánh dấu dữ liệu siêu dữ liệu cũ dư thừa thành bộ nhớ dự phòng mà các chức năng bộ đệm thông thường có thể sử dụng hoặc loại bỏ theo nhu cầu tài nguyên hiện tại và các ưu tiên bộ đệm thông thường. Điều này cũng cho phép nhiều dữ liệu siêu dữ liệu hơn mức tối đa của bộ nhớ hoạt động bạn đặt, để ở trong bộ nhớ dưới dạng dữ liệu dự phòng nếu Windows không sử dụng bộ nhớ cho bất cứ điều gì khác, trong khi vẫn duy trì nhiều bộ nhớ khả dụng. Đây là tình huống lý tưởng giữ cho các đặc tính hiệu suất của hệ thống luôn luôn tốt.

Các chương trình của bên thứ ba không được MS hỗ trợ

Nếu bạn giống tôi và không muốn chạy nhị phân từ một bên thứ ba không xác định nào đó trên máy chủ sản xuất của mình, bạn muốn có một công cụ MS chính thức hoặc một số mã bạn có thể kiểm tra trước khi chạy trên các máy chủ đó. Công cụ DynCache cho 2008 R2 thực tế không thể có được từ M $ mà không phải trả tiền cho một trường hợp hỗ trợ và thật lòng mà nói, dựa trên mã cho năm 2008, nó dường như quá phình to cho nhiệm vụ vì Windows đã có sẵn logic cần thiết để kích thước linh hoạt bộ nhớ cache mà nó chỉ cần biết tối đa thích hợp cho hệ thống của bạn.

Giải pháp cho tất cả những điều trên

Tôi đã viết một tập lệnh Powershell hoạt động trên các máy 64 bit. Bạn cần chạy nó như một quản trị viên với các đặc quyền nâng cao. Bạn sẽ có thể chạy nó, như trên mọi x64 windows Vista / Server 2008 cho đến 10 / Server 2012 R2 với bất kỳ dung lượng RAM nào. Bạn không cần phải cài đặt bất kỳ phần mềm bổ sung nào và kết quả là giữ cho máy chủ / máy trạm của bạn được MS hỗ trợ đầy đủ.

Bạn nên chạy tập lệnh này ở mỗi lần khởi động với các đặc quyền nâng cao để cài đặt là vĩnh viễn. Trình lập lịch tác vụ Windows có thể làm điều này cho bạn. Nếu cài đặt Windows nằm trong một máy ảo và bạn thay đổi lượng RAM được phân bổ cho VM đó, bạn cũng nên chạy nó sau khi thay đổi.

Bạn có thể chạy tập lệnh này bất cứ lúc nào trên hệ thống đang chạy ngay cả khi đang sử dụng sản xuất mà không phải khởi động lại hệ thống hoặc tắt bất kỳ dịch vụ nào.

# 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

Có một dòng gần đỉnh nói $MaxPercent = 12.5rằng thiết lập bộ làm việc tối đa mới (bộ nhớ hoạt động) thành 12,5% tổng RAM vật lý. Windows sẽ tự động điều chỉnh kích thước lượng dữ liệu siêu dữ liệu trong bộ nhớ hoạt động dựa trên nhu cầu hệ thống, do đó bạn không cần phải tự động điều chỉnh mức tối đa này.

Điều này sẽ không khắc phục bất kỳ vấn đề nào bạn có với bộ đệm tệp được ánh xạ trở nên quá lớn.

Tôi cũng đã tạo một GetSystemFileCacheSizekịch bản Powershell và đăng nó lên StackOverflow .


Chỉnh sửa: Tôi cũng nên chỉ ra rằng bạn không nên chạy một trong hai tập lệnh này từ cùng một phiên bản Powershell hơn một lần, hoặc bạn sẽ nhận được lỗi mà Add-Typecuộc gọi đã được thực hiện.

Chỉnh sửa: SetSystemFileCacheSizetập lệnh được cập nhật lên phiên bản 1.1 để tính toán giá trị bộ đệm tối đa phù hợp cho bạn và có bố cục đầu ra trạng thái đẹp hơn.

Chỉnh sửa: Bây giờ tôi đã nâng cấp máy tính xách tay Windows 7 của mình, tôi có thể nói với bạn rằng tập lệnh chạy thành công trong Windows 10, mặc dù tôi chưa thử nghiệm nếu vẫn cần thiết. Nhưng hệ thống của tôi vẫn ổn định ngay cả khi di chuyển các tệp HDD máy ảo xung quanh.


Công cụ DynCache có sẵn miễn phí để tải xuống từ microsoft.com/en-us/doad/details.aspx?id=9258 và hỗ trợ 2008 R2.
Jakub Berezanski

Nó bây giờ là. Có một thời gian dài giữa bản phát hành cửa sổ R2 và bản phát hành DynCache. Xem blog.technet.com/b/yongrhee/archive/2010/02/16/ Khăn để cập nhật bài đăng trên blog ms. Tôi vẫn thích giải pháp của mình vì nó không yêu cầu thêm tài nguyên để chạy dịch vụ khác. Các máy chủ của chúng tôi đã trở nên rất ổn định với tập lệnh của tôi, vì vậy tôi sẽ không thay đổi chúng thành DynCache.
BeowulfNode42

@ BeowulfNode42 - Chúng tôi đang gặp vấn đề với bộ đệm tệp được ánh xạ trở nên lớn. Bạn có bất kỳ gợi ý về cách giải quyết điều đó? Tôi đã giả định rằng việc đặt kích thước bộ đệm của tệp hệ thống cũng sẽ giải quyết được vấn đề đó?! Bạn có biết nếu công cụ DynCache (cồng kềnh) sẽ giải quyết vấn đề đó không?
Lieven Keersmaekers

fwiw - Tôi vừa thử trên máy chủ thử nghiệm và Tệp đã ánh xạ (rammap) nhận được từ 12GB Active, 0GB Standby đến 8GB Active, 4GB Standby. Đối với tất cả ý định và mục đích, điều này dường như cũng hoạt động đối với Tệp đã ánh xạ?!
Lieven Keersmaekers

@LievenKeermaekers thật lạ. Có lẽ nó là một loại dòng chảy trên hiệu ứng. Tôi chưa tìm ra cách tốt để giải quyết vấn đề bộ đệm tệp được ánh xạ gặp phải khi sao chép tệp từ lưu trữ nhanh sang chậm, mặc dù tôi chưa thử công cụ DynCache, vì đối với chúng tôi, vấn đề bộ đệm tệp được ánh xạ chủ yếu chỉ là tạm thời gây phiền nhiễu làm chậm các máy chủ quản lý các bản sao lưu của chúng tôi. Để tham khảo trong tương lai, hệ thống kiểm tra đó có bao nhiêu ram và bạn có đang chạy tập lệnh như được đăng với cài đặt 12,5% không, và nếu bạn nhớ hoặc có ghi lại các loại kích thước bộ nhớ khác không?
BeowulfNode42

4

Tôi không tự nhận là một chuyên gia về hoạt động bên trong của bộ nhớ đệm hoặc bộ nhớ đệm trong HĐH Windows, nhưng tôi có hai quan sát:

  1. Nếu HĐH không lưu trữ dữ liệu trong bộ nhớ thì nó sẽ phải đọc từ đĩa, đó là phương tiện lưu trữ chậm hơn theo cấp số nhân, do đó, vấn đề về hiệu năng mà bạn đang gặp bây giờ gần như chắc chắn sẽ tồi tệ hơn.

  2. Bạn đang cố gắng giải quyết vấn đề bằng cách xử lý một triệu chứng của vấn đề thay vì nguyên nhân của vấn đề. Nguyên nhân của vấn đề gần như chắc chắn là thiếu RAM vật lý đầy đủ và đề nghị của tôi sẽ là giải quyết vấn đề đó.

Ngoài ra, trong khi bộ đệm có thể sử dụng 1,5 GB RAM, tôi sẽ tự hỏi việc sử dụng bộ nhớ cho các quy trình và dịch vụ khác là gì và có thể giải pháp là điều tra việc sử dụng đó cho các vấn đề tiềm ẩn.


Chính xác. Nếu OP giảm mức sử dụng RAM của siêu dữ liệu , hệ thống sẽ phải tải thêm siêu dữ liệu từ đĩa vì sẽ ít hơn trong bộ nhớ, khiến mọi thứ trở nên tồi tệ hơn.
David Schwartz

1
Cảm ơn vì bạn đã phản hồi. Vài điều, máy chủ chủ yếu là máy chủ web có cơ sở dữ liệu MySQL và không đọc tệp thường xuyên nên tác động nhẹ của siêu dữ liệu không có trong bộ đệm là tối thiểu, hiệu suất tăng đáng kể khi bị xóa. Đó là số lượng tệp khác nhau mà nó đọc theo thời gian là lý do tại sao kích thước bộ đệm ngày càng cao hơn. Tôi nhận thức rõ rằng nhiều RAM hơn sẽ giải quyết được nó, nhưng không phải ý tưởng về "bộ đệm" là giải phóng bộ nhớ khi các ứng dụng hoặc tập lệnh trên máy chủ thực sự cần nó để tránh phân trang? Tại sao bộ đệm này nhất định luôn được đánh dấu là hoạt động làm tôi bối rối.
al2k4

Rõ ràng bạn chưa bao giờ gặp vấn đề này. Nhiều người có RAM 32, 64 và 128 GB gặp phải vấn đề này khi dữ liệu siêu dữ liệu bị chiếm quá nhiều và các cửa sổ không giải phóng nó vì nó được đánh dấu là bộ nhớ hoạt động và không phải là bộ nhớ chờ (còn gọi là bộ nhớ cache). Sử dụng API SetSystemFileCacheSize như tôi đã mô tả trong câu trả lời của mình buộc Windows phải gắn cờ nhiều dữ liệu siêu dữ liệu là bộ nhớ dự phòng và hệ thống quản lý bộ đệm có thể ưu tiên những gì cần giữ trong RAM và những gì cần loại bỏ.
BeowulfNode42

Troll nhiều không? Câu hỏi này hơn hai tuổi.
joeqwerty

@joeqwerty Tôi thấy bài viết mới trên mạng về vấn đề này mọi lúc. Nhiều tìm kiếm liên quan đến câu hỏi này. Vì tôi đang cập nhật câu trả lời của riêng mình và tôi tin rằng câu trả lời của bạn là "không hữu ích", tôi đã đánh dấu nó như vậy và nhận xét tại sao. Nếu điều đó làm cho tôi một troll, vì vậy hãy là nó.
BeowulfNode42

3

Đối với những người đã đưa ra giải pháp rõ ràng nhưng không hiệu quả khi chỉ cần thêm RAM, bạn rõ ràng chưa giải quyết được vấn đề này.

Như đã nêu bởi một poster trước đó, không có vấn đề gì về việc bạn ném bao nhiêu RAM vào vấn đề ... tất cả sẽ được lấp đầy. Tôi đang chạy một công cụ Atlassian được đặt trên máy chủ ứng dụng của chúng tôi đã được di chuyển từ 32 bit (2003) sang 64 bit (2008). Rõ ràng là có sự mất hiệu suất.

Khi nhìn vào trình quản lý tác vụ, gần như toàn bộ bộ nhớ đã được sử dụng hết; mặc dù các quy trình đang chạy không phản ánh điều này. Khi chúng tôi tăng bộ nhớ từ 8 GB lên 16 GB, vấn đề cũng tiêu tốn thêm bộ nhớ.

Cách duy nhất để xử lý sự cố là khởi động lại máy chủ, điều này làm giảm mức sử dụng bộ nhớ bằng với các quy trình (khoảng 3,5 GB). Điều này bắt đầu leo ​​trở lại trong vòng một ngày hoặc lâu hơn.

Tôi biết đây là một lỗi / tính năng mới của Microsoft và rất vui khi tìm thấy bài viết này. Tôi thích cách Microsoft để lại chi tiết cực kỳ quan trọng này cho người dùng tìm ra. Tôi đã tải xuống RamMap, mà bạn nghĩ sẽ là một tiện ích gốc và bây giờ tôi có thể thấy việc sử dụng Metafile. Chúng tôi sẽ thiết lập bộ nhớ cache để được xóa mỗi vài ngày và hy vọng điều này sẽ giải quyết vấn đề.

Thật thú vị khi tôi chỉ thấy vấn đề này trên một trong số một số máy chủ được di chuyển của chúng tôi, vì vậy tôi tự hỏi liệu metafile chỉ được cung cấp từ một số loại ứng dụng nhất định.


1
Theo kinh nghiệm của tôi, việc sử dụng bộ nhớ metafile sẽ không phát triển vượt quá kích thước của siêu dữ liệu hệ thống tập tin (rốt cuộc đó là bộ nhớ đệm), do đó, nâng cấp RAM để cho phép siêu dữ liệu của hệ thống tập tin phù hợp với bộ nhớ trong một số trường hợp. Tôi cũng đã khuyến nghị khách hàng giảm kích thước của siêu dữ liệu hệ thống tệp bằng cách xóa hành trình, chẳng hạn như hàng triệu tệp tạm thời chưa được chạm vào trong nhiều tháng. Điều khá bất tiện là Windows thích siêu dữ liệu NTFS trong bộ nhớ hơn bộ nhớ ứng dụng, nhưng việc tìm kiếm các cụm cho một tệp có thể chậm khủng khiếp nếu không có MFT trong bộ nhớ.
James L

2
Tôi đồng tình - việc thêm nhiều ram không khắc phục được vấn đề, nó sẽ chỉ tiêu thụ nhiều hơn và tất cả các quy trình khác cuối cùng sẽ dừng lại. Gần đây tôi đã nâng cấp lên 24 GB, chỉ để SQL chiếm 8 (tiền phạt) và có 12 trong siêu dữ liệu .. James N - bạn đang sử dụng công cụ nào để xóa định kỳ?
sirthomas

2

Vấn đề này có thể được giải quyết nhanh chóng và miễn phí bằng cách sử dụng công cụ SysIternals CacheSet. Chỉ cần đặt tối đa bộ làm việc thành giá trị phù hợp nhỏ hơn dung lượng RAM hệ thống và áp dụng.


1

Xin lỗi vì quá trực tiếp nhưng những gì về việc bạn nâng cấp máy chủ lên một lượng ram cao hơn một chút so với những gì máy trạm có những ngày này? Memroy 16gb đang rẻ tiền. Ít tốn kém hơn thậm chí nửa ngày thời gian của bạn.


2
Điều đó sẽ giải quyết tốt nhưng máy chủ của chúng tôi được lưu trữ từ xa bởi bên thứ ba. Máy chủ của chúng tôi sẽ tính một khoản tiền lớn chỉ để tăng RAM hàng tháng. Vì vậy, chúng tôi muốn tránh điều đó nếu có thể.
al2k4

2
Vâng. Đoán xem;) Đây là lý do tại sao tôi mua phần cứng của mình. Các máy chủ thật điên rồ - bạn có thể mua RAM trong 3 tháng. Vâng, bài học để học: một thiết lập không chuyên nghiệp quay trở lại để cắn bạn.
TomTom

Tất cả các hệ thống cửa sổ 64 bit có cài đặt 1TB cho lượng dữ liệu siêu dữ liệu tối đa có trong bộ nhớ hoạt động (không được coi là bộ nhớ chờ được lưu trong bộ nhớ cache sẵn sàng để sử dụng khi những thứ khác cần thêm bộ nhớ). Tôi không biết về bạn nhưng tôi chưa thấy hộp cửa sổ nào có nhiều bộ nhớ trong đó. Bạn không cần phải cài đặt thêm RAM để sử dụng nhiều tệp được lưu trữ trên ổ cứng. NTFS được cho là hỗ trợ tới 4.294.967.295 tệp cho mỗi ổ đĩa. Một ổ đĩa NTFS 4TB duy nhất sau đó có thể hỗ trợ hơn 900 triệu tệp. Hãy thử và chạy phân mảnh hoặc sao lưu trên đó và nó sẽ thất bại hoặc bò.
BeowulfNode42

1
Có, bạn nên có nếu "Máy chủ" của bạn có ít ram hơn máy tính xách tay mạnh mẽ. Đây không phải là về "cao vô lý". Đó là về "có đủ rằng máy chủ xứng đáng với tên đó".
TomTom

1

Dưới đây là liên kết để tải xuống công cụ Microsoft DynCache - không cần tạo vé hoặc trả tiền. http://www.microsoft.com/en-us/doad/details.aspx?displaylang=en&id=9258

(xin lỗi - chỉ nhận thấy rằng đây không phải là phiên bản R2)

Các tiếng vấn đề cho sự phát triển bộ nhớ cache liên tục được mô tả ở đây trên Microsoft blog: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx

[cập nhật] sửa lỗi làm việc cho Windows Server 2008 R2.

Tôi tìm thấy mã C # mẫu trên Codeplex, nhanh chóng tạo một dự án C # console với Visual Studio và được biên dịch, hoạt động.

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

Lưu ý, bạn sẽ cần thêm một tham chiếu đến Microsoft.AnalysisService.AdomdClient có thể tìm thấy ở đây:

C: \ Tệp chương trình (x86) \ Microsoft.NET \ ADOMD.NET

và nhận xét phương thức ClearAllCaches () với (trong trường hợp của tôi) các tham chiếu không cần thiết đến XMLaDiscover. Ném cái này vào TaskScheduler.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.