Windows Server 2008 R2 Meta Dosya RAM Kullanımı


33

Çoğunluğu görüntü dosyaları olan 2-3 milyon civarında dosyayı barındıran 4 GB RAM ile Windows Server 2008 R2 x64 çalıştıran bir sunucum var.

Bir hafta boyunca, düşük bellek nedeniyle diskte aşırı disk belleği nedeniyle aşırı disk belleği nedeniyle aşırı disk taraması nedeniyle sunucudaki uygulamaların yavaşlamaya başladığını fark ettim. performans sorunu.

Görev Yöneticisi'nde yapılan araştırma sonucunda, neredeyse 4 GB'ın tamamının kullanımda olduğunu fark ettim ancak İşlemler sekmesine baktığınızda, oradaki tüm bellek kullanımlarının toplamının toplanmadığını ve en fazla yalnızca 1.5 GB'ın kullanımda olması gerektiğini düşündüm.

Bir çözüm bulmak için Google’ı kullanmak, RAM’in çoğunun, sistemdeki bilgiler için MFT’yi yeniden sorgulamak zorunda kalmaması için, dosya sistemindeki dosyalar için NTFS bilgilerinin önbelleği olan “Metafile” de kullanıldı. Bu önbellek hiçbir zaman Görev Yöneticisi'nde "önbellek" olarak veya Sysinternal'ın RamMap'sinde "Bekleme" olarak işaretlenmez veya işaretlenmez.

Orada bir öneri KB979149 düzeltmeyi yüklemek için ama bunu yüklemeye çalışırken üzerine, bu "Bu güncelleştirme bilgisayarınız için geçerli değil" diyor.

Şimdiye kadar bulduğum geçici düzeltmeler:

  1. Görev Yöneticisi'nde önbelleği "bekleme" ve "önbellek" olarak işaretleyen, her 1-3 günde bir Sysinternals'ten "Boş Sistem Çalışma Kümesi" ne RAM RAM'i kullanın, böylece RAM diğer uygulamalar tarafından kullanılabilir.
  2. Bu sunucu halka açık web sitelerine hizmet verdiği için istenmeyen bir makineyi yeniden başlatın.

Şu anda, her iki günde bir 2. darboğaz seviyesine ulaşmasını önlemek için düzeltmeyi yapmak zorundayım.

