Penggunaan RAM Windows Server 2008 R2 Metafile


33

Saya memiliki server yang menjalankan Windows Server 2008 R2 x64 dengan 4GB RAM yang menampung sekitar 2-3 juta file, yang sebagian besar adalah file gambar.

Lebih dari satu minggu, saya perhatikan bahwa aplikasi pada server melambat menjadi merangkak karena paging yang berlebihan ke disk karena memori rendah, yang memiliki efek knock-on ke semua layanan yang saat ini berjalan di atasnya, menyebabkan utama masalah kinerja.

Setelah diselidiki di Task Manager, saya perhatikan bahwa hampir semua 4GB sedang digunakan tetapi ketika Anda melihat di tab Processes, jumlah semua penggunaan memori di sana tidak bertambah dan paling banyak hanya 1,5GB yang seharusnya digunakan.

Menggunakan Google untuk menemukan solusi, tampaknya sebagian besar RAM digunakan dalam "Metafile" yang merupakan cache informasi NTFS untuk file pada sistem file sehingga sistem tidak perlu meminta MFT untuk informasi lagi. Cache ini tidak pernah dihapus atau ditandai sebagai "cache" di Task Manager atau sebagai "Siaga" di RamMap Sysinternal.

Ada saran untuk menginstal perbaikan terbaru KB979149 tetapi setelah mencoba menginstalnya, dikatakan "Pembaruan ini tidak berlaku untuk komputer Anda".

Satu-satunya perbaikan sementara yang sejauh ini saya temukan adalah:

  1. Gunakan RAMmap dari Sysinternals ke "Empty System Working Set" setiap 1-3 hari yang menandai cache sebagai "standby" dan "cache" di Task Manager sehingga RAM dapat digunakan oleh aplikasi lain.
  2. Nyalakan ulang mesin, yang tidak diinginkan karena server ini melayani situs web publik.

Saat ini saya harus melakukan 2. perbaikan setiap beberapa hari untuk mencegahnya mencapai level bottleneck.

Sebelum: (800 MB RAM digunakan - aplikasi lain tidak dapat menggunakan RAM ini)

masukkan deskripsi gambar di sini

Setelah: (800 MB RAM ditandai sebagai cache - tersedia untuk aplikasi lain)

Jadi pertanyaan saya kepada Anda semua adalah: Apakah ada metode di luar sana untuk membatasi penggunaan RAM dari metafile ini?


4
RAM 4GB pada server yang menampung 2-3 juta file tidak masuk akal. Tingkatkan RAM Anda atau tingkatkan RAM Anda.
pauska

1
Tidak apa-apa, CacheSet oleh Sysinternals memungkinkan saya mengatur ukuran cache, saat ini menjalankan ini pada interval dan melakukannya telah memecahkan masalah bagi saya!
al2k4

6
Menambahkan RAM tidak menyelesaikan masalah. Cache metafile akan mengisinya juga. Saya sudah mencoba melakukan ini pada tamu VMware yang dimulai dengan 4 GB dan meningkatkannya menjadi 12 GB dan hal yang sama terjadi. Masalahnya adalah bahwa memori ini untuk keperluan cache, tetapi tidak ditandai sebagai cache menurut Windows. Ini salah ditandai sebagai memori Aktif / Dalam Penggunaan, dan sayangnya, saat tumbuh itu memadat keluar NYATA Aktif / Dalam Penggunaan memori yang digunakan oleh program nyata dan mulai paging ke disk. Ketika RAM fisik mengisi semuanya melambat dan Anda harus melakukan salah satu dari dua solusi seperti yang disebutkan di posting sebelumnya.

@ al2k4 Jika pertanyaan Anda telah diselesaikan, harap tandai sebagai diselesaikan dengan mengklik tanda centang di sebelah jawaban yang benar. Selamat Datang di Kesalahan Server !
Michael Hampton

Jawaban:


16

Metode terbaik untuk menangani masalah ini adalah dengan menggunakan SetSystemFileCacheSizeAPI sebagai MS KB976618 memerintahkan digunakan untuk menginstruksikan .

Jangan menghapus cache secara berkala

