Використання оперативної пам'яті з метафайлом Windows Server 2008 R2


33

У мене є сервер, на якому працює Windows Server 2008 R2 x64 з 4 Гб оперативної пам’яті, який вміщує близько 2-3 мільйонів файлів, більшість з яких - файли зображень.

Протягом тижня я помітив, що програми на сервері сповільнюються до повзання через надмірне підключення до диска через низьку пам’ять, що має вибійний ефект для всіх служб, які зараз працюють на ньому, викликаючи великий питання про продуктивність.

Під час розслідування в диспетчері завдань я помітив, що майже всі 4 ГБ використовувались, але коли ви переглядаєте вкладку "Процеси", сума всього обсягу використання пам'яті там не накопичується, і, мабуть, використовується лише 1,5 ГБ.

Використовуючи Google для пошуку рішення, виявляється, що більша частина оперативної пам’яті була використана в «Metafile», який є кешем інформації NTFS для файлів у файловій системі, щоб системі не потрібно було знову запитувати MFT для отримання інформації. Цей кеш ніколи не очищається і не позначається як "кеш" в диспетчері завдань або як "очікування" в RamMap Sysinternal.

Була пропозиція встановити виправлення KB979149, але, намагаючись встановити його, він говорить: "Це оновлення не стосується вашого комп'ютера".

Єдині тимчасові виправлення, які я до цього часу знайшов:

  1. Використовуйте RAMmap від Sysinternals до "Порожній робочий набір системи" кожні 1-3 дні, який позначає кеш як "очікування" та "кеш" в диспетчері завдань, щоб оперативна пам'ять могла використовуватися іншими програмами.
  2. Перезавантажте машину, що небажано, оскільки цей сервер обслуговує загальнодоступні веб-сайти.

На даний момент мені доводиться виконувати 2. виправлення кожні кілька днів, щоб запобігти досягненню вузького рівня.

