Edycja w rejestrze wartości: LargeSystemCashe - jaka wartość dla mojej konfiguracji PC?


(Djzon) #1

Edycja w rejestrze wartości: LargeSystemCashe - jaka wartość dla mojej konfiguracji PC?

Muszę ograniczyć(zmienić) tą wartość aby nie wykorzystywało zawsze max. pamięć RAM podczas ciągłego zapisu/odczytu na pojemnych dyskach...

Jaka poprawna wartość (domyślnie jest 0)


(GL1zdA) #2

0 jest właściwe. http://technet.microsoft.com/en-us/library/cc784562%28v=WS.10%29.aspx


(Djzon) #3

Nie! Dla mojego komputera powinno być inny.

10 TB dysk (czyli można traktowac jak serwer)


(Bogdan_G) #4

Masz w modelu podane cache dysku. 64MB?

Poczytaj ten tweak.

http://translate.google.pl/translate?hl=pl&sl=en&u=http://arstechnica.com/tweak/nt/cache.html&prev=/search%3Fq%3Dlarge%2Bsystem%2Bcache%26safe%3Doff


(GL1zdA) #5

No to ustaw 1, tylko wcześniej przeczytaj co to oznacza. Nie masz zbyt dużego wyboru. Tam może być ustawione albo 0 albo 1.


(Djzon) #6

Temat dotyczy bardzo starych wersji systemu np. WINDOWS 98

Jeśli Buffor osiągnie bliskie 0 MB to i wykorzystanie pamięci będzie 10 GB więc zmiana z 0 na 1 nie rozwiązało problemu.

Prawdopodobnie należało by zmniejszyć cashe do 256 MB lub 512 MB (max limit) ale nadal nie wiadomo jak

Np. może ktoś z tego kodu źródłewego wywnioskuje jak bez użycia tego programu “zmuszać do opróżniania pamięci podręcznej dysku” za każdym razem jeśli wykorzystanie wzrośnie

 

Allocates as much memory as possible, forcing Windows to flush the disk cache

#define WINVER 0x0500
#define WIN32_LEAN_AND_MEAN
#include <windows.h>


// Guaranteed 64kib on x86? 
// http://blogs.msdn.com/oldnewthing/archive/2003/10/08/55239.aspx
const size_t ALLOCATION_SIZE = 64 * 1024;
const size_t FILL_SIZE = ALLOCATION_SIZE - 4;


unsigned char fill[FILL_SIZE];


void my_print(const char* line) {
    DWORD dummy;
    WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), line, lstrlenA(line), &dummy, 0);
}


void my_print(size_t s) {
    char buf[80];
    wsprintf(buf, "%u", s);
    my_print(buf);
}


struct Node {
    Node* next;
    unsigned char data[FILL_SIZE];
};


bool next(Node*& head) {
    Node* p = static_cast<Node*>(VirtualAlloc(0, 64 * 1024, MEM_COMMIT, PAGE_READWRITE));
    if (!p) {
        return false;
    }


    p->next = head;
    head = p;
    return true;
}


int main(int argc, const char* argv[]) {
    if (argc == 1) {
        SYSTEM_INFO si;
        GetSystemInfo(&si);
        my_print("allocation granularity: ");
        my_print(static_cast<size_t>(si.dwAllocationGranularity));
        my_print("\n");


        WCHAR exe[MAX_PATH + 3] = {0};
        GetModuleFileNameW(0, exe, MAX_PATH);
        lstrcatW(exe, L" -");


        MEMORYSTATUSEX ms;
        ms.dwLength = sizeof(MEMORYSTATUSEX);
        GlobalMemoryStatusEx(&ms);
        unsigned long long totalPageFile = ms.ullTotalPageFile;
        const unsigned long long approximateProcessConsumption = 1536 * 1024 * 1024;


        unsigned processCount = (totalPageFile + approximateProcessConsumption - 1) / approximateProcessConsumption;


        my_print("forking ");
        my_print(processCount);
        my_print(" subprocesses\n");


        HANDLE processes[processCount];
        for (unsigned i = 0; i < processCount; ++i) {
            STARTUPINFOW si;
            ZeroMemory(&si, sizeof(si));
            si.cb = sizeof(si);
            
            PROCESS_INFORMATION pi;
            if (!CreateProcessW(0, exe, 0, 0, FALSE, 0, 0, 0, &si, &pi)) {
                my_print("failed to create process\n");
                return 1;
            }
            processes[i] = pi.hProcess;
            CloseHandle(pi.hThread);
        }


        for (unsigned i = 0; i < processCount; ++i) {
            WaitForMultipleObjects(processCount, processes, TRUE, INFINITE);
        }


        my_print("done\n");
        return 0;
    }


    // Maybe zeroes are magic.
    for (size_t i = 0; i < FILL_SIZE; ++i) {
        fill[i] = i;
    }


    size_t total = 0;


    my_print("allocating... ");
    Node* head = 0;
    while (next(head)) {
        ++total;
    }


    my_print(total * 64 * 1024);
    my_print(" bytes\n");
    my_print("flushing...\n");


    // Should we make multiple passes?
    Node* p = head;
    while (p) {
        CopyMemory(p->data, fill, FILL_SIZE);
        p = p->next;
    }

(Bogdan_G) #7

Chodziło mi o zasadę i wpływ takiego ustawienia large system cache. Dlatego było poczytaj, żeby się zorientować. Co do 10TB, to mogę tylko pomarzyć.

W zaawansowanych opcjach wydajności, użycie najlepszej wydajności dopasuj do bufora systemowego, o ile dysk służy Ci poniekąd, jako serwer. Domyślnie jest to ustawione na programy.


(Djzon) #8

a76321307928682.jpg

W XP jest opcja buffor… w Win 7 nie ma takiej opcji


(Bogdan_G) #9

No fakt - chodziło o usługi działające w tle. Sprawdziłem w aspire.

http://pclab.pl/tip/Optymalizacja.Windows.obalamy.mity,43293/6 Na dole dot. win7.


(Djzon) #10

Te ustawienia niczego nie zmieniają szanowny kolego :smiley: czego ja już nie próbowałem(czyt. testowałem) :slight_smile:


(Bogdan_G) #11

http://translate.google.pl/translate?hl=pl&sl=en&u=http://en.kioskea.net/faq/7106-windows-7-increase-the-performance-of-disk-cache&prev=/search%3Fq%3Dincrease%2Bbuffer%2Bcache%2Bwindows%2B7%26safe%3Doff U mnie ustawione jest domyślnie size na 50, może tu można dużo zwiększyć?

Tu jest podstrona - Windows 7 - Zwiększenie rozmiaru bufora w wierszu polecenia » instrukcje - Windows 7

choć - i w xp i w win 7 jest tyle samo domyślnie.


(Djzon) #12

Bogdan_G nie o to chodzi, to dotyczy CMD a nie pamięci, cashe sytemu!