2012-06-22 40 views
2

我有一臺服務器一直在運行,系統生成元文件並保存在內存中,這增加了我的RAM的使用,因此我需要使用軟件Rammap清空系統工作集,這是一個非常緊張的例程。我必須每天做兩次。 我希望有一個應用程序會在給定的時間段後自動清空系統工作集。經過很長時間和深入的研究,我發現了什麼都沒有Rammap,甚至沒有一個單一的圖書館。有沒有像Rammap這樣的開源軟件?

所以任何人都知道任何方式,我們將能夠使應用程序自動清空系統工作集。

+0

在linux上,你可以使用'mlock'系統調用。 –

+0

它的Windows Server 2008 :-( –

+0

我希望能夠做到這一點,但對於Windows 7企業。 –

回答

0

this post所示,有一個實用程序可以執行此操作。 您可以使用Windows任務計劃程序使其定期運行。或者,如果您想要從Windows的備用緩存中刪除特定的一組文件,可以使用NtCreateFile(WDM的一部分)打開它們,並調用FlushFileBuffers將它們從待機緩存中清除。 下面是我用小型命令行應用程序測試它的方法。你將需要包含winternl.h並拉入ntdll.lib。這顯然可以變得更加強大 - 這是一個在這種狀態下的快速測試應用程序。 (我嘗試使用NtCreateFile的的CreateFile instegad,這樣我就不需要WDK,但還沒有運氣這條路線,但是。)

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    if (argc < 2) 
    { 
     _tprintf(TEXT("No filepath entered. Full path required.\r\n")); 
     return 0; 
    } 

    // Convert the "DOS" name to a Windows object model name so NtCreateFile can handle it below 
    // MAX_FILE_PATH_LEN is just #define'd elsewhere to 1024 
    TCHAR filePath[MAX_FILE_PATH_LEN] = { 0 }; 
    TCHAR deviceName[8] = { 0 }; 
    _tcsncpy_s(deviceName, 8, argv[1], 2); 
    QueryDosDevice(deviceName, filePath, MAX_FILE_PATH_LEN - 1); 
    _tcscat_s(filePath, MAX_FILE_PATH_LEN, &argv[1][2]); 

    _tprintf(TEXT("Converted: \"%s\"\r\n  ==> \"%s\"\r\n"), argv[1], filePath); 

    UNICODE_STRING usFilePath = { 0 }; 
#ifndef _UNICODE 
    WCHAR filePath_W[MAX_FILE_PATH_LEN]; 
    size_t convCount = 0; 
    mbstowcs_s(&convCount, filePath_W, MAX_FILE_PATH_LEN, filePath, MAX_FILE_PATH_LEN); 
    usFilePath.Buffer = filePath_W; 
#else 
    usFilePath.Buffer = filePath; 
#endif 
    // Lengths specifically noted as bytes, not characters 
    usFilePath.Length = wcslen(filePath) * sizeof(WCHAR); 
    // Leaving one character for null term 
    usFilePath.MaximumLength = (MAX_FILE_PATH_LEN - 1) * sizeof(WCHAR); 

    OBJECT_ATTRIBUTES objAttrs; 
    InitializeObjectAttributes(&objAttrs, &usFilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL) 

    IO_STATUS_BLOCK ioStatus_OpenFile = {0}; 
    HANDLE hFile = INVALID_HANDLE_VALUE; 
    NTSTATUS statusCreateFile = NtCreateFile(&hFile, FILE_GENERIC_READ | FILE_GENERIC_WRITE, &objAttrs, &ioStatus_OpenFile, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_DELETE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE, NULL, 0); 
    if (NT_SUCCESS(statusCreateFile)) 
    { 
     _tprintf(TEXT("Opened file successfully.\r\n")); 

     IO_STATUS_BLOCK fileFlushStatus = { 0 }; 
     BOOL bFlushResult = FlushFileBuffers(hFile); 
     _tprintf(TEXT("FlushFileBuffers returned %d; last error: %d\r\n"), bFlushResult, GetLastError()); 

     // Close the file 
     statusCreateFile = NtClose(hFile); 
     if (NT_SUCCESS(statusCreateFile)) 
     _tprintf(TEXT("File closed successfully.\r\n")); 
     else 
     _tprintf(TEXT("File close error: %08x\r\n"), statusCreateFile); 
    } 
    else 
    { 
     //WriteIoStatusResultLine is just a function to dump an IO_STATUS_BLOCK to output 
     //WriteIoStatusResultLine(&ioStatus_OpenFile); 
     _tprintf(TEXT("NtCreateFile error, Status=%08x\r\n"), statusCreateFile); 
    } 

    return 0; 
} 
0

很多人都報這個問題隨着時間的推移。 Windows緩存算法中存在一些缺陷,如果碰巧碰到它們,緩存會失去控制,直到達到99%。爲了恢復服務器性能,系統工作集必須被清除,並且Windows永遠不會自行完成,特別是在處理大型文件服務器時。 該工具是免費的,它在我們的BackupChain網站上,免費工具部分。你設置一個RAM限制,這就是它。清空自動完成 希望這有助於!

相關問題