2010-12-08 4 views
1

В настоящее время я работаю над модулем Apache, который использует большой файл mmap для обмена данными между процессами. Это создается при запуске и удаляется, когда сервер выключается (возможно, он захочет сохранить его на более позднем этапе). Я реализовал это с использованием Apache APR-библиотек, и он работает хорошо, по крайней мере, для небольших файлов.Чрезмерная синхронизация файла с отображением памяти в модуле Apache

При увеличении размера файла с отображением памяти (все еще достаточно ОЗУ для кэширования при запуске сервера) система порой практически останавливается, как кажется операционной системе (Linux в моем случае) потребляет много ресурсов, синхронизируя файл с диском. Есть ли способ контролировать/уменьшать эту синхронизацию?

Поскольку на данный момент мне не нужно содержимое, синхронизированное с диском, я, скорее всего, должен был использовать сегмент разделяемой памяти, и попробуем это вместо этого. Тем не менее, я все еще заинтересован в способах управления синхронизацией файлов с отображением памяти.

ответ

2

Запись в ваш сопоставленный файл создает грязные страницы - страницы памяти, которые в какой-то момент должны быть записаны в их хранилище резервных копий (в данном случае ваш файл на диске).

Вывод грязных страниц настраивается некоторыми кнопками в /proc/sys/vm/. В частности, если количество грязных данных в вашем сопоставленном файле обычно велико по сравнению с вашей общей системной памятью, вы можете значительно увеличить dirty_ratio (скажем, до 60) и dirty_background_ratio немного (скажем, до 30).

Возможно, вы также захотите увеличить dirty_expire_centisecs, но значение по умолчанию уже довольно продолжительное (5 минут) (это возраст, который должны иметь грязные данные, прежде чем он станет доступен для выхода).

Следует отметить, что переход на общую память - это просто вопрос создания отображаемого файла в /dev/shm/, предполагая, что ваш дистрибутив поддерживает tmpfs.

0

Файлы с отображением памяти явно синхронизированы с msync(), хотя ОС может очистить содержимое памяти в случае сбоя страницы. Итак, нужно несколько вещей, чтобы найти:

  1. Есть ли в исходном коде библиотеки Apache много msync()?
  2. Является ли ваше приложение прыгающим в памяти? То есть, вы получаете доступ к несерийной памяти? Это часто происходит с ненадлежащими структурами данных или когда индексы вложенных циклов не соответствуют индексам многомерных массивов.

Вы можете попробовать профилировать свой код, чтобы узнать, есть ли неэффективность, которая может привести к неожиданному числу ошибок страницы.

+0

Библиотека APR управляет только созданием файла с отображением памяти и не содержит вызовов msync(). Я также не вызываю msync() в моем коде. Тем не менее, мой код немного перескакивает в памяти, так как файл содержит кэшированные данные. – Chris 2010-12-08 15:30:11

Смежные вопросы