2

我有一个一直在运行的服务器,系统制作元文件然后保存在内存中,这增加了我的 RAM 的使用率,所以我需要使用软件Rammap清空系统工作集,这是一个非常忙碌的例程。我必须每天做两次。我希望会有一个应用程序在给定时间段后自动清空系统工作集。经过漫长而深入的研究,我没有发现任何类似 Rammap 的东西,甚至没有一个库。

因此,任何人都知道通过使用我们将能够使应用程序自动清空系统工作集的任何方式。

4

2 回答 2

0

如本文所述,有一个实用程序可以执行此操作。您可以使用 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;
}
于 2014-01-20T21:10:38.800 回答
0

随着时间的推移,很多人报告了这个问题。Windows 缓存算法存在一些缺陷,如果您碰巧遇到它们,缓存会失去控制,直到达到 99%。为了恢复服务器性能,必须清除系统工作集,而 Windows 似乎永远不会自行执行此操作,尤其是在处理大型文件服务器时。该工具是免费软件,位于我们的 BackupChain 网站的免费工具部分。您设置了 RAM 限制,仅此而已。清空是自动完成的希望这有帮助!

于 2016-08-06T11:38:00.110 回答