Menggunakan SetSystemFileCacheSizefungsi daripada membersihkan cache secara berkala meningkatkan kinerja dan stabilitas. Menghapus cache secara berkala akan menghasilkan metafile yang terlalu banyak dan info lainnya dihapus dari memori, dan Windows harus membaca kembali informasi yang diperlukan kembali ke dalam RAM dari HDD. Ini menciptakan penurunan kinerja yang tiba-tiba dan parah selama beberapa detik setiap kali Anda membersihkan cache, diikuti oleh kinerja yang baik yang perlahan-lahan menurun saat memori dipenuhi dengan data metafile.

Menggunakan SetSystemFileCacheSizefungsi ini menetapkan minimum dan maksimum yang akan menghasilkan Windows menandai data metafile lama yang berlebih sebagai memori siaga yang dapat digunakan atau dibuang oleh fungsi cache yang normal sesuai dengan tuntutan sumber daya saat ini dan prioritas cache yang normal. Ini juga memungkinkan lebih banyak data metafile daripada maksimum memori aktif yang Anda atur, berada di memori sebagai data siaga jika Windows tidak menggunakan memori untuk hal lain, sambil mempertahankan banyak memori yang tersedia. Ini adalah situasi yang ideal menjaga karakteristik kinerja sistem baik setiap saat.

Program Pihak Ketiga Tidak Didukung oleh MS

Jika Anda seperti saya dan tidak ingin menjalankan biner dari pihak ketiga yang tidak dikenal di server produksi Anda, Anda ingin alat MS resmi atau beberapa kode yang dapat Anda periksa sebelum berjalan di server tersebut. Alat DynCache untuk 2008 R2 secara praktis tidak mungkin diperoleh dari M $ tanpa membayar untuk kasus dukungan dan terus terang, berdasarkan kode untuk 2008, tampaknya terlalu membengkak untuk tugas karena Windows sudah memiliki logika bawaan yang diperlukan untuk ukuran secara dinamis cache — itu hanya perlu tahu maksimum yang sesuai untuk sistem Anda.

Solusi untuk semua hal di atas

Saya menulis naskah Powershell yang bekerja pada mesin 64 bit. Anda harus menjalankannya sebagai administrator dengan hak yang lebih tinggi. Anda harus dapat menjalankannya, seperti pada x64 windows Vista / Server 2008 hingga dan termasuk 10 / Server 2012 R2 dengan jumlah RAM berapa pun. Anda tidak perlu menginstal perangkat lunak tambahan apa pun, dan akibatnya menjaga server / workstation Anda sepenuhnya didukung oleh MS.

Anda harus menjalankan skrip ini di setiap boot dengan hak istimewa yang ditinggikan untuk pengaturan menjadi permanen. Penjadwal Tugas Windows dapat melakukan ini untuk Anda. Jika instalasi Windows berada di dalam mesin virtual dan Anda mengubah jumlah RAM yang dialokasikan untuk VM itu, Anda juga harus menjalankannya setelah perubahan.

Anda dapat menjalankan skrip ini kapan saja pada sistem yang sedang berjalan bahkan saat digunakan dalam produksi tanpa harus me-reboot sistem atau mematikan layanan apa pun.

# 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

Ada garis di dekat bagian atas yang mengatakan $MaxPercent = 12.5bahwa set set kerja maksimum baru (memori aktif) menjadi 12,5% dari total RAM fisik. Windows akan secara dinamis mengukur jumlah data metafile dalam memori aktif berdasarkan permintaan sistem, jadi Anda tidak perlu menyesuaikan secara maksimal ini secara dinamis.

Ini tidak akan memperbaiki masalah apa pun yang Anda miliki dengan cache file yang dipetakan menjadi terlalu besar.

Saya juga membuat GetSystemFileCacheSizeskrip Powershell dan mempostingnya di StackOverflow .


Sunting: Saya juga harus menunjukkan bahwa Anda tidak boleh menjalankan salah satu dari kedua skrip ini dari instance Powershell yang sama lebih dari sekali, atau Anda akan menerima kesalahan bahwa Add-Typepanggilan telah dilakukan.

