Apache все равно вызывает mmap(), даже при “EnableMMAP Off”.

Вопрос или проблема

Я использую общую файловую систему, и вызовы mmap() вызывают некоторые проблемы, я установил:

~# grep -i "mmap\|sendfile" /etc/httpd/conf/httpd.conf 
EnableMMAP            Off
EnableSendfile        Off

и остановил/запустил apache, чтобы завершить существующие потоки, но я все еще вижу вызовы mmap() в strace:

~# for pid in $(pidof httpd); do strace -tt -T -ff -o trace-$pid -p $pid & done                                                                                      
~# grep 'mmap(' ./trace-23187* | wc -l

мой файл конфигурации является активным, и его версия 2.4.43

~# httpd -t
Syntax OK
~# httpd -t -D DUMP_INCLUDES | head
Included configuration files:
  (*) /etc/httpd/conf/httpd.conf
~# httpd -v
Server version: Apache/2.4.43 (centos)
Server built:   Jun 15 2020 12:10:08

Я не уверен, что проверять дальше, любые рекомендации приветствуются.

Ответ или решение

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

Теория

В Apache опции EnableMMAP Off и EnableSendfile Off традиционно используются для отключения механизмов оптимизации ввода-вывода. Эти механизмы могут повышать производительность, но на системах с общей файловой системой могут вызвать различные проблемы, в том числе из-за специфических особенностей работы с файлами и синхронизации данных.

Включение EnableMMAP Off должно запретить использование функции mmap() для определённых типов файловых операций, а именно для работы с файлами на диске, используемых непосредственно через Apache. Однако стоит заметить, что данное указание не влияет на внутренние операции в самом ядре системы или сторонних модулях и библиотек, которые могут быть загружены и работать в пространстве Apache.

Пример

Вы проверили конфигурацию с помощью команд:

~# grep -i "mmap\|sendfile" /etc/httpd/conf/httpd.conf 
EnableMMAP            Off
EnableSendfile        Off
~# httpd -t
Syntax OK
# httpd -t -D DUMP_INCLUDES | head
Included configuration files:
  (*) /etc/httpd/conf/httpd.conf
~# httpd -v
Server version: Apache/2.4.43 (centos)

Все проверки показывают, что конфигурация активна и синтаксически корректна. Однако, при использовании strace, вы продолжаете наблюдать вызовы mmap(), что указывает на потенциальные проблемы, которые не связаны напрямую с указанной конфигурацией.

Применение

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

  1. Аудит модулей и зависимостей:
    Важно выяснить, какие модули загружены в Apache и не используют ли они напрямую mmap(). Попробуйте выполнить команду httpd -M, чтобы получить список загруженных модулей, и изучите документацию каждого из них.

  2. Проверка библиотек:
    Некоторые сторонние библиотеки или модули, которые могут быть частью вашей веб-приложения, также могут использовать mmap(). Проверьте, нет ли их внутри кода приложения или среди установленных библиотек.

  3. Изучение других конфигураций:
    Убедитесь, что в системе нет других конфигурационных файлов Apache, которые могут переопределять настройки EnableMMAP. Это может быть /etc/httpd/conf.d/*.conf или другие файлы и папки.

  4. Анализ syscalls:
    Используйте strace не только на httpd, но и на других процессах, чтобы понять, не инициируют ли вызовы mmap() другие компоненты системных приложений.

  5. Обновление Apache:
    Поскольку ваша версия Apache (2.4.43) не самая свежая, возможно, проблема уже решена в последующих обновлениях. Рассмотрите возможность обновления до более новой версии Apache.

  6. Анализ кода приложения:
    Некоторые вызовы mmap() могут инициироваться непосредственно кодом вашего веб-приложения. Проведите аудит источников вашего кода для выявления таких вызовов.

  7. Использование контейнеров:
    Если обстановка позволяет, рассмотрите возможность поместить ваше приложение в контейнер (например, Docker) для изоляции и более гибкой настройки окружения.

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

Оцените материал
Добавить комментарий

Капча загружается...