У нас есть приложение 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