我有一个一直在运行的服务器,系统生成元文件然后保存在内存中,这增加了我的RAM的使用量,因此我需要使用软件Rammap清空系统工作集。是一个非常繁忙的例行公事。我必须每天做两次。 我希望有一个应用程序在给定的时间段后自动清空系统工作集。经过漫长而深入的研究后,我发现Rammap,甚至没有一个库都没有。
所以任何人都知道通过使用哪种方式我们将能够使应用程序自动清空系统工作集。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
随着时间的推移,很多人都报告了这个问题。 Windows缓存算法中存在一些缺陷,如果碰巧遇到它们,缓存会失控,直到达到99%。为了恢复服务器性能,必须清除系统工作集,并且Windows似乎永远不会单独执行此操作,尤其是在处理大型文件服务器时。 该工具是免费软件,它位于我们的BackupChain网站,免费工具部分。您设置了RAM限制,这就是它的全部内容。清空是自动完成的 希望这有帮助!