Önce: (800 MB RAM kullanılmış - diğer uygulamalar bu RAM'i kullanamaz)

görüntü tanımını buraya girin

Sonra: (800 MB RAM önbellek olarak işaretlendi - diğer uygulamalar için kullanılabilir)

Öyleyse hepinize sorum şu: Bu meta dosyasının RAM kullanımını sınırlamak için herhangi bir yöntem var mı?


4
2-3 milyon dosyayı barındıran bir sunucuda 4GB RAM saçmadır. RAM'inizi yükseltin veya RAM'inizi yükseltin.
pauska

1
Boş ver, Sysinternals tarafından CacheSet önbellek boyutunu belirlememe izin veriyor, şu anda bunu aralıklarla çalıştırıyor ve bunu yapmak benim için sorunu çözdü!
al2k4

6
RAM eklemek sorunu çözmez. Meta dosya önbelleği de bunu dolduracak. Bunu, 4 GB'la başlayan ve 12 GB'a yükselen bir VMware misafirinde yapmaya çalıştım ve aynı şey oldu. Sorun, bu belleğin önbellek amaçlı olması, ancak Windows'a göre önbellek olarak işaretlenmemiş olmasıdır. Yanlış Aktif / Kullanım hafızası olarak işaretlenmiştir ve ne yazık ki büyüdükçe, gerçek programlar tarafından kullanılan GERÇEK Etkin / Kullanımda hafızasını doldurmakta ve diske disk belleği vermeye başlamaktadır. Fiziksel RAM doldurduğunda her şey yavaşlar ve söz konusu orijinal gönderi gibi iki çözümden birini yapmanız gerekir.

@ al2k4 Sorunuz çözülmüşse, lütfen doğru cevabın yanındaki onay işaretini tıklatarak sorunu çözülmüş olarak işaretleyin. Sunucu Arızasına Hoşgeldiniz !
Michael Hampton

Yanıtlar:


16

Bu sorunla başa çıkmanın en iyi yolu, SetSystemFileCacheSizeAPI'yi talimat vermek için kullanılan MS KB976618 komutları olarak kullanmaktır .

Önbelleği düzenli aralıklarla temizlemeyin

SetSystemFileCacheSizeÖnbelleği temizlemek yerine işlevi kullanmak, performansı ve kararlılığı düzenli aralıklarla iyileştirir. Önbelleğin periyodik olarak temizlenmesi, çok fazla meta dosyası ve diğer bilgilerin bellekten silinmesine neden olur ve Windows'un gerekli bilgileri HDD’den RAM’e yeniden okuması gerekir. Bu, önbelleği temizlediğinizde birkaç saniye boyunca performansta ani ve şiddetli bir düşüşe neden olur, ardından bellek meta dosyası verileriyle dolarken yavaş yavaş bozulan iyi performans.

SetSystemFileCacheSizeİşlev kümelerinin kullanılması, Windows'un normal önbellek işlevlerinin mevcut kaynak taleplerine ve normal önbellek öncelikleri uyarınca kullanabileceği veya atabileceği bekleme belleği olarak fazla eski meta dosyası verilerini işaretlemesiyle sonuçlanacak minimum ve maksimum değerlerini ayarlar. Bu, aynı zamanda, yeterli miktarda kullanılabilir belleği korurken, Windows belleği başka bir şey için kullanmıyorsa, bekleme verisi olarak bellekte kalmasını, ayarladığınız aktif bellekten daha fazla meta dosya verisine de izin verir. Bu, sistemin performans özelliklerini her zaman iyi tutan ideal bir durumdur.

Üçüncü Parti Programları MS Tarafından Desteklenmiyor

Eğer benim gibiyseniz ve üretim sunucularınızdaki bilinmeyen üçüncü şahıslardan bir ikili kod çalıştırmak istemiyorsanız, resmi bir MS aracı veya bu sunucularda çalıştırmadan önce inceleyebileceğiniz bir kod istersiniz. 2008 R2 için DynCache aracı, M $ 'dan bir destek durumu için para ödemeden elde etmek neredeyse imkansızdır ve açıkçası, 2008 kodunu temel alarak, Windows zaten dinamik olarak boyutlandırmak için gerekli bir mantık içinde inşa edilmiş olan bu görev için aşırı derecede şişkin görünmektedir. önbellek - sadece sisteminiz için uygun bir maksimum değeri bilmesi gerekir.

Yukarıdakilerin tümüne çözüm

64 bit makinelerde çalışan bir Powershell betiği yazdım. Yükseltilmiş ayrıcalıklara sahip bir yönetici olarak çalıştırmanız gerekir. Herhangi bir miktarda RAM içeren 10 / Server 2012 R2 dahil tüm Vista / Server 2008 x64 pencerelerinde olduğu gibi çalıştırabilirsiniz. Başka bir yazılım yüklemeniz gerekmez ve bunun sonucunda sunucunuzu / iş istasyonunuzu MS tarafından tam olarak desteklenir.

Bu betiği, ayarın kalıcı olması için yükseltilmiş ayrıcalıklarla her önyüklemede çalıştırmalısınız. Windows Görev Zamanlayıcı bunu sizin için yapabilir. Windows kurulumu sanal bir makinenin içindeyse ve bu VM'ye tahsis edilen RAM miktarını değiştirirseniz, değişiklikten sonra da çalıştırmalısınız.

Bu betiği, çalışmakta olan bir sistemde, üretim sırasında bile, sistemi yeniden başlatmak veya herhangi bir hizmeti kapatmak zorunda kalmadan çalıştırabilirsiniz.

# 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.5Yeni maksimum çalışma setini (aktif bellek) toplam fiziksel RAM'in% 12.5'ine ayarladığını söyleyen üste yakın bir çizgi var . Windows, sistem belleğine bağlı olarak aktif bellekteki meta dosyası veri miktarını dinamik olarak boyutlandıracağından, bu maksimum değeri dinamik olarak ayarlamanıza gerek kalmaz.

Bu, eşlenen dosya önbelleğinin fazla büyük olmasıyla ilgili herhangi bir sorunu çözmez.

Ayrıca bir GetSystemFileCacheSizePowershell betiği yaptım ve bunu StackOverflow'a gönderdim .


Düzenleme: Ayrıca, bu iki komut dosyasından birini aynı Powershell örneğindeki bir defadan fazla çalıştırmamanız gerektiğini veya Add-Typearamanın daha önce yapılmış olduğu hatayı alacağınızı da belirtmeliyim .

Düzenleme: SetSystemFileCacheSizeSizin için uygun bir maksimum önbellek değeri hesaplayan ve daha güzel bir durum çıktısı düzenine sahip olan sürüm 1.1'e güncellenmiş komut dosyası.

Düzenleme: Şimdi Windows 7 dizüstü bilgisayarımı yükselttim, hala betiğin Windows 10'da çalıştığını söyleyebilirim, ancak hala gerekli olup olmadığını test etmedim. Ancak, sanal makine HDD dosyalarını etrafta taşırken bile sistemim hala kararlı.


DynCache aracı, microsoft.com/en-us/download/details.aspx?id=9258 adresinden indirilebilir ve 2008 R2'yi destekler.
Jakub Berezanski

Şimdi. R2 pencereleri sürümü ve DynCache sürümü arasında uzun zaman vardı. MS blog yazısı güncellemesi için blogs.technet.com/b/yongrhee/archive/2010/02/16/… adresine bakın . Yine başka bir hizmeti çalıştırmak için ek kaynak gerektirmediği için çözümümü tercih ediyorum. Sunucularımız senaryomla çok kararlı hale geldi, bu yüzden onları DynCache olarak değiştirmiyorum.
BeowulfNode42

@ BeowulfNode42 - Eşlenen dosya önbelleği büyük olduğunda sorun yaşıyoruz. Bunun nasıl çözüleceğine dair herhangi bir işaretiniz var mı? Sistem dosyası önbellek boyutunu ayarlamanın da bu sorunu çözeceği varsayımı altındaydım ?! ( Şişirilmiş ) DynCache aracının bu sorunu çözüp çözmeyeceği hakkında bir fikriniz var mı?
Lieven Keersmaekers

fwiw - Ben sadece bir testçi denedim ve Haritalanmış Dosya (rammap) 12GB Aktif, 0GB Bekleme ile 8 GB Aktif, 4 GB Bekleme arasında. Tüm niyet ve amaçlar için, bu Haritalanmış Dosyalar için de işe yarıyor mu ?!
Lieven Keersmaekers

@LievenKeersmaekers bu garip. Belki de etkisi üzerinde bir tür akış. DynCache aracını denemedim, ancak bizim için eşlenen dosya önbelleği sorunu sadece can sıkıcı bir geçici durum olduğu için, hızlı depolamadan yavaş dosyalara kopyalanırken yaşanan haritalanmış dosya önbelleği sorununu çözmek için iyi bir yol bulamadım. yedeklerimizi yöneten sunucularımızı yavaşlatır. Gelecekte referans olarak, bu test sistemi ne kadar koç değerine sahipti ve senaryoyu% 12.5 ayarıyla belirtildiği gibi çalıştırıyor muydunuz ve diğer hafıza boyutu türlerini hatırlıyorsanız veya kaydettirdiyseniz?
BeowulfNode42 23.052,

4

Windows işletim sisteminde belleğin veya diskin önbelleğe alınması ile ilgili dahili çalışmalar konusunda uzman olduğumu iddia etmiyorum, ancak iki gözlemim var:

  1. İşletim sistemi verileri bellekte önbelleğe almazsa, onu bellekten ve sonradan katlanarak yavaşlayan bir depolama ortamı olan diskten okumak zorunda kalacak, bu yüzden şimdi gördüğünüz performans sorunu neredeyse kesinlikle daha kötü olacaktır.

  2. Sorunun nedeni yerine sorunun bir semptomunu tedavi ederek sorunu çözmeye çalışıyorsunuz. Sorunun nedeni, neredeyse kesinlikle yeterli fiziksel RAM eksikliğidir ve benim önerim, bunu çözmek olacaktır.

Ayrıca, önbellek 1.5 GB RAM kullanıyor olabilirken, diğer işlemler ve servisler için bellek kullanımının ne olduğunu merak ediyorum ve çözüm, olası problemler için bu kullanımı araştırmak olabilir.


Kesinlikle. OP meta dosyasının RAM kullanımını azaltırsa, sistem bellekten daha az bellekte olacağı için diskten daha fazla meta veri yüklemesi gerekirdi, bu da işleri daha da kötüleştirirdi.
David Schwartz

1
Geri dönüşünüz için teşekkür ederiz. Birkaç şeyden önce, sunucu öncelikle MySQL veritabanına sahip bir web sunucusudur ve dosyaları çok sık okumaz, bu nedenle önbellekte bulunmama meta verilerinin hafif etkisi minimum düzeydedir, performans temizlendiğinde çarpıcı bir şekilde artar. Zaman içinde okuduğu farklı dosya sayısı, önbellek boyutunun neden daha yüksek ve yüksek olduğunu gösteriyor. Daha fazla RAM'in çözeceğini biliyordum, ancak bir "önbellek" fikri, sunucudaki uygulamalar veya komut dosyalarının sayfalamayı önlemek için gerçekten ihtiyaç duyduğunda belleği boşaltmak olduğunu değil mi? Neden bu belirli önbellek her zaman etkin olarak işaretlendi beni şaşırtıyor.
al2k4,

Belli ki bu sorunu kendin asla yaşamamışsın. 32, 64 ve 128 GB RAM'e sahip pek çok kişi, meta dosya verileri tarafından çok fazla RAM alındığı ve pencerelerin aktif ve bekleme (aka önbellek) belleği olarak işaretlendiği için serbest bırakmadığı bu soruna sahiptir. Cevabımda açıkladığım gibi SetSystemFileCacheSize API'yi kullanmak, Windows'u meta dosya verilerinin çoğunu bekleme belleği olarak işaretlemeye zorlar ve önbellek yönetim sistemi RAM'de neyin tutulacağını ve neyin atılacağını öncelik sırasına koyabilir.
BeowulfNode42

Çok mu troll? Bu soru iki yıldan daha eski.
joeqwerty

@joeqwerty Her zaman bu sorun hakkında net üzerinden yeni yazılar görüyorum. İlgili aramaların çoğu bu soruya ulaşıyor. Kendi cevabımı güncellediğimden ve cevabınızın "işe yaramaz" olduğuna inanıyorum ve bu şekilde işaretledim ve nedenini yorumladım. Bu beni bir trol yaparsa, öyle olsun.
BeowulfNode42

3

Daha fazla RAM eklemenin bariz ancak etkisiz çözümünü verenlere, bu konuyu ilk elden ele almamışsınızdır.

Daha önce bir poster tarafından belirtildiği gibi, soruna ne kadar RAM atacağınız önemli değil ... hepsi dolduracak. Uygulama sunucumuzda ayarlanan bir Atlassian aracını 32 bit (2003) ile 64 bit (2008) arasında geçirdim. Performans kaybı olduğu hemen belli oldu.

Görev yöneticisine bakarken, belleğin neredeyse tamamı tükendi; Çalışmakta olan işlemler bunu yansıtmıyor olsa da. Belleği 8 GB’dan 16 GB’a çıkardığımızda, sorun ek belleği de kullandı.

Sorunu tedavi etmenin tek yolu, sunucunun yeniden başlatılmasıydı; bu da bellek kullanımını işlemlere eşit şekilde düşürdü (yaklaşık 3,5 GB). Bu bir gün içinde tekrar tırmanmaya başladı.

Bunun yeni bir Microsoft hatası / özelliği olduğunu biliyordum ve bu makaleyi bulmaktan mutluydu. Microsoft'un bu önemli ayrıntının, kullanıcı tarafından anlaşılması için ayrılmasından hoşlanıyorum. Yerel bir yardımcı olacağını düşündüğünüz RamMap'i indirdim ve artık Metafile kullanımını görebiliyorum. Önbelleği birkaç günde bir temizlemeye ayarlayacağız ve umarım bu sorunu çözecektir.

Bu sorunu yalnızca geçirilen birkaç sunucumuzdan birinde görmem ilginç, bu yüzden meta dosyasının yalnızca belirli uygulama türlerinden beslenip beslenmediğini merak ediyorum.


1
Tecrübelerime göre, meta dosya belleği kullanımı, dosya sistemi meta verilerinin boyutunun çok ötesinde büyümeyecek (sonuçta önbelleklenen budur), bu nedenle en azından bazı durumlarda dosya sistemi meta verilerinin belleğe sığması için RAM'i yükseltmek uygun bir çözümdür. Ayrıca, istemcilere, aylardır dokunulmamış milyonlarca geçici dosya gibi sıkışıklığı kaldırarak dosya sistemi meta verilerinin boyutunu azaltmalarını önerdim. Windows'un uygulama belleği yerine bellekteki NTFS meta verilerini etkin biçimde tercih etmesi oldukça zordur, ancak bir dosya için kümeleri aramak, MFT'nin belleği olmadan çok yavaş olabilir.
James L

2
Aynı fikirdeyim - daha fazla ram eklemek sorunu düzeltmiyor, sadece daha fazla tüketecek ve diğer tüm işlemler sonunda durmaya başlayacak. Geçenlerde 24 GB'ye yükselttim, yalnızca SQL'in 8 (para cezası) alması ve meta dosyada 12 olması için .. James N - periyodik olarak temizlemek için hangi aracı kullanıyorsunuz?
sirthomas

2

Bu sorun SysInternals CacheSet aracını kullanarak hızlı ve ücretsiz olarak çözülebilir. Çalışma setini maksimum sistem RAM miktarından daha az uygun bir değere ayarlayın ve uygulayın.


1

Bu yüzden direk olduğum için üzgünüz, peki ya sunucuyu bugünlerde bir iş istasyonundan biraz daha yüksek olan bir ram seviyesine yükseltin? 16GB'lık memroy ucuza kaçıyor. Zamanınızın yarısı gününden bile daha ucuz.


2
Bu iyi bir çözüm olurdu, ancak sunucularımız üçüncü taraflarca uzaktan barındırılıyor. Ana bilgisayarlarımız RAM'i yalnızca aylık olarak artırmak için büyük miktarda ücret talep edecekler. Mümkünse bundan kaçınmak istiyoruz.
al2k4

2
Evet. Bil bakalım ne;) Bu yüzden donanımımı satın alıyorum. Ana bilgisayarlar çılgın - 3 ay içinde RAM satın alabilirsiniz. Peki, öğrenilecek dersler: Profesyonel olmayan bir kurulum sizi ısırmak için geri geliyor.
TomTom