Sunting: SetSystemFileCacheSizeskrip yang diperbarui ke versi 1.1 yang menghitung nilai cache maks yang sesuai untuk Anda dan memiliki tata letak keluaran status yang lebih bagus.

Sunting: Sekarang saya telah memutakhirkan laptop Windows 7 saya, saya dapat memberi tahu Anda bahwa skrip berjalan dengan sukses di Windows 10, meskipun saya belum menguji apakah masih diperlukan. Tetapi sistem saya masih stabil bahkan ketika memindahkan file HDD mesin virtual.


Alat DynCache tersedia secara bebas untuk diunduh dari microsoft.com/en-us/download/details.aspx?id=9258 dan mendukung 2008 R2.
Jakub Berezanski

Sekarang. Ada waktu yang lama antara rilis windows R2 dan rilis DynCache. Lihat blogs.technet.com/b/yongrhee/archive/2010/02/16/… untuk pembaruan posting blog ms. Saya masih lebih suka solusi saya karena tidak memerlukan sumber daya tambahan untuk menjalankan layanan lain. Server kami menjadi sangat stabil dengan skrip saya, jadi saya tidak mengubahnya ke DynCache.
BeowulfNode42

@ BeowulfNode42 - Kami mengalami masalah dengan cache file yang dipetakan menjadi besar. Apakah Anda memiliki petunjuk tentang cara mengatasinya? Saya berada di bawah asumsi bahwa pengaturan ukuran cache file sistem juga akan menyelesaikan masalah itu ?! Apakah Anda tahu jika alat DynCache (bengkak) akan menyelesaikan masalah itu?
Lieven Keersmaekers

fwiw - Saya baru saja mencoba testserver dan Mapped File (rammap) didapat dari 12GB Active, 0GB Standby hingga 8GB Active, 4GB Standby. Untuk semua maksud dan tujuan, ini tampaknya bekerja untuk File yang Dipetakan juga ?!
Lieven Keersmaekers

@ LievenKeersmaekers itu aneh. Mungkin itu semacam aliran efek. Saya belum menemukan cara yang baik untuk memecahkan masalah cache file yang dipetakan yang dialami ketika menyalin file dari penyimpanan cepat ke lambat, meskipun saya belum mencoba alat DynCache, karena bagi kami masalah cache file yang dipetakan terutama hanya menjengkelkan sementara memperlambat server kami yang mengelola cadangan kami. Untuk referensi di masa mendatang berapa ram yang dimiliki sistem pengujian dan apakah Anda menjalankan skrip sebagaimana diposkan dengan pengaturan 12,5%, dan jika Anda mengingat atau mencatat jenis-jenis ukuran memori lainnya?
BeowulfNode42

4

Saya tidak mengklaim sebagai ahli tentang cara kerja internal memori atau caching disk di OS Windows, tetapi saya memiliki dua pengamatan:

  1. Jika OS tidak men-cache data dalam memori itu harus membacanya dari disk, yang merupakan media penyimpanan lambat secara eksponensial dari memori, sehingga masalah kinerja yang Anda lihat sekarang hampir pasti akan lebih buruk.

  2. Anda mencoba menyelesaikan masalah dengan mengobati gejala masalah alih-alih penyebab masalahnya. Penyebab masalahnya hampir pasti adalah kurangnya RAM fisik yang cukup dan saran saya adalah untuk mengatasinya.

Selain itu, sementara cache mungkin menggunakan 1.5GB RAM saya akan bertanya-tanya apa penggunaan memori untuk proses dan layanan lain dan mungkin solusinya untuk menyelidiki penggunaan itu untuk masalah potensial.


Persis. Jika OP mengurangi penggunaan RAM dari metafile, sistem harus memuat lebih banyak metadata dari disk karena kurang dari itu akan ada dalam memori, membuat segalanya menjadi lebih buruk.
David Schwartz