Перед: (використовується оперативна пам'ять 800 Мб - інші програми не можуть використовувати цю оперативну пам’ять)

введіть тут опис зображення

Після: (800 Мб оперативної пам’яті позначено як кеш - доступно для інших програм)

Отже, моє запитання до всіх вас: Чи існує якийсь метод для обмеження використання ОЗУ цього метафайлу?


4
4 Гб оперативної пам’яті на сервері, на якому розміщено 2-3 мільйони файлів, це абсурд. Оновіть оперативну пам’ять або оновіть оперативну пам’ять.
pauska

1
Незважаючи на це, CacheSet від Sysinternals дозволяє мені встановити розмір кешу, в даний час це виконується з інтервалом, і це робить для мене проблему!
al2k4

6
Додавання оперативної пам’яті не вирішує проблему. Кеш-метафайл також заповнить це. Я спробував це зробити на гість VMware, який розпочав з 4 ГБ і збільшив його до 12 ГБ, і те саме відбувається. Проблема полягає в тому, що ця пам’ять призначена для кеш-пам'яті, але не позначається як кеш відповідно до Windows. Він неправильно позначений як пам'ять Active / In Use, і, на жаль, у міру зростання він витісняє справжню пам'ять Active / In Use, яку використовують реальні програми, і починає переходити на диск. Коли заповнюється фізична оперативна пам'ять, все сповільнюється, і вам доведеться зробити одне з двох рішень, як згадується в оригінальній публікації.

@ al2k4 Якщо ваше питання було вирішено, позначте його як вирішене, натиснувши галочку біля правильної відповіді. Ласкаво просимо до помилки сервера !
Майкл Хемптон

Відповіді:


16

Найкращим методом вирішення цього питання є використання SetSystemFileCacheSizeAPI як MS KB976618 інструкцій, що використовуються для інструктажу .

Не періодично очищайте кеш

Використання SetSystemFileCacheSizeфункції, а не очищення кеша, періодично покращує продуктивність та стабільність. Періодично очищаючи кеш, це призведе до того, що з пам'яті очищається занадто багато метафайлів та іншої інформації, і Windows доведеться перечитувати необхідну інформацію назад в оперативну пам'ять з жорсткого диска. Це створює раптовий і сильний спад продуктивності протягом декількох секунд кожного разу, коли ви очищаєте кеш, з подальшим хорошим показником, який повільно знижується, оскільки пам'ять заповнюється даними метафайлів.

Використання SetSystemFileCacheSizeфункції встановлює мінімум та максимум, що призведе до того, що Windows позначить надлишки старих даних метафайлів як резервну пам'ять, яку звичайні функції кешування можуть використовувати або відкидати відповідно до поточних вимог до ресурсів та звичайних пріоритетів кешу. Це також дозволяє більше даних метафілів, ніж встановлений максимум активної пам'яті, зберігатись у пам'яті як резервні дані, якщо Windows не використовує пам'ять ні для чого іншого, зберігаючи при цьому достатню кількість доступної пам'яті. Це ідеальна ситуація, яка постійно підтримує хороші експлуатаційні характеристики системи.

Сторонні програми не підтримуються MS

Якщо ви схожі на мене і не хочете запускати бінарні файли від якоїсь невідомої третьої сторони на своїх виробничих серверах, вам потрібен офіційний інструмент MS або якийсь код, який ви можете перевірити, перш ніж працювати на цих серверах. Інструмент DynCache 2008 R2 практично неможливо отримати з M $ без оплати справи підтримки і, чесно кажучи, на основі коду 2008 року, здається, надмірно роздутий для завдання, оскільки Windows вже має вбудовану логіку, необхідну для динамічного розміру кеш - він просто повинен знати відповідний максимум для вашої системи.

Рішення всього вищесказаного

Я написав сценарій Powershell, який працює на 64-бітних машинах. Вам потрібно запустити його як адміністратора з підвищеними привілеями. Ви повинні мати змогу запускати його, як і на будь-якому x64 Windows Vista / Server 2008 до 10 або включаючи 10 / Server 2012 R2 з будь-якою кількістю оперативної пам’яті. Вам не потрібно встановлювати додаткове програмне забезпечення, і, як результат, підтримуйте MS-сервер / робочу станцію повністю підтримуваною.

Цей сценарій слід запускати при кожному завантаженні з підвищеними привілеями, щоб налаштування було постійним. Планувальник завдань Windows може зробити це за вас. Якщо інсталяція Windows знаходиться всередині віртуальної машини, і ви змінюєте кількість оперативної пам’яті, виділеної для цього 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% від загальної фізичної оперативної пам’яті. Windows буде динамічно розміщувати кількість даних метафайлів в активній пам'яті на основі системних вимог, тому вам не потрібно динамічно регулювати цей максимум.

Це не виправить жодних проблем, пов’язаних із тим, що кеш файлів відображається занадто великим.

Я також створив GetSystemFileCacheSizeсценарій Powershell і розмістив його на StackOverflow .


Редагувати: Я також повинен зазначити, що ви не повинні запускати жоден із цих 2-х сценаріїв з одного і того ж екземпляра Powershell не один раз, інакше ви отримаєте помилку в тому, що Add-Typeвиклик вже був здійснений.

Редагувати: оновлений SetSystemFileCacheSizeсценарій до версії 1.1, який обчислює відповідне значення максимального кешу для вас і має кращий вихідний макет статусу.

Редагувати: Тепер я оновив свій ноутбук Windows 7, можу сказати, що сценарій успішно працює в Windows 10, хоча я ще не перевіряв, чи все-таки потрібен. Але моя система все ще стабільна, навіть коли переміщуються HDD файли віртуальної машини.


Інструмент DynCache вільно доступний для завантаження з microsoft.com/en-us/download/details.aspx?id=9258 та підтримує 2008 R2.
Якуб Березанський

Це зараз. Існував тривалий час між випуском вікон R2 та випуском DynCache. Дивіться blogs.technet.com/b/yongrhee/archive/2010/02/16/… для оновлення повідомлення в блозі. Я все ще віддаю перевагу моєму рішенню, оскільки воно не вимагає додаткових ресурсів для запуску ще однієї послуги. Наші сервери стали дуже стабільними з моїм сценарієм, тому я не змінюю їх на DynCache.
BeowulfNode42

@ BeowulfNode42 - У нас виникають проблеми з відображенням кешованого файлового кешу. Чи є у вас покажчики, як вирішити це? Я був припущений, що встановлення розміру кешу системного файлу також вирішить цю проблему ?! Чи маєте ви ідею, чи вирішив би цю проблему інструмент DynCache (роздутий) ?
Лівен Кірсмейкер

fwiw - Я щойно приміряв тестовий сервер, і Mapped File (rammap) отримав від 12 ГБ Active, 0GB Standby до 8GB Active, 4GB Standby. Для всіх намірів і цілей, схоже, це працює і для Mapped Files ?!
Лівен Кірсмейкер

@LievenKeersmaekers це дивно. Можливо, це якийсь потік ефекту. Я не натрапив на гарний спосіб вирішити проблему кешеного відображення файлів, що виникає при копіюванні файлів із швидкого зберігання на повільне, хоча я не пробував інструмент DynCache, тому що для нас проблема кешу файлів із картами в основному є просто прикрою тимчасовою сповільнити роботу на наших серверах, які керують нашими резервними копіями. Для подальшої довідки, скільки у оперативної системи має тест-система і чи запускали ви сценарій у розміщенні з налаштуванням 12,5%, і якщо ви пам’ятаєте чи записуєте інші типи розміру пам'яті?
BeowulfNode42

4

Я не претендую на експерт щодо внутрішніх функцій кешування пам'яті або кешування диска в ОС Windows, але у мене є два спостереження:

  1. Якби ОС не кешувала дані в пам'яті, вона повинна була б прочитати їх з диска, який є експоненціально повільнішим носієм зберігання даних, ніж пам'ять, тому проблема продуктивності, яку ви бачите зараз, майже напевно буде гіршою.

  2. Ви намагаєтеся вирішити проблему, обробляючи симптом проблеми замість причини проблеми. Причиною проблеми майже напевно є відсутність достатньої фізичної оперативної пам’яті, і я можу запропонувати це рішення.

Крім того, хоча кеш може використовувати 1,5 Гб оперативної пам’яті, мені було б цікаво, що використання пам’яті для інших процесів і служб, і може бути рішенням дослідити це використання на предмет можливих проблем.


Саме так. Якщо ОП зменшило використання оперативної пам'яті метафайлу, системі доведеться завантажити більше метаданих з диска, оскільки менше цього буде в пам'яті, що робить гірше.
Девід Шварц

1
Дякуємо за відгук. Мало що, сервер - це насамперед веб-сервер із базою даних MySQL і не читає файли дуже часто, тому незначний вплив метаданих відсутності в кеші мінімальний, продуктивність різко збільшується при очищенні. Саме кількість файлів, які він читає з часом, саме тому розмір кешу стає все більшим і більшим. Я добре знаю, що більше оперативної пам’яті вирішить це, але чи не ідея «кешу» - це звільнити пам’ять, коли додатки чи сценарії на сервері дійсно потребують цього, щоб уникнути пейджингу? Чому цей певний кеш завжди позначений як активний, мене бентежить.
al2k4

Ви, очевидно, ніколи не стикалися з цим питанням самостійно. У багатьох людей з 32, 64 та 128 ГБ оперативної пам’яті є ця проблема, коли надто велика кількість оперативної пам’яті займає дані метафайлу, а Windows не випускає її, оскільки вона позначена як активна та не резервна (також кеш) пам’ять. Використання API SetSystemFileCacheSize, як я описав у своїй відповіді, змушує Windows відзначати більшу частину даних метафайлів як резервну пам'ять, а система кешування кешів зможе визначити пріоритет, що потрібно зберігати в оперативній пам'яті, а що відкинути.
BeowulfNode42

Тролей багато? Це питання більше двох років.
joeqwerty

@joeqwerty Я постійно бачу нові повідомлення про цю проблему в мережі. Багато запитань, пов'язаних із цим, стосуються цього питання. Оскільки я оновлював власну відповідь і вважаю, що ваша відповідь "не корисна", я позначив її як таку і прокоментував чому. Якщо це робить мене тролем, так і нехай буде.
BeowulfNode42

3

Людям, які дали очевидне, але неефективне рішення просто додати більше оперативної пам’яті, ви, очевидно, не вирішили цю проблему з перших рук.

Як було сказано в попередньому плакаті, неважливо, скільки оперативної пам’яті ви кинете на проблему ... вона все заповниться. На нашому сервері додатків працює набір інструментів Atlassian, який переміщено з 32-бітного (2003) до 64-бітного (2008). Відразу було видно, що є втрати продуктивності.

Переглядаючи диспетчер завдань, майже вся пам'ять була використана; навіть незважаючи на те, що запущені процеси цього не відображають. Коли ми збільшили пам’ять з 8 ГБ до 16 ГБ, проблема також використала додаткову пам'ять.

Єдиний спосіб вирішити цю проблему - перезапустити сервер, що знизило використання пам'яті рівним процесам (близько 3,5 ГБ). Це почало знову підніматися протягом доби.

Я знав, що це нова помилка / функція Microsoft, і радий знайшов цю статтю. Мені подобається, як Microsoft залишає цю важливу деталь для користувачів, щоб розібратися. Я завантажив RamMap, який, на вашу думку, буде нативним інструментом, і тепер я бачу використання Metafile. Ми встановимо, що кеш буде очищено кожні кілька днів, і, сподіваємось, це вирішить проблему.

Цікаво, що я бачив цю проблему лише на одному з декількох перенесених серверів, тому мені цікаво, чи метафайл подається лише з певних типів програм.


1
На мій досвід, використання метафайлової пам'яті не буде набагато перевищувати розмір метаданих файлової системи (це все-таки кешування), тому оновлення оперативної пам’яті, щоб метадані файлової системи вмістилися в пам’яті, є придатним рішенням принаймні в деяких випадках. Я також рекомендував клієнтам зменшити розмір метаданих файлової системи, видаливши чіткі, наприклад мільйони тимчасових файлів, які не торкалися протягом місяців. Досить незручно, що Windows ефективно віддає перевагу метаданим NTFS у пам'яті над пам’яттю додатків, але пошук кластерів для файлу може бути жахливо повільним, без MFT в пам'яті.
Джеймс Л

2
Я погоджуюся - додавання більше оперативної пам'яті не виправляє проблему, вона просто споживає більше, і всі інші процеси згодом припиняться. Нещодавно я оновив до 24 ГБ, тільки щоб SQL зайняв 8 (чудово) та 12 мав у метафайлі. Джеймс Н - який інструмент ви використовуєте для періодичного очищення?
sirthomas

2

Цю проблему можна вирішити швидко та безкоштовно за допомогою інструменту SysInternals CacheSet. Просто встановіть робочий набір максимум на відповідне значення, менше за об'єм оперативної пам'яті, і застосуйте.


1

Вибачте, що так прямо, але що робити з оновленням сервера до кількості оперативної пам’яті, яка трохи вище, ніж на робочих станціях у ці дні? 16Gb memroy вигадливо дешево. Менш дорого, ніж навіть півдня вашого часу.


2
Це вирішило б це назавжди, але наші сервери віддалено розміщуються третьою стороною. Наші господарі стягуватимуть велику суму просто для збільшення оперативної пам’яті щомісяця. Тож ми хотіли б цього уникнути, якщо можливо.
al2k4

2
Так. Здогадайтесь, що;) Ось чому я купую своє обладнання. Господарі божевільні - оперативну пам’ять можна придбати за 3 місяці. Що ж, уроки, щоб засвоїти: непрофесійне налаштування повертається, щоб вкусити вас.
TomTom

