Показатели производительности сервера (1) — анализ нагрузки (LOAD) и проблема

Java задняя часть сервер Linux

В обычной работе при измерении производительности сервера часто задействовано несколько показателей, таких как load, cpu, mem, qps, rt и т.д. Каждый индикатор имеет свое уникальное значение, во многих случаях, когда проблема возникает в сети, она часто сопровождается отклонением от нормы некоторых индикаторов. В большинстве случаев некоторые индикаторы показывают аномалии заранее, до возникновения проблемы.

Понимание и просмотр этих индикаторов, разрешение исключений и т. д. являются важными и необходимыми навыками для программистов. В этой статье я в основном представлю более важный показатель — загрузку машины (Load), который в основном включает в себя определение нагрузки, способ просмотра нагрузки и способ проверки парения нагрузки.

что такое нагрузка

Загрузка — важный показатель Linux-машины, интуитивно отражающий текущее состояние машины.

Давайте посмотрим, как определяется нагрузка:

В вычислениях UNIX нагрузка на систему — это мера объема вычислительной работы, которую выполняет компьютерная система. в течение последних одно-, пяти- и пятнадцатиминутных периодов (википедия).

Кратко объясним: в системах UNIX загрузка системы — это мера текущей нагрузки ЦП, определяемая как среднее количество потоков в очереди выполнения в течение определенного интервала времени. Средняя нагрузка представляет собой среднюю загрузку машины за определенный период времени. Чем ниже значение, тем лучше. Чрезмерная нагрузка приведет к тому, что машина не сможет обрабатывать другие запросы и операции и даже приведет к сбою.

Высокая нагрузка Linux в основном связана с тремя факторами: использованием ЦП, использованием памяти и потреблением операций ввода-вывода. Чрезмерное использование любого из них приведет к резкому увеличению нагрузки на сервер.

Проверьте загрузку машины.

На машине с Linux есть несколько команд для просмотра информации о загрузке машины. который включаетuptime,top,wЖдать.

uptimeЗаказ

uptimeКоманда выводит общее время работы системы и среднюю загрузку системы. Информация, отображаемая командой uptime, отображается по порядку: текущее время, продолжительность работы системы, количество пользователей, которые в настоящее время вошли в систему, и средняя загрузка системы за последние 1 минуту, 5 минут и 15 минут. минут.

➜  ~ uptime
13:29  up 23:41, 3 users, load averages: 1.74 1.87 1.97

Вторая половина этой строки информации показывает "среднюю загрузку", что означает "средняя загрузка системы", в ней три числа, по которым мы можем судить, большая или маленькая загрузка системы.

1.74 1.87 1.97Три числа означают среднюю загрузку системы за 1 минуту, 5 минут и 15 минут соответственно. Обычно мы выражаем это как load1, load5, load15.

wЗаказ

Основная функция команды w — отображать информацию о пользователе, вошедшем в систему в данный момент. Однако, в отличие от who, команда w более мощная, и команда w также может отображать: текущее время, время с момента запуска системы, количество вошедших в систему пользователей, максимальноеСредняя нагрузка за последние 1 минуту, 5 минут и 15 минут. Тогда существуют различные данные каждого пользователя. Предметы отображаются в следующем порядке: учетная запись входа, имя терминала, имя удаленного хоста, время входа, время простоя, JCPU, PCPU, командная строка текущего режима работы.

➜  ~ w
14:08  up 23:41, 3 users, load averages: 1.74 1.87 1.97
USER     TTY      FROM              LOGIN@  IDLE WHAT
hollis   console  -                六14   23:40 -
hollis   s000     -                六14   20:24 -zsh
hollis   s001     -                六15       - w

сверхуwКак видно из результата выполнения команды, текущее системное время 14:08, с момента запуска системы прошло 23 часа 41 минута, всего залогинились 3 пользователя. Средняя загрузка системы за последние 1 минуту, 5 минут и 15 минут составляет1.74 1.87 1.97. с участиемuptimeПолучил тот же результат. Далее также печатаются различные данные некоторых вошедших в систему пользователей, которые подробно описываться не будут.

