Есть ли программное обеспечение с открытым исходным кодом, такое как Rammap?

У меня есть сервер, который работает все время, система создает метафайл и затем сохраняет в памяти, это увеличивает использование моей оперативной памяти, поэтому мне нужно очистить рабочий набор системы с помощью программного обеспечения Rammap, что является очень беспокойной рутиной. Я должен делать это два раза в день. Я хочу, чтобы появилось приложение, которое автоматически очищает рабочий набор системы по истечении заданного периода. После очень долгих и глубоких исследований я не нашел ничего похожего на Rammap, даже ни одной библиотеки.

Таким образом, любой знает о любом способе, с помощью которого мы сможем создать приложение для автоматической очистки рабочего набора системы.

2 ответа

Для этого есть утилита, как указано в этом посте. Вы можете использовать планировщик заданий Windows, чтобы он периодически запускался.

В качестве альтернативы, если у вас есть определенный набор файлов, которые вы хотите удалить из резервного кэша Windows, вы можете открыть их с помощью NtCreateFile (часть WDM) и вызвать FlushFileBuffers, чтобы удалить их из резервного кэша. Вот что я сделал, чтобы проверить это с помощью небольшого приложения командной строки. Вам нужно будет включить winternl.h и вытащить ntdll.lib. Это, очевидно, можно сделать более надежным - это приложение для быстрого тестирования в этом состоянии. (Я попытался использовать instegad CreateFile из NtCreateFile, чтобы мне не понадобился 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;
}

Многие люди сообщили об этой проблеме с течением времени. В алгоритме кэширования Windows есть некоторые подводные камни, и если вы столкнетесь с ними, кэш выйдет из-под контроля, пока не достигнет 99%. Чтобы восстановить производительность сервера, системный рабочий набор должен быть очищен, и Windows, кажется, никогда не делает это самостоятельно, особенно когда вы имеете дело с огромными файловыми серверами. Инструмент является бесплатным и находится на нашем сайте BackupChain, в разделе бесплатных инструментов. Вы устанавливаете лимит ОЗУ, и на этом все. Опорожнение происходит автоматически. Надеюсь, это поможет!

Другие вопросы по тегам