Проблема, с которой я столкнулся, довольно проста: хотя память, используемая приложениями, довольно мала (~ 2 ГБ), в то же время диспетчер задач сообщает, что на сервере практически вся используемая память (16 ГБ). Во время этого он начинает менять местами, производительность идет через пол, а задержка зашкаливает.
Я диагностировал это с помощью приложения, которое открывает множество файлов, используя доступ к отображаемой памяти (возможно, каким-то не совсем стандартным способом, как это написано в Delphi). RamMap от Sysinternals сообщает, что эти 14 ГБ используются для «сопоставленного файла» в активном состоянии. Дело в том, что это воспоминание не активно используются, эти приложения находятся в режиме ожидания без подключенных клиентов. Как можно более праздно.
Чтобы вернуть использование памяти к нормальному уровню, мне просто нужно использовать опцию «Пустой → Пустой рабочий набор системы» в RamMap. Это решает проблему отсутствия свободной памяти до тех пор, пока нет новых действий (чтение из файлов данных и т. Д.). Затем использование памяти увеличивается, а производительность снова падает.
Решением было бы написать сценарий, который будет делать то же самое, что и RamMap каждые несколько минут. Вот где я застрял. я нашел EmptyWorkingSet
WinAPI и обнаружил сценарий PowerShell для его запуска во всех процессах в системе, но он действительно уменьшает используемую память максимум на 200-300 МБ, а RamMap на это не способен.
Как регулярно запускать опцию RamMap Empty System Working Set?
Проблема была вызвана приложением, использующим FILE_FLAG_RANDOM_ACCESS. Исправил приложение.
Если кто-то опубликует общий обходной путь, я назначу ему правильный ответ.