2016-05-26 6 views
5

Мы разрабатываем корпоративное приложение, которое кэширует множество данных с задней стороны. Пользователям разрешено открывать произвольное количество окон приложений, и каждый загружает свои собственные данные и кэширует их. Чтобы каким-то образом управлять потреблением памяти и снижать общую производительность ОС, мы решили написать диспетчер кэша, который будет автоматически отслеживать размер памяти приложения и удалять данные из кеша, когда это необходимо.Стратегия управления потреблением памяти

Таким образом, проблема заключается в том, что нам трудно определить, пришло время освободить память. В настоящее время мы используем очень простой подход - мы просто начинаем отбрасывать материал из кеша, когда использование памяти приложения превышает 80% физической памяти.

Существуют ли какие-либо (альтернативные?) Установленные методы для решения такой проблемы?

ответ

3

Это в основном нормально. Нет действительно хорошей стратегии. Если есть несколько конкурирующих приложений, это может привести к соревнованиям в кешках и ложным выселениям.

Если вы выбрали слишком низкий порог, вы теряете пространство для кеш-памяти. Если он слишком высок, в память может входить не что иное, как кеш файлов, библиотеки DLL, ...

Что вы подразумеваете под «доступной физической памятью»? Вы имеете в виду установленную память или память, которая бесплатна? Как приложение может использовать 80% свободной памяти? Я не понимаю, что вы используете.

SQL Server использует память до тех пор, пока ОС не сообщит, что она мала на памяти (я считаю, что это происходит, когда используется 95% «чего-то»).

Вы, конечно же, не хотите использовать GC для освобождения памяти. Он будет обычно убивать весь ваш кеш.

Возможно, вы можете полностью перемещать содержимое кеша на диск? Или вы могли бы поделиться кешем между процессами .NET, имея скрытый процесс кеш-сервера, который может быть запросом процессами приложений.


Я хочу подчеркнуть, что если ваше приложение потребляет 99% установленной оперативной памяти (в качестве примера) производительность будет очень плохо, потому что кэш-файл почти пуст. Это означает, что даже DLL и .NET NGEN'ed код будут выгружаться и часто.

Возможно, лучшая стратегия состоит в том, чтобы предположить, что 1GB потребуется для надлежащего кэширования файлов ОС и приложений. Таким образом, вы можете использовать память до тех пор, пока не останется только 10% от установленной RAM минус 1 ГБ.

+0

По имеющейся физической памяти я имею в виду свободную память. Я знаю, что GC не может быть полностью доверен, когда дело доходит до своевременного удаления объектов, но пока во время наших тестов это не было проблемой. Кроме того, отдельные окна размещаются в одном оконном процессе, поэтому нет необходимости беспокоиться о совместном использовании кеша между ними. Как сигнал ОС относительно низкой памяти? Есть ли способ перехватить этот сигнал в .Net? –

+0

Для этого есть API: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366541(v=vs.85).aspx Но то, что Windows считает «низким», может быть не таким, как вы хотеть. Это произвольный порог; Если вы говорите: «Мы потребляем до 80% свободной памяти», тогда память больше не свободна. Так что определение не имеет смысла. Вы меняете знаменатель, потребляя память. – usr

+0

Извините, я плохо отношусь к заявлению об использовании памяти. Я исправил это в вопросе. –