Я работаю над тем, что по существу является средой выполнения для большого административного приложения. Фактическая логика, которая выполняется, а также показанные экраны и оперируемые данные хранятся в центральной базе данных. Для повышения производительности среда выполнения хранит данные, запрашиваемые из базы данных, в различных кэшах.
Однако не всегда понятно, как управлять этими кэшами. В настоящее время некоторые кэши сбрасываются всякий раз, когда среда выполнения простаивает, тогда как другие кэши никогда не сбрасываются или сбрасываются только при достижении некоторого настраиваемого, но произвольного предела. Мы, очевидно, хотели бы хранить как можно больше данных в памяти, но я не уверен, как сделать это так, чтобы это хорошо сочеталось с Citrix, что очень важно для наших клиентов.
Я изучал использование уведомления о ресурсах (CreateMemoryResourceNotification()
) и очистку кешей, если он сигнализирует о нехватке памяти, но я боюсь, что использование только этого приведет к очень плохому поведению при работе более 20 экземпляров. в Citrix один экземпляр поглощает всю память, а остальные постоянно очищают свои кэши.
Я мог бы установить жесткие ограничения на размер кэша с CreateJobObject()
и друзьями, но это могло бы привести к сбою времени выполнения из-за ошибок нехватки памяти, если у экземпляра была законная потребность в большом количестве памяти.
Я мог бы предотвратить такие проблемы, используя отдельную кучу для кэшированных данных, но нет четкого разделения между кэшированными и не кэшированными данными, так что это выглядит ужасно хрупким.
TL; DR : у кого-нибудь есть хорошие идеи по управлению кэшами в памяти под Windows?