topЗаказ

Команда top — это широко используемый инструмент анализа производительности в Linux, который может отображать состояние занятости ресурсов каждого процесса в системе в режиме реального времени, подобно диспетчеру задач Windows.

➜  ~ top
Processes: 244 total, 3 running, 9 stuck, 232 sleeping, 1484 threads                                                                                                                               14:16:01
Load Avg: 1.74, 1.87, 1.97  CPU usage: 8.0% user, 6.79% sys, 85.19% idle   SharedLibs: 116M resident, 16M data, 14M linkedit. MemRegions: 66523 total, 2152M resident, 50M private, 930M shared.
PhysMem: 7819M used (1692M wired), 370M unused. VM: 682G vsize, 533M framework vsize, 6402060(0) swapins, 7234356(0) swapouts. Networks: packets: 383006/251M in, 334448/60M out.
Disks: 1057821/38G read, 350852/40G written.

PID    COMMAND      %CPU TIME     #TH   #WQ  #PORT MEM    PURG   CMPRS  PGRP  PPID  STATE    BOOSTS          %CPU_ME %CPU_OTHRS UID  FAULTS    COW    MSGSENT   MSGRECV   SYSBSD    SYSMACH   CSW
30845  top          3.0  00:00.49 1/1   0    21    3632K  0B     0B     30845 1394  running  *0[1]           0.00000 0.00000    0    3283+     112    203556+   101770+   8212+     119901+   823+
30842  Google Chrom 0.0  00:47.39 17    0    155   130M   0B     0B     1146  1146  sleeping *0[1]           0.00000 0.00000    501  173746    2697   117678    37821     364228    444830    310043

В приведенном выше выводе Load Avg: 1,74, 1,87, 1,97 показывает информацию о нагрузке.

Диапазон нормальной нагрузки машины

Вопрос о том, насколько нормальна Нагрузка машины, всегда был спорным, и у разных людей разное понимание. Для одного процессора некоторые считают, что если нагрузка превышает 0,7, это выходит за рамки нормального диапазона. Некоторые думают, что пока он не превышает 1, проблем нет. Также считается, что загрузка одного процессора допустима ниже 2.

Причина, по которой существует так много разных представлений, заключается в том, что на разные машины влияют и другие факторы, помимо ЦП, и запущенные программы, машинная память и даже температура компьютерного зала могут быть разными.

Например, некоторые машины используются для периодического выполнения большого количества пакетных задач, и в этот период нагрузка может взлететь относительно высоко. В другое время может быть меньше. Итак, в этот период взлета, должны ли мы пойти исследовать проблему?

Мое предложение состоит в том, что лучше всего установить базовый уровень показателей (например, среднее значение за последний месяц) в соответствии с реальной ситуацией на вашей собственной машине, при условии, что ежедневная нагрузка не слишком велика в пределах диапазона базового уровня. , это может быть принято.Если зазор слишком большой, это может быть приемлемо.Требуется вмешательство человека.

Тем не менее, всегда есть предлагаемый порог, около этого значения. Ruan Yifeng имеет следующие предложения в своем блоге:

Когда загрузка системы продолжает оставаться выше 0,7, вы должны начать расследование, в чем проблема, и предотвратить ухудшение ситуации.

Когда загрузка системы продолжает оставаться выше 1,0, вы должны начать поиск решения для снижения этого значения.

Когда загрузка системы достигает 5,0, это означает, что у вашей системы серьезные проблемы, она долгое время не отвечает или близка к сбою. Вы не должны позволять системе достигать этого значения.

Приведенные выше показатели основаны на одном процессоре, но многие компьютеры сейчас многоядерные. Таким образом, для общей системы на основе количества процессоров определяется, была ли система перегружена (перегрузка). Если мы считаем 0,7 безопасной линией для одноядерных машинных нагрузок, то нагрузку на четырехъядерные машины лучше держать ниже 3 (4*0,7 = 2,8).

Еще один момент, о котором следует упомянуть, это то, что в индикаторе Load Avg есть три значения: 1-минутная загрузка системы, 5-минутная загрузка системы и 15-минутная загрузка системы. Мы также можем ссылаться на эти три значения при устранении неполадок.

Как правило, 1-минутная загрузка системы представляет собой самое последнее временное явление. 15-минутная загрузка системы указывает на постоянное явление, а не на временную проблему. Если load15 высокий, а load1 низкий, можно считать, что дела идут лучше. Наоборот, ситуация может ухудшиться.

Как уменьшить нагрузку

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

Если это аппаратная проблема, это означает, что производительность машины действительно плохая, тогда решение очень простое, просто замените машину напрямую.

Как мы упоминали ранее, использование ЦП, использование памяти и потребление операций ввода-вывода могут привести к высокой нагрузке. Если это программная проблема, она может быть вызвана тем, что некоторые потоки в Java заняты в течение длительного времени, постоянно занят большой объем памяти и т. д. Рекомендуется устранять проблемы с кодом в следующих аспектах:

1. Есть ли утечка памяти, которая вызывает частый GC 2. Есть ли взаимоблокировка 3. Есть ли чтение или запись большого поля 4. Вызвана ли она операциями с базой данных, проверьте проблему с оператором SQL.

Вот еще одно предложение: если вы обнаружите, что нагрузка на онлайн-машину резко возрастает, вы можете сначала рассмотреть возможность сброса памяти стека, перезапустить ее, временно решить проблему, а затем рассмотреть возможность отката и устранения проблемы.

Идеи по устранению неполадок с растущей нагрузкой на веб-приложения Java

1. Используйте время безотказной работы, чтобы просмотреть текущую нагрузку и обнаружить, что нагрузка стремительно растет.

➜  ~ uptime
13:29  up 23:41, 3 users, load averages: 10 10 10

2. Используйте команду top для просмотра идентификатора процесса с высокой загрузкой ЦП.

➜  ~ top

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1893 admin     20   0 7127m 2.6g  38m S 181.7 32.6  10:20.26 java

Выяснено, что процесс с PID 1893 занимает 181% процессорного времени. И это процесс Java, который в основном представляет собой программную проблему.

3. Используйтеtopкоманда, чтобы увидеть, какой поток имеет более высокую степень занятости

➜  ~ top -Hp 1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4519 admin     20   0 7127m 2.6g  38m R 18.6 32.6   0:40.11 java

4. ИспользуйтеprintfКоманда для просмотра шестнадцатеричного числа этого потока

➜  ~ printf %x 4519
11a7

5. ИспользуйтеjstackКоманда, чтобы увидеть, какой метод выполняется текущим потоком. (Серия по изучению команд Java (2) — Jstack)

➜  ~ jstack 1893 |grep -A 200 11a7
"thread-5" #500 daemon prio=10 os_prio=0 tid=0x00007f632314a800 nid=0x11a2 runnable [0x000000005442a000]
java.lang.Thread.State: RUNNABLE
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684)
at sun.misc.URLClassPath.findResource(URLClassPath.java:188)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at org.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248)
at com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30)

Из журнала стека потока выше можно обнаружить, что поток, в настоящее время занимающий высокую загрузку ЦП, выполняет класс com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30) моего кода. Затем вы можете проверить, есть ли проблема с использованием этого класса.

6. Вы также можете использовать jstat(Серия по изучению команд Java (4) — jstat), чтобы проверить ситуацию с GC, чтобы увидеть, есть ли частые FGC, а затем использовать jmap(Серия по обучению командам Java (3) - Jmap) для дампа памяти, чтобы увидеть, есть ли утечка памяти.