1
Terima kasih untuk umpan baliknya. Beberapa hal, server utamanya adalah server web dengan database MySQL dan tidak terlalu sering membaca file sehingga sedikit dampak metadata yang tidak ada dalam cache minimal, kinerja meningkat secara dramatis ketika dibersihkan. Ini adalah jumlah file berbeda yang dibacanya dari waktu ke waktu mengapa ukuran cache semakin tinggi dan lebih tinggi. Saya sangat sadar bahwa lebih banyak RAM akan menyelesaikannya, tetapi bukankah ide "cache" adalah untuk membebaskan memori ketika aplikasi atau skrip pada server benar-benar membutuhkannya untuk menghindari paging? Mengapa cache tertentu ini selalu ditandai sebagai aktif membingungkan saya.
al2k4

Anda jelas tidak pernah mengalami masalah ini sendiri. Banyak orang dengan 32, 64, dan 128 GB RAM memiliki masalah ini di mana terlalu banyak RAM diambil oleh data metafile dan windows tidak melepaskannya karena ditandai sebagai memori aktif dan tidak siaga (alias cache). Menggunakan SetSystemFileCacheSize API seperti yang telah saya jelaskan dalam jawaban saya memaksa Windows untuk menandai banyak data metafile sebagai memori siaga dan sistem manajemen cache kemudian dapat memprioritaskan apa yang harus disimpan dalam RAM dan apa yang harus dibuang.
BeowulfNode42

Troll banyak? Pertanyaan ini sudah lebih dari dua tahun.
joeqwerty

@ joeqwerty Saya melihat posting baru di internet tentang masalah ini sepanjang waktu. Banyak pencarian terkait sampai pada pertanyaan ini. Karena saya memperbarui jawaban saya sendiri dan saya yakin jawaban Anda "tidak berguna" saya menandainya dan berkomentar mengapa. Jika itu membuat saya troll, biarlah.
BeowulfNode42

3

Bagi orang-orang yang memberikan solusi yang jelas tetapi tidak efektif dengan hanya menambahkan lebih banyak RAM, Anda jelas belum pernah berurusan dengan masalah ini secara langsung.

Seperti yang dinyatakan oleh poster sebelumnya, tidak masalah berapa banyak RAM yang Anda lemparkan pada masalah ... semuanya akan terisi. Saya menjalankan alat Atlassian yang diatur pada server aplikasi kami yang dimigrasikan dari 32 bit (2003) ke 64 bit (2008). Segera jelas bahwa ada kerugian kinerja.

Saat melihat task manager, hampir semua memori habis; meskipun proses yang sedang berjalan tidak mencerminkan hal ini. Ketika kami menambah memori dari 8 GB menjadi 16 GB, masalahnya juga menghabiskan memori tambahan.

Satu-satunya cara untuk mengatasi masalah ini adalah me-restart server, yang menurunkan penggunaan memori sama dengan proses (sekitar 3,5 GB). Ini mulai mendaki lagi dalam satu atau dua hari.

Saya tahu ini adalah bug / fitur Microsoft baru dan senang menemukan artikel ini. Saya suka bagaimana Microsoft meninggalkan detail yang sangat penting ini untuk diketahui oleh pengguna. Saya mengunduh RamMap, yang menurut Anda akan menjadi utilitas asli, dan sekarang saya dapat melihat penggunaan Metafile. Kami akan mengatur cache untuk dihapus setiap beberapa hari dan mudah-mudahan ini akan menyelesaikan masalah.

Sangat menarik bahwa saya hanya melihat masalah ini pada satu dari beberapa server kami yang dimigrasi, jadi saya bertanya-tanya apakah metafile hanya diumpankan dari jenis aplikasi tertentu.


1
Dalam pengalaman saya, penggunaan memori metafile tidak akan tumbuh jauh melampaui ukuran metadata filesystem (setelah semua itu caching), jadi memutakhirkan RAM untuk memungkinkan metadata filesystem agar sesuai dengan memori adalah solusi yang layak dalam setidaknya beberapa kasus. Saya juga merekomendasikan klien mengurangi ukuran metadata sistem file dengan menghapus cruft seperti jutaan file sementara yang belum disentuh dalam beberapa bulan. Agak canggung bahwa Windows secara efektif lebih memilih metadata NTFS dalam memori daripada memori aplikasi, tetapi mencari cluster untuk file bisa sangat lambat tanpa MFT dalam memori.
James L

