Я использую MIC для моего кеша LRU на сервере, он заменил LRU с номером/картой, так как я подозревал, что именно это и вызвало некоторый необъяснимый объем памяти. Утечки памяти не соответствуют действительности, по крайней мере, ни один инструмент не обнаружил утечки, а также проверки кода. Поскольку я начал использовать MIC, изображение улучшилось (это единственный доказательство фрагментации памяти), но недостаточно. Мы говорим о нескольких ГБ кеша, из которых миллионы записей излагаются ежедневно. Через две-три недели проблема становится очевидной - если я выпущу кеш, процесс все еще содержит необъяснимые 2-3 ГБ памяти.
Мой контейнер довольно просто:boost multi_index_container и фрагментация памяти
typedef std::pair<Key, T> Element;
typedef mic::multi_index_container<
Element,
mic::indexed_by<mic::sequenced<mic::tag<struct Seq>>,
mic::hashed_unique<mic::tag<struct Hash>, mic::member<Element, const Key, &Element::first>>>>
item_list;
использует erase
и push_front
вставить новую запись (или переписать старый), а затем, если это необходимо выталкивает элемент из хвоста. Вопрос в том, стоит ли использовать replace
и relocate
вместо push_front
?
UPDATE001: Хорошо, новая версия запущена и работает, я вижу, что эта функция значительно улучшила ситуацию, объем памяти после 3 недель был на 1/1,5 Гб ниже, чем на машинах без изменений. Теперь он развернут на всех машинах по всему миру. На втором этапе существует множество изменений в механизмах недействительности кеша. Меньше эжекций и повторных вставок также должно улучшить ситуацию (в случае, если это действительно фрагментация памяти)
просто спрашивает - знаете ли вы, как malloc/free work, и почему это не имеет значения, что память процесса никогда не выпускается после выделения? –
Не имеет значения, как работает функция alloc/free, так как они не отвечают за распределение/освобождение памяти, диспетчер памяти ОС. В этом конкретном случае VirtualAllocEx будет задействован, решив, сколько памяти будет выделено (да, даже если это не выполняется с помощью alloc), и, действительно, бесплатно не гарантируют, что память будет фактически выпущена обратно в ОС. однако вы можете заставить ОС восстановить освобождение, но не отпустить обратно в память ОС \ – kreuzerkrieg
правильно ... так почему вы удивлены тем, что объем памяти в процессе не падает? Или я не понимаю проблему? –