Tüm 64bit Windows sistemlerinde aktif bellekte olması gereken maksimum meta dosya verisi için 1TB ayarı vardır (başka şeyler daha fazla belleğe ihtiyaç duyduğunda kullanılmaya hazır önbellek bekleme belleği olarak kabul edilmez). Seni bilmiyorum ama henüz bu kadar hafızası olan bir pencere kutusu görmedim. Bir HDD'de depolanan daha fazla dosyayı kullanmak için daha fazla RAM yüklemeniz gerekmez. NTFS'nin birim başına 4.294.967.295 dosyayı desteklemesi gerekiyor. Tek bir 4TB NTFS sürücüsü 900 milyondan fazla dosyayı destekleyebilmelidir. Bunun üzerine birleştirme veya yedekleme işlemi yapmayı deneyin ve başarısız olur veya sürünür.
BeowulfNode42

1
Evet, "Sunucunuzda" güçlü bir dizüstü bilgisayara göre daha az ram varsa olmalıdır. Bu "gülünç bir şekilde yüksek olmak" ile ilgili değil. Bu, "sunucunun bu adı hakettiği kadar hak kazanması" ile ilgilidir.
TomTom

1

İşte Microsoft DynCache aracını indirmek için bir link - bir bilet oluşturmanıza veya bir ödeme yapmanıza gerek yok. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258

(Özür dilerim - sadece bunun R2 versiyonu için olmadığını farkettim)

Bilinen sürekli önbellek büyümesi için sorun, Microsoft blogunda açıklanmıştır: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx

[güncelleme] Windows Server 2008 R2 için çalışma düzeltmesi.

Codeplex'te örnek C # kodunu buldum, hızlı bir şekilde Visual Studio ile bir konsol C # projesi hazırladım ve çalıştım.

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

Not, burada bulunan Microsoft.AnalysisServices.AdomdClient’a bir başvuru eklemeniz gerekir:

C: \ Program Dosyaları (x86) \ Microsoft.NET \ ADOMD.NET

ve ClearAllCaches () yöntemini (benim durumumda) XMLaDiscover'a gereksiz referanslarla açıklayın. Bunu TaskScheduler'a at.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.