2
Saya setuju - menambahkan lebih banyak ram tidak memperbaiki masalah, itu hanya akan mengkonsumsi lebih banyak dan semua proses lainnya pada akhirnya akan terhenti. Saya baru-baru ini ditingkatkan ke 24 GB, hanya untuk memiliki SQL mengambil 8 (baik), dan memiliki 12 di metafile .. James N - alat apa yang Anda gunakan untuk secara berkala menghapusnya?
sirthomas

2

Masalah ini dapat diatasi dengan cepat dan gratis menggunakan alat SysInternals CacheSet. Cukup atur set kerja maksimum ke nilai yang sesuai kurang dari jumlah RAM sistem, dan terapkan.


1

Maaf untuk menjadi begitu langsung, tetapi bagaimana dengan Anda meningkatkan server ke jumlah ram yang sedikit lebih tinggi dari apa yang dimiliki workstation hari ini? 16GB memroy sangat murah. Lebih murah daripada setengah hari dari waktu Anda.


2
Itu akan menyelesaikannya untuk selamanya tetapi server kami di-host dari jarak jauh oleh pihak ketiga. Host kami akan membebankan biaya besar hanya untuk meningkatkan RAM setiap bulan. Jadi kami ingin menghindari itu jika memungkinkan.
al2k4

2
Ya. Coba tebak;) Inilah sebabnya saya membeli perangkat keras saya. Host gila - Anda dapat membeli RAM dalam 3 bulan. Nah, pelajaran untuk dipelajari: pengaturan yang tidak profesional kembali menggigit Anda.
TomTom

Semua sistem windows 64bit memiliki pengaturan 1TB untuk jumlah maksimum data metafile yang ada dalam memori aktif (tidak diperlakukan sebagai memori siaga cache yang siap digunakan ketika hal-hal lain membutuhkan lebih banyak memori). Saya tidak tahu tentang Anda tetapi saya belum melihat kotak windows dengan banyak memori di dalamnya. Anda tidak perlu menginstal lebih banyak RAM untuk menggunakan lebih banyak file yang disimpan pada HDD. NTFS seharusnya mendukung hingga 4.294.967.295 file per volume. Drive 4TB NTFS tunggal kemudian harus dapat mendukung lebih dari 900 juta file. Coba dan jalankan defrag atau cadangan itu dan itu akan gagal atau merangkak.
BeowulfNode42

1
Ya, Anda harus memiliki jika "Server" Anda memiliki ram kurang dari laptop yang kuat. Ini bukan tentang "menjadi sangat tinggi". Ini tentang "mendapatkan cukup bahwa server layak nama itu".
TomTom

1

Berikut ini tautan untuk mengunduh alat Microsoft DynCache - tidak perlu membuat tiket atau membayar. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258

(permintaan maaf - hanya memperhatikan sekarang bahwa ini bukan untuk versi R2)

Masalah yang diketahui untuk melanjutkan pertumbuhan cache dijelaskan di sini di blog Microsoft: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx

[perbarui] perbaikan yang berfungsi untuk Windows Server 2008 R2.

Saya menemukan kode sampel C # pada Codeplex, dengan cepat membuat proyek konsol C # dengan Visual Studio dan dikompilasi, berfungsi.

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

Catatan, Anda harus menambahkan referensi ke Microsoft.AnalysisServices.AdomdClient yang dapat ditemukan di sini:

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

dan komentar metode ClearAllCaches () dengan (dalam kasus saya) referensi yang tidak diperlukan untuk XMLaDiscover. Buang ini ke dalam TaskScheduler.


0

Anda bisa mendapatkan alat DynCache dari MS yang akan memungkinkan untuk membatasi penggunaan RAM dengan metafile.

Klik di sini untuk mendapatkan alat dari MS .


Tautan itu tidak memberikan apa pun untuk sistem 2008 R2. M $ masih menginginkan kartu kredit Anda sehingga Anda dapat membayar untuk memperbaiki masalah yang diketahui ini.
BeowulfNode42
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.