Чрезмерная синхронизация отображенного в памяти файла в модуле Apache - PullRequest
1 голос
/ 08 декабря 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

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

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

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

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

0 голосов
/ 08 декабря 2010

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

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

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

...