Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

сети:оптимизация_скорости_работы_сайта [2019/03/12 10:03]
сети:оптимизация_скорости_работы_сайта [2022/04/01 15:08] (текущий)
Строка 1: Строка 1:
 +====== оптимизация скорости работы сайта ======
 +Применимость: Linux
 +
 +Слова для поиска: 
 +
 +
 +===== Задача: =====
 +
 +При ограниченных ресурсах получить максимальную производительность (доступность) сайта и устранить причину возникновения ошибки **"Cannot allocate memory"**
 +
 +
 +
 +
 +===== Решение: =====
 +
 +Иногда невозможно зайти в консоль сервера, в системном журнале сообщения 
 +  Cannot allocate memory: fork: Unable to fork new process
 +
 +Проверьте последнюю колонку в выводе команды:
 +  cat /proc/user_beancounters
 +Если значение не равно "0", то значит лимит превышен. Скорее всего это будет строка "privvmpages"
 +
 +Если у вас физический сервер или используется виртуализация KVM (XEN), то при нехватке памяти процессы начинают вытесняться в медленную swap-память, это тормозит работу процессов, запросы клиентов становятся в очередь, и так нагрузка снижается сама собой.
 +Наличие swap-памяти снижает необходимость оптимизации сервера, хотя и не избавляет от этого.
 +Но это не работает на виртуализации OpenVZ с ядром 2.6.18-*
 +Более свежее ядро 2.6.32 поддерживает псевдо swap (vswap), но еще недостаточно стабильно. Мы пытались его использовать, но количество сбоев в работе было слишком большим и мы вернулись к использованию  стабильной версии 2.6.18.
 +
 +На OpenVZ  swap-память так же  используется при нехватке памяти, но это работает на уровне мастер-машины (Hardware Node) при нехватке места для контейнеров.
 +
 + Интенсивное использование swap-памяти для мастер-машины  OpenVZ является аварийным режимом который никогда не должен допускаться. При этом работа контейнеров замедляется настолько, что их невозможно использовать.  
 +
 +Проблема обнаруживается по сообщениям в системном журнале со словами **Out of memory**  или **Cannot allocate memory**
 +
 +Иногда недостаток памяти приводит к невозможности зайти в консоль сервера, нет свободной памяти для этого.
 +
 +Выполните команду **vzubc** и получите вывод подобный этому:
 +
 +<code|vzubc >
 +BEANS FOR UID 309
 +resource                     held              maxheld              barrier                limit              failcnt
 +kmemsize                 11.60 mb            311.37 mb           1200.00 mb           1320.00 mb                    0
 +lockedpages              38.01 mb             40.08 mb             49.15 mb             49.15 mb                    0
 +privvmpages             573.53 mb           3395.43 mb           3072.00 mb           3379.20 mb               463849 
 +</code>
 +
 +
 +Если на вашем сервере нет скрипта vzubc можно использовать команду:
 +
 +  cat /proc/user_beancounters
 +
 +Этот способ менее удобен потому что информация будет смесью представлений из количества страниц памяти и байтов. 
 +
 +Есть несколько вариантов решения этой проблемы. В любом случае нам придется ограничить потребление памяти вебсервером и другими процессами.
 +
 +==== Облегчение системы ====
 +
 +Начните с отключения ненужных сервисов. 
 +
 +Довольно часто можно видеть болтающийся без дела демон ftp.  Он потребляет немного, но иногда его атакуют и тогда он очень охотно пожирает память. И решите зачем он вам нужен в активном состоянии, можно его включать в случае необходимости, можно использовать sftp. 
 +
 +Отключите ненужные модули apache. Только убедитесь, что они вам не нужны. По крайней мере, надо проверить работоспособность после изменения параметров и перезапуска сервиса.
 +
 +Скрипты сбора статистики типа Webalizer или  AWstats - полезные инструменты, но так ли они нужны вам? Они способны очень сильно тормозить сервер если журналы большие.
 +
 +===== Apache MPM =====
 +
 +Вебсервер должен одновременно обрабатывать большое количество подключений и запросов, что создает отдельные потоки команд и прочие необходимые элементы.
 +
 +У сервера Apache2 мультипоточность реализована посредством подключаемых модулей многопоточной обработки - MPM. Существует две основных модели MPM модулей - это **worker MPM** и **prefork MPM**.
 +
 +Определить какой модуль использует ваш сервер можно командой  httpd -V или apache2 -V (в зависимости от операционной системы).
 +
 +{{:сети:selection_046.png|}}
 +
 +Но можно обойтись и без этой проверки.  
 +
 +В подавляющем количестве случаев используется  **prefork MPM**
 +
 +**Worker MPM**  при запуске создает несколько дочерних процессов, по несколько потоков в каждом (сколько именно подразумевается под "несколько" задается в конфигурационном  файле Apache. 
 +
 +В качестве преимущества данного модуля указывается пониженное потребление памяти по сравнению с Prefork модулем. Этот модуль рекомендуется для высоко нагруженных веб серверов и практически никогда не используется на виртуальных серверах.
 +
 +**Prefork MPM** при запуске  создает некоторое количество дочерних процессов, но в отличие от Worker  каждый процесс обрабатывает только одно соединение. Cкорость обоих модулей  соизмерима, Prefork потребляет больше памяти, но более стабилен, менее критичен к ошибкам вебприложений, не склонен к утечкам памяти. 
 +
 +**Prefork MPM**  рекомендуется использовать там, где отладка мультипоточных приложений не реализована на должном уровне. Отладка  мультипоточных  приложений очень сложная и дорогая задача.
 +
 +==== Prefork MPM ====
 +
 +
 +Решить задачу  можно путем настройки лимитов  вебсервера на количество соединений.  Это ограничит количество запуcкаемых копий процессов (форков / fork).
 +
 +
 +Например ваша конфигурация (/etc/httpd/conf/httpd.conf) позволяет открытие до 1024 соединений одновременно.
 +
 +  <IfModule prefork.c>  
 +  StartServers      8      
 +  MinSpareServers    5
 +  MaxSpareServers   20 
 +  ServerLimit      1024
 +  MaxClients       1024
 +  MaxRequestsPerChild  4000
 +  </IfModule>  
 +
 +
 +Каждое соединение требует отдельного процесса вебсервера.
 +Каждый процесс httpd обычно требует 20-50Мб, а у вас всего 3072Мб и свободных 2700Гб
 +Потому я поставил лимит 100.
 +
 +Это не значит, что ваш сервер сможет обслуживать меньше клиентов.
 +При недостатке памяти клиент получает обрыв связи и недоступность сервера, а при срабатывании MaxClients клиент просто ждет пару секунд когда появится свободный процесс httpd. 
 +
 +При таком варианте вы не теряете клиентов. 
 +
 +На самом деле это значение надо тщательно подбирать опытным путем наблюдая за счетчиком превышений и количеством свободной памяти.
 +
 +
 +
 +Мой вариант конфигурации:
 +  <IfModule prefork.c> 
 +  StartServers      8
 +  MinSpareServers    5
 +  MaxSpareServers   20
 +  ServerLimit      100
 +  MaxClients       100
 +  MaxRequestsPerChild  2000
 +  </IfModule>
 +
 +Я  уменьшил значение MaxRequestsPerChild, это предотвратит рост размера процесса в памяти.
 +Этот параметр определяет после какого количества запросов процесс будет перезапущен, что делается для исключения утечек памяти.
 +
 +Но слишком частый перезапуск тоже требует ресурсов. 
 +
 +Здесь надо искать компромисс методом подбора. 
 +
 +И придется понаблюдать за результатом после каждого изменения.
 +
 +Можете использовать нагрузочные тесты типа apache benchmark, но они неспособны имитировать реальную работу вашего сайта.
 +
 +
 +==== NGINX и Lighttpd ====
 + 
 +
 +Радикальным методом борьбы с потреблением памяти является использование облегченных серверов NGINX или Lighttpd
 +
 +  * http://ru.wikipedia.org/wiki/Nginx
 +  * http://ru.wikipedia.org/wiki/Lighttpd
 +
 +Их можно использовать двумя способами:
 +
 +  - Вообще исключить apache2 
 +  - Использовать в качестве промежуточного http-proxy для доступа к apache.
 +
 +Первый вариант используется когда вам не нужны особые возможности специфических возможностей  модулей apache. Например аналога mod_secure для этих серверов не существует.
 +Пример реализации первого способа вы найдете по ссылке внизу этой статьи.
 +
 +Если без apache не обойтись, то используется 2-й вариант. Запросы клиентов принимает NGINX и перенаправляет их демону apache для обработки. Несмотря на лишнюю службу этот вариант экономит память, ведь количество подключений к apache ограничено одним NGINX, а NGINX не плодит свои копии.
 +
 +Следует заметить, что не всегда 2-й способ дает ожидаемый эффект, но попытаться стоит.
 +
 +===== LOGROTATE =====
 +
 +На размер процесса вебсервера может влиять размер системного журнала. Иногда журнал вырастает до нескольких десятков гигабайт. Процесс, пытаясь выполнить запись о событии , открывает этот файл, что может потребовать больших системных ресурсов.
 +
 +Проверьте  - как настроен у вас демон logrotate, эффективно ли он обрабатывает ваши файлы логов и обрабатывает ли вообще?
 +
 +
 +Нужны ли вам журналы вебсервера? Может проще отключить?
 +
 +
 +<!-- 
 +
 +<code | maxclients.sh>
 +#!/bin/sh
 +CC=$(ps -o rss -C httpd | grep -v RSS| sort -d | tail -1);
 +service httpd stop
 +MM=$(free | grep Mem | awk '{print $4}');
 +let CL="($MM / $CC) -10 ";
 +echo "ServerLimit  $CL"
 +echo "MaxClients  $CL"
 +service httpd start
 +</code>
 +
 + -->
 +===== Ускорители интернета =====
 +Используйте поисковую службу для поиска специализированных услуг ускорения доступа к вашему сайту.
 +Есть достаточно организаций специализирующихся на оптимизации вебсайтов и защите их от перегрузки.
 +
 +Используйте [[http://ru.wikipedia.org/wiki/Content_Delivery_Network|службы CDN]] (сети доставки(дистрибуции) контента)
 +
 +
 +Приведу несколько примеров
 +  * [[https://ru.cloudflare.com/overview.html|CDN Сloudflare - Защита сайта и его кеширование на уровне DNS]]
 +  * [[http://www.ngenix.net/|NGENIX  - российский оператор CDN ]]
 +  * [[http://webo.in/|Компексные услуги Webo Labs]]
 +  * [[https://www.google.by/search?q=cloudflare&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru-RU:official&client=firefox#sclient=psy-ab&hl=ru&lr=lang_ru&client=firefox&hs=HxK&rls=org.mozilla:ru-RU%3Aofficial&tbs=lr:lang_1ru&q=cdn+service+providers&oq=cdn+service&aq=1&aqi=g2g-K2&aql=&gs_l=serp.3.1.0l2j0i30l2.0.0.1.177.0.0.0.0.0.0.0.0..0.0...0.0.l5WNb2uB3pc&pbx=1&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=ded6089da07dda21&biw=1110&bih=627|Прочее из google.com]]
 +
 +
 +===== Ссылки: =====
 +  * [[http://club.shelek.ru/viewart.php?id=300|Сравнительный тест систем кэширования пользовательских данных для PHP]]
 +  * [[http://ajc.su/unix/linux-unix/ustanovka-nginx-php-5-3-10-i-php-fpm-na-centos-5-7-6-2-ili-izbavlyaemsya-ot-apache/|Установка NGINX, PHP 5.3.10 и PHP-FPM на CentOS 5.7 — 6.2 или избавляемся от Apache]]
 +  * [[http://www.lissyara.su/articles/freebsd/www/nginx+php-fpm+mysql/|Веб сервер на много коннектов и высокую нагрузку (nginx+php-fpm+mysql)]]
 +  * [[http://wiki.firstvds.ru/index.php/%D0%92%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_web-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80]]
 +  * [[http://debianworld.ru/articles/rotaciya-logov-s-pomoshyu-logrotate-v-debian-ubuntu/|Ротация логов с помощью logrotate в Debian / Ubuntu ]]
 +  * [[http://httpd.apache.org/docs/2.0/misc/perf-tuning.html | Apache Performance Tuning]]
 +  * [[http://rus-linux.net/lib.php?name=/MyLDP/admin/monitoring/tools.html | 20 средств мониторинга системы Linux, о которых должен знать каждый системный администратор]]
 +  * [[http://www.regatta.cmc.msu.ru/doc/usr/share/man/info/ru_RU/a_doc_lib/aixbman/prftungd/prftungd02.htm | Руководство по настройке производительности IBM AIX]]
 +  * [[http://www.ibm.com/developerworks/ru/edu/l-lpic3306/section2.html | Измерение степени загрузки ресурсов]]
 +  * [[http://sites.google.com/site/kirillrst/home/linuxlog | Linux-шпаргалка]]
 +  * [[http://internal.support.by/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=216 | Онлайновые инструменты]]
 +  * [[http://speedupyourwebsite.ru/books/speed-up-your-website/online/|Книга «Разгони свой сайт»]]
 +  * [[http://myforce.ru/tyeoriya-i-praktika/vysokaya-nagruzka-na-server/| Высокая нагрузка на сервер]]
 +  * [[http://myforce.ru/tyeoriya-i-praktika/optimizaciya-mysql-innodb-na-vysokix-nagruzkax/| Оптимизация MySQL InnoDB на высоких нагрузках]]
 +  * [[http://myforce.ru/tyeoriya-i-praktika/kak-vyzhat-iz-servera-maksimum/|Как выжать из сервера максимум]]
 +  * [[http://myforce.ru/opyt/million-posetitelej-na-wordpress-protiv-servera/|Миллион посетителей на WordPress против сервера]]
 +  * [[http://myforce.ru/tyeoriya-i-praktika/optimiziruem-zagruzku-php-koda-v-22-raza/|Оптимизируем загрузку PHP-кода в 22 раза]]
 +
 +---- 
 +Актуальность: 2011/11/03 09:39 
 +
 +{{tag> web оптимизация}}