Назад | Перейти на главную страницу

Apache с высоким использованием памяти mod_php

У нас есть приложение Magento, развернутое на Apache с помощью mod_php и mysql. Я заметил, что иногда сервер apache начинает потреблять верхний объем памяти, что вызывает подкачку памяти и приводит к высокой нагрузке на серверы. всякий раз, когда на сервере apache наблюдается высокая нагрузка, процессы apache, вызывающие высокую нагрузку, находились в спящем режиме на конце mysql и в состоянии CLOSE_WAIT на стороне клиента. Любая помощь приветствуется для решения этой проблемы.

@raj вы, вероятно, обнаружите, что процессы находятся в состоянии S, поскольку они ожидают другого процесса (в состоянии D), связанного с вводом-выводом, т.е. Чтобы машина перестала менять местами.

Таким образом, необходимо решить две ключевые проблемы: стандартное выделение памяти и выделение памяти.

При запуске Magento довольно легко выполнить массовую перегрузку в ОЗУ, просто установив слишком высокие ограничения PHP Max. При нормальных обстоятельствах это не будет иметь никаких побочных эффектов, но в тот момент, когда приложение попытается использовать эту память, оно почти сразу перейдет в режим подкачки (если у вас закончилась оперативная память).

Тогда вы, вероятно, обнаружите, что Apache не является основной проблемой для использования памяти, а скорее всего виноват MySQL.

Вы не упомянули спецификацию вашего сервера или какие-либо конкретные детали вашего магазина, поэтому дать точный совет невозможно. Но просто пересмотреть конфигурацию Apache и MySQL было бы легко. Отбросьте количество потоков Apache, подключений MySQL, выделенной памяти. Затем начните строить графики с помощью такого инструмента, как Munin, чтобы на самом деле иметь возможность соотносить трафик, потоки, использование ЦП и использование памяти. Без этого вы работаете вслепую.

Но я бы посоветовал прекратить ковыряться в netstat, поскольку вам еще далеко до необходимости диагностировать состояния TCP; вам нужно начать с самого начала.

Прочтите несколько хороших книг по настройке HTTP и управлению производительностью (правда - вы вряд ли получите здесь ответ).

что вызывает подкачку памяти

Тогда ваш сервер плохо настроен - веб-сервер должен никогда начать замену. Примените обычный ритуал настройки apache и уменьшите максимальный объем памяти php.

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

А? Спящий процесс по определению не способствует загрузке. Какой конец mhysql?

Используйте этот скрипт: http://saiweb.co.uk/linux/apache/bash%20script/linux-the-sysadmin-script-part-3/

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

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

#!/bin/bash
       if [ -z "$1" ]; then
                echo "Usage: sysadmin appmem app_name i.e. (sysadmin appmem apache)";
        else
                RRES=(`ps aux | grep "$1" | grep -v 'grep' | grep -v "$0" | awk '{print $6}'`);
                VRES=(`ps aux | grep "$1" | grep -v 'grep' | grep -v "$0" | awk '{print $5}'`);
                COUNT=0;
                VMEM=0;
                RMEM=0;
                for RSS in ${RRES[@]}
                do
                        RMEM=$(($RSS+$RMEM));
                done;
                for VIRT in ${VRES[@]}
                do
                        VMEM=$(($VIRT+$VMEM));
                        COUNT=$(($COUNT+1));
                done;
                VMEM=$(($VMEM/$COUNT));
                VMEM=$(($VMEM/1024));
                RMEM=$(($RMEM/1024));
                echo -e "$YELLOW ----- MEMORY USAGE REPORT FOR '$1' ----- $CLEAR";
                echo "PID Count: $COUNT";
                echo "Shared Mem usage: $VMEM MB";
                echo "Total Resident Set Size: $RMEM MB";
                echo "Mem/PID: $(($RMEM/$COUNT)) MB";
        fi