оптимізація швидкості роботи сайту [Colobridge WIKI]

  1. завдання:
  2. Рішення:
  3. полегшення системи
  4. Apache MPM
  5. Prefork MPM
  6. NGINX і Lighttpd
  7. LOGROTATE
  8. прискорювачі інтернету
  9. посилання:

Застосування: Linux

Слова для пошуку:

завдання:

При обмежених ресурсах отримати максимальну продуктивність (доступність) сайту і усунути причину виникнення помилки «Can not allocate memory»

Рішення:

Іноді неможливо зайти в консоль сервера, в системному журналі повідомлення

Can not 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 або Can not allocate memory

Іноді недолік пам'яті призводить до неможливості зайти в консоль сервера, немає вільної пам'яті для цього.

Виконайте команду vzubc і отримаєте висновок подібний цьому:

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

Якщо на вашому сервері немає скрипта vzubc можна використовувати команду:

cat / proc / user_beancounters

Цей спосіб менш зручний тому що інформація буде сумішшю уявлень з кількості сторінок пам'яті і байтів.

Є кілька варіантів вирішення цієї проблеми. У будь-якому випадку нам доведеться обмежити споживання пам'яті веб-сервера та іншими процесами.

полегшення системи

Почніть з відключення непотрібних сервісів.

Досить часто можна бачити бовтається без діла демон ftp. Він споживає трохи, але іноді його атакують і тоді він дуже охоче пожирає пам'ять. І вирішите навіщо він вам потрібен в активному стані, можна його включати в разі необхідності, можна використовувати sftp.

Вимкніть непотрібні модулі apache. Тільки переконайтеся, що вони вам не потрібні. По крайней мере, треба перевірити працездатність після зміни параметрів і перезапуску різноманітних служб.

Скрипти збору статистики типу Webalizer або AWstats - корисні інструменти, але так вони потрібні вам? Вони здатні дуже сильно гальмувати сервер якщо журнали великі.

Apache MPM

Вебсервер повинен одночасно обробляти велику кількість підключень і запитів, що створює окремі потоки команд і інші необхідні елементи.

У сервера Apache2 мультіпоточность реалізована за допомогою модулів багатопотокової обробки - MPM. Існує дві основні моделі MPM модулів - це worker MPM і prefork MPM.

Визначити який модуль використовує ваш сервер можна командою httpd -V або apache2 -V (в залежності від операційної системи).

Але можна обійтися і без цієї перевірки.

У переважній кількості випадків використовується prefork MPM

Worker MPM при запуску створює кілька дочірніх процесів, по кілька потоків в кожному (скільки саме мається на увазі під «кілька» задається в конфігураційному файлі Apache.

Як перевага даного модуля вказується знижене споживання пам'яті в порівнянні з Prefork модулем. Цей модуль рекомендується для високо навантажених веб серверів і практично ніколи не використовується на віртуальних серверах.

Prefork MPM при запуску створює деяку кількість дочірніх процесів, але на відміну від Worker кожен процес обробляє тільки одне з'єднання. Швидкість обох модулів порівнянна, 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

Їх можна використовувати двома способами:

  1. Взагалі виключити apache2

  2. Використовувати в якості проміжного http-proxy для доступу до apache.

Перший варіант використовується коли вам не потрібні особливі можливості специфічних можливостей модулів apache. Наприклад аналога mod_secure для цих серверів не існує. Приклад реалізації першого способу ви знайдете за посиланням внизу цієї статті.

Якщо без apache не обійтися, то використовується 2-й варіант. Запити клієнтів приймає NGINX і перенаправляє їх демона apache для обробки. Незважаючи на зайву службу цей варіант економить пам'ять, адже кількість підключень до apache обмежена одним NGINX, а NGINX не плід свої копії.

Слід зауважити, що не завжди 2-й спосіб дає очікуваний ефект, але спробувати варто.

LOGROTATE

На розмір процесу вебсервера може впливати розмір системного журналу. Іноді журнал виростає до декількох десятків гігабайт. Процес, намагаючись виконати запис про подію, відкриває цей файл, що може зажадати великих системних ресурсів.

Перевірте - як налаштований у вас демон logrotate, чи ефективно він обробляє ваші лог-файли і обробляє чи взагалі?

Чи потрібні вам журнали вебсервера? Може простіше відключити?

прискорювачі інтернету

Використовуйте пошукову службу для пошуку спеціалізованих послуг прискорення доступу до вашого сайту. Є досить організацій спеціалізуються на оптимізації вебсайтів і захисту їх від перевантаження.

використовуйте служби CDN (Мережі доставки (дистрибуції) контенту)

Наведу кілька прикладів

посилання:

Актуальність: 2011/11/03 9:39

Скрипти збору статистики типу Webalizer або AWstats - корисні інструменти, але так вони потрібні вам?
Перевірте - як налаштований у вас демон logrotate, чи ефективно він обробляє ваші лог-файли і обробляє чи взагалі?
Чи потрібні вам журнали вебсервера?
Може простіше відключити?