У всіх системах 64-бітових вікон встановлено 1 ТБ для максимального обсягу даних метафайлів, які мають мати активну пам'ять (не розглядаються як кешована пам'ять в режимі очікування, готова до використання, коли інші речі потребують більше пам'яті). Я не знаю про вас, але я ще не бачив жодної віконної скриньки з такою кількістю пам'яті. Вам не доведеться встановлювати більше оперативної пам’яті, щоб використовувати більше файлів, що зберігаються на жорсткому диску. NTFS повинен підтримувати до 4 294 967 295 файлів на обсяг. Один привід 4TB NTFS повинен мати можливість підтримувати понад 900 мільйонів файлів. Спробуйте запустити дефрагментацію чи резервну копію на цьому, і вона не вдасться або сканувати.
BeowulfNode42

1
Так, ви повинні мати, якщо ваш "Сервер" має менше оперативної пам'яті, ніж потужний ноутбук. Йдеться не про те, щоб "стати смішно високим". Йдеться про "отримати достатньо, щоб сервер заслужив це ім'я".
TomTom

1

Ось посилання для завантаження інструменту Microsoft DynCache - не потрібно створювати квиток або платити. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258

(вибачення - лише помічаючи тепер, що це не для версії R2)

Відомий питання для подальшого зростання кеша описано тут , на Microsoft блозі: 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: \ програмні файли (x86) \ Microsoft.NET \ ADOMD.NET

і прокоментуйте метод ClearAllCaches () з (у моєму випадку) непотрібними посиланнями на XMLaDiscover. Киньте це в програму завдань.


0

Ви можете отримати інструмент DynCache від MS, який дозволить обмежити використання оперативної пам'яті метафайлом.

Клацніть тут, щоб отримати інструмент від MS .


Це посилання не забезпечує нічого для систем R2 2008 року. M $ все одно хочуть вашу кредитну карту, щоб ви могли заплатити за виправлення цієї відомої проблеми.
BeowulfNode42
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.