Анализ нагрузки на сервер

Thank you for reading this post, don't forget to subscribe!

Ана­лиз нагруз­ки на сер­вер поз­во­лит быст­ро понять при­чи­ны мед­лен­ной рабо­ты. Это необ­хо­ди­мо делать еще и для того, что­бы вовре­мя пла­ни­ро­вать покуп­ку новых серверов.

Аппа­рат­ная часть любо­го сер­ве­ра состо­ит из 4 основ­ных компонент:

  • Про­цес­сор
  • Память
  • Диск
  • Сете­вой интерфейс

Ана­лиз загру­жен­но­сти сер­ве­ра заклю­ча­ет­ся в сбо­ре и обра­бот­ке ста­ти­сти­ки каж­дой из этих компонент.

Процессор

Пер­вым делом сле­ду­ет про­ве­рить про­цес­сор. Самый быст­рый спо­соб — исполь­зо­вать top:

Необ­хо­ди­мо обра­тить вни­ма­ние на выде­лен­ные участ­ки. Загруз­ка про­цес­со­ра обыч­но не долж­на пре­вы­шать 10…20%. Исклю­че­ние состав­ля­ют сер­ве­ра спе­ци­аль­но­го назна­че­ния (напри­мер, пере­жи­ма­то­ры фоток или медиа дан­ных). Сле­ду­ю­щие пока­за­те­ли наи­бо­лее важ­ные для анализа:

  • Пока­за­тель us — поль­зо­ва­тель­ские про­цес­сы. Высо­кий пока­за­тель озна­ча­ет, что наше при­ло­же­ние нагру­жа­ет сервер.
  • Пока­за­тель id — неис­поль­зу­е­мые ресур­сы про­цес­со­ра. Этот пока­за­тель дол­жен быть высо­ким (нор­маль­ные зна­че­ния от 80 до 100).
  • Пока­за­тель wa — ожи­да­ние опе­ра­ций ввода/вывода. Высо­кий пока­за­тель озна­ча­ет, что про­цес­сор очень дол­го ждет отве­ты от устройств ввода/вывода. Чаще все­го это свя­за­но с боль­шим коли­че­ством опе­ра­ций на диске.

mpstat

Более раз­вер­ну­тую ста­ти­сти­ку мож­но полу­чить исполь­зуя ути­ли­ту mpstat из паке­та sysstat:

Пока­жет дета­ли по всем про­цес­со­рам на сервере:

htop

Инстру­мент htop уме­ет пока­зы­вать нагруз­ку на про­цес­сор в удоб­ном виде:

Анализ нагрузки на процессор

Если пока­за­тель загруз­ки про­цес­со­ра (us в top'e) пре­вы­ша­ет 20%, необ­хо­ди­мо оце­нить воз­мож­ность опти­ми­за­ции при­ло­же­ния. Если воз­мож­ная опти­ми­за­ция уже была выпол­не­на, необ­хо­ди­мо при­об­ре­тать допол­ни­тель­ные сервера.

В слу­чае высо­ко­го пока­за­те­ля ожи­да­ния I/O (wa в top'e), необ­хо­ди­мо про­ве­сти даль­ней­ший ана­лиз дис­ко­вой и сете­вой под­си­сте­мы (ниже).

Память

Преж­де все­го необ­хо­ди­мо опре­де­лить коли­че­ство заня­той и сво­бод­ной памяти:

Пока­жет дан­ные об исполь­зо­ва­нии памяти:

# Резуль­тат коман­ды free

Важ­но обра­тить вни­ма­ние на зна­че­ние free. Это коли­че­ство сво­бод­ной памя­ти. Очень важ­ным пока­за­те­лем явля­ет­ся Swap. Это исполь­зу­е­мое место на дис­ке в том слу­чае, когда опе­ра­тив­ной памя­ти пере­ста­ет хватать.

Более подроб­ную инфор­ма­цию об исполь­зо­ва­нии опе­ра­тив­ной памя­ти мож­но полу­чить так:

Сре­ди про­че­го уви­дим такие сведения:

Анализ использования памяти

Малое коли­че­ство сво­бод­ной опе­ра­тив­ной памя­ти не явля­ет­ся про­бле­мой. Но такая ситу­а­ция явля­ет­ся пред­ло­гом для при­сталь­но­го наблю­де­ния за сервером.

В слу­чае же, если начи­на­ет рас­ти Swap, необ­хо­ди­мо сроч­но при­ни­мать меры:

  • Добав­лять опе­ра­тив­ную память.
  • При­об­ре­тать новые сер­ве­ра и рас­пре­де­лять нагруз­ку меж­ду ними.

Ста­рай­тесь все­гда удер­жи­вать исполь­зу­е­мый своп нулевым.

Диски

Дис­ко­вая под­си­сте­ма может быть нагру­же­на, когда при­ло­же­ние рабо­та­ет с фай­ла­ми. Кро­ме это­го, дис­ки может нагру­жать рабо­та с базой данных.

Начать ана­лиз дис­ков сле­ду­ет с про­вер­ки сво­бод­но­го места:

Пока­жет резуль­тат по всем разделам:

Колон­ка Use пока­жет заня­тое место. Для основ­ных раз­де­лов ста­рай­тесь удер­жи­вать зна­че­ние не выше 90%.

iotop

Инстру­мент iotop уме­ет пока­зы­вать раз­вер­ну­тую загруз­ку диска.

Так­же будет вид­но рас­пре­де­ле­ние по про­цес­сам, кото­рые рабо­та­ют с диском:

В при­ме­ре два про­цес­са — mysqld и php-fpm (это php при­ло­же­ние) — исполь­зу­ют опе­ра­ции запи­си на диск. Необ­хо­ди­мо обра­тить вни­ма­ние на показатели:

  • Actual DISK READ — сум­мар­ное фак­ти­че­ское коли­че­ство дан­ных, чита­е­мых с дис­ка. Отли­ча­ет­ся от Total DISK READ из-за дис­ко­во­го кэша и опти­ми­за­ции опе­ра­ций низ­ко­го уровня.
  • Actual DISK WRITE — сум­мар­ное фак­ти­че­ское коли­че­ство дан­ных, запи­сы­ва­е­мое на диск. Может отли­чать­ся от Total DISK WRITE по той же причине.

Анализ

Чтение

Если диск под­вер­жен боль­шо­му коли­че­ству чте­ний, пра­виль­ны­ми вари­ан­та­ми пове­де­ния будут:

  • В слу­чае, если боль­шин­ство чте­ний про­ис­хо­дит из при­ло­же­ния, необ­хо­ди­мо вклю­чить кэши­ро­ва­ние APC. Если Ваше при­ло­же­ние чита­ет боль­шое коли­че­ство фай­лов, про­ду­май­те воз­мож­ность пере­но­са их дан­ных в кэш.
  • В слу­чае базы дан­ных убе­ди­тесь в пра­виль­ной настрой­ке ее параметров.
  • Если чте­ния про­ис­хо­дят в резуль­та­те обра­ще­ния к Web сер­ве­ру (отда­ча боль­шо­го коли­че­ства фай­лов), обду­май­те воз­мож­ность исполь­зо­ва­ния HTTP кэша.

Запись

Боль­шое коли­че­ство запи­сей на диск обыч­но сви­де­тель­ству­ют о необ­хо­ди­мо­сти масштабироваться.

  • Убе­ди­тесь, что у Вас отклю­че­ны все логи досту­па и отлад­ки. Напри­мер, access_log в Nginx'e.
  • Боль­шин­ство запи­сей на диск ско­рее все­го будет гене­ри­ро­вать база дан­ных. В таком слу­чае необ­хо­ди­мо поду­мать о выно­се ее на отдель­ный сер­вер. Даль­ней­ши­ми шага­ми будет ее мас­шта­би­ро­ва­ние на несколь­ко серверов.
  • Боль­шое коли­че­ство запи­сей так­же могут гене­ри­ро­вать загру­жа­е­мые фай­лы. Читай­те о мас­шта­би­ро­ва­ние в таких слу­ча­ях на при­ме­ре хра­ни­ли­ща изображений.

Сеть

Ути­ли­та cbm поз­во­ля­ет уви­деть сете­вой тра­фик в реаль­ном времени:

Уви­дим дан­ные об объ­е­ме при­е­ма и пере­да­чи в секунду:

Высо­кий сете­вой тра­фик сам по себе не явля­ет­ся про­бле­мой. Но близ­кие к пико­вым пока­за­те­ли ука­зы­ва­ют на необ­хо­ди­мость мас­шта­би­ро­вать­ся в бли­жай­шем буду­щем. Напри­мер, сред­ний тра­фик в 95 Мбит на интер­фей­се в 100 Мбит ско­рее все­го будет озна­чать, что теку­ще­го сер­ве­ра вско­ре будет недостаточно.

Общая статистика

Удоб­ная ути­ли­та dstat пока­жет общую ста­ти­сти­ку сер­ве­ра в реаль­ном времени:

Уви­дим дан­ные о систе­ме с интер­ва­лом в одну секунду:

Вни­ма­ние сле­ду­ет обра­тить на:

  • total-cpu-usage — загруз­ка процессора
  • dsk/total — загруз­ка диска
  • net/total — загруз­ка сети