Linux load average расшифровка

Как считается Load Average

Постановка вопроса

Недавно, во время собеседования в одну крупную компанию мне задали простой вопрос, что такое Load Average. Не знаю, на сколько правильно я ответил, но лично для себя пришло осознание, что точного ответа я на самом деле и не знаю.

Большинство людей наверняка знают, что Load Average — это среднее значение загрузки системы за некоторый период времени (1, 5 и 15 минут). Так же можно узнать некоторые подробности из данной статьи, про то, как этим пользоваться. В большинстве случаев этих знаний достаточно для того, что бы по значению LA оценивать загрузку системы, но я по специальности физик, и когда я вижу «среднее за промежуток времени» мне сразу становится интересна частота дискретизации на данном промежутке. А когда я вижу термин «ожидающие ресурсов», становится интересно, каких именно и сколько времени надо ждать, а так же сколько тривиальных процессов надо запустить, что бы получить за короткий промежуток времени высокий LA. И главное, почему ответы на эти вопросы не дает 5 минут работы с гуглом? Если вам данные тонкости так же интересны, добро пожаловать под кат.

Что-то здесь не так.

Для начала определимся с тем, что мы знаем. В общем виде Load Average это среднее количество ожидающих ресурсов ЦПУ процессов за один из трех промежутков времени. Так же нам известно, что это значение в нормальном состоянии находится в диапазоне от 0 до 1, и единица соответствует 100% загрузке одноядерной системы без перегруза. В дальнейшем я буду рассматривать систему как одноядерную, поскольку это проще и показательней.

Что здесь не так?

Во первых, все мы знаем, что среднее арифметическое нескольких величин равно сумме этих величин, деленной на их количество. Из той информации, что у нас есть абсолютно непонятно это самое количество. Если мы считаем ожидающие процессы в течении всей минуты, то среднее значение будет равно количеству процессов за минуту, деленному на единицу. Если будем считать каждую секунду — то и количество процессов в каждом подсчете уменьшится с диапазоном, и делить будем на 60. Таким образом чем выше частота дискретизации при наборе данных, тем меньшее среднее значение мы получим.

Во вторых что значит «ожидающий ресурсов процесс»? Если мы запустим большое количество быстрых процессов разом, то все они встанут в очередь, и по логике на короткий промежуток времени LA должен вырасти до совершенно неприемлемых величин, и при продолжительном мониторинге должны наблюдаться постоянные скачки, чего, в нормальной ситуации, нет.

В третьих, одноядерная система при 100% загрузке должна давать Load Average равный 1. Но здесь нет никакой зависимости от параметров этого ядра, хотя количество процессов может отличаться в разы. Данный вопрос может быть снят либо корректным определением «ожидающего ресурсов процесса», либо наличием какой-то нормировки на параметры ядра.

Литература

Найти ответы на поставленные вопросы оказалось не так уж и сложно. Правда только на английском языке, и не все так сходу стало понятно. Конкретно были найдены две статьи:
«Examining Load Average»
«UNIX Load Average»
Пользователь Rondo так же предложил вторую часть статьи с более подробным рассмотрением математического аппарата: «UNIX Load Average. Part 2»
А так же небольшой тест для тех, кто и так все понимает, указанный во второй статье.

Интересующимся я бы советовал прочитать обе статьи, хотя в них описаны очень близкие вещи. В первой описывается в общем виде много разных интересных подробностей работы системы, а во второй более подробно разбирается непосредственно расчет LA, приводятся примеры с нагрузкой и комментарии специалистов.

Немного ядерной магии

Из данных материалов можно узнать, что каждому вызываемому процессу дается ограниченный промежуток времени на использование CPU, в стандартной архитектуре intel этот промежуток равен 10мс. Это целая сотая доля секунды и в большинстве случаев процессу столько времени не нужно. Однако, если какой-то процесс использовал все отведенное ему время, то вызывается аппаратное прерывание и система возвращает себе управление процессором. Помимо этого каждые 10мс увеличивая счетчик тиков (jiffies counter). Данные тики считаются с момента запуска системы и каждые 500 тиков (раз в 5 секунд) рассчитывается Load Average.

Читайте также:  Crusader kings для linux

Код непосредственно расчета находится в ядре в файле timer.c (код приведен для версии 2.4, в версии 2.6 все это несколько рассредоточено, но логика не изменилась, дальше, надеюсь, тоже существенных изменений нет, но, честно говоря, последние релизы не проверял):

Как видно, рассчитываются по очереди те самые три значения LA, однако не указано, что именно считается, и как именно считается. Это тоже не проблема, код функции count_active_tasks() находится в том же файле, чуть выше:

А CALC_LOAD лежит в sched.h вместе с несколькими интересными константами:

Из всего вышеперечисленного можно сказать, что раз в 5 секунд ядро смотрит, сколько всего процессов находится в состоянии RUNNING и UNINTERRUPTIBLE (кстати в других UNIX системах это не так) и для каждого такого процесса увеличивает счетчик на FIXED_1, что равняется 1 вот такое

Однако помимо ответов на имевшиеся изначально вопросы разбор кода ставит и новые. Например, применима ли затухающая экспонента к сокращению числа ожидающих процессов? Если мы рассматриваем радиоактивный распад, то его скорость ограничена лишь количеством ядер, в нашем же случае, при большом количестве процессов все все упрется в пропускную способность CPU. Так же, если сравнить полученную формулу с экспоненциальным законом, становится видно, что , где T — продолжительность интервала набора данных (1, 5 или 15 минут). Таким образом разработчики ядра считают, что скорость уменьшения Load Average обратно пропорциональна продолжительности измерений, что несколько неочевидно, по крайней мере для меня. Ну и не сложно смоделировать ситуации, когда огромные значения LA не будут реально отображать загрузку системы, или наоборот.

В конечном счете складывается впечатление, что для расчета Load Average была выбрана сглаживающая функция, максимально быстро уменьшающая свое значение, что в целом логично для получения конечно числа, но не отображает реально происходящего процесса. И если кто-нибудь мне объяснит, почему именно экспонента и почему именно в таком виде, буду весьма признателен.

Источник

CPU Load: когда начинать волноваться?

Данная заметка является переводом статьи из блога компании Scout. В статье дается простое и наглядное объяснение такого понятия, как load average . Статья ориентирована на начинающих Linux-администраторов, но, возможно, будет полезна и более опытным админам. Заинтересовавшимся добро пожаловать под кат.

Вероятно, Вы уже знакомы с понятием load average . Load average — это три числа, отображаемые при выполнении команд top и uptime . Выглядят они примерно так:

Большинство интуитивно понимают, что эти три числа обозначают средние значения загрузки процессора на прогрессивно увеличивающихся временных промежутках (одна, пять и пятнадцать минут) и чем меньше их значения — тем лучше. Большие числа свидетельствуют о слишком большой нагрузке на сервер. Но какие значения считать предельными? Какие значения являются «плохими», а какие — «хорошими»? Когда Вам следует просто волноваться о занчениях средней загрузки, а когда следует бросать другие дела и решать проблему так быстро, как это возможно?
Для начала, давайте разберемся, что же означает load average . Рассмотрим простейший случай: предположим, что у нас в наличии один сервер с одноядерным процессором.

Аналогия транспортного потока

Одноядерный процессор похож на дорогу с одной полосой движения. Представьте себе, что Вы управяете движением машин по мосту. Иногда, Ваш мост загружен настолько сильно, что машинам приходится ждать в очереди чтобы проехать по нему. Вы хотите дать людям понять, как долго им придется ждать чтобы перебраться на другую сторону реки. Хорошим способом сделать это будет показать как много машин ждут в очереди в конкретный момент времени. Если машин в очереди нет, подъезжающие водители будут знать, что они сразу смогут проехать по мосту. В противном случае, они будут понимать, что придется ждать своей очереди.
Итак, Управляющий Мостом, какую систему обозначений Вы будете использовать? Как насчет такой:

  • 0.00 означает, что на мосту нет ни одной машины. Фактически, значения от 0.00 до 1.00 означают отсутствие очереди. Подъезжающая машина может воспользоваться мостом без ожидания;
  • 1.00 означает, что на мосту находится как раз столько автомобилей, сколько он может вместить. Все еще идет хорошо, но, в случае увеличения потока машин, возможны проблемы;
  • Значения, превышающие 1.00 означают наличие очереди на въезде. Насколько большой? Например, значение 2.00 показывает, что в очереди стоит столько же автомобилей, сколько движется по мосту. 3.00 означает, что мост полностью занят и в очереди ожидает в два раза больше машин, чем он может вместить. И так далее.

load average = 1.00
load average = 0.50
load average = 1.70
Вот базовое значение загрузки процессора. «Машины» обрабатываются с использованием промежутков процессорного времени («пересекают мост»), либо ставятся в очередь. В Unix это называется длина очереди выполнения: количество всех процессов, выполняемых в данный момент времени, плюс количество процессов, ожидающих в очереди.
Вам, как управляющему мостом, хотелось бы, чтобы машины-процессы никогда не ждали в очереди. Таким образом, предпочтительно, чтобы загрузки процессора была всегда ниже 1.00. Периодически возможны всплески трафика, когда загрузка будет превышать 1.00, но если она постоянно превышает данное значение — это повод начать волноваться.

Читайте также:  Восстановить загрузчик windows 10 утилита

Так Вы говорите, 1.00 — идеальное значание load average?

Что насчет многопроцессорных систем? Мой сервер показывает загрузку 3.00 и все ОК!

У Вас четырехпроцессорная система? Все в порядке, если load average равен 3.00.
В мультипроцессорных системах загрузка вычисляется относительно количества доступных процессорных ядер. 100% загрузка обозначается числом 1.00 для одноядерной машины, числом 2.00 для двуядерной, 4.00 для четырехъядерной и т.д.
Если вернуться к нашей аналогии с мостом, 1.00 означает «одну полностью загруженную полосу движения». Если на мосту всего одна полоса, 1.00 означает, что мост загружен на 100%, если же в наличии две полосы, он загружен всего на 50%.
То же самое с процессорами. 1.00 означает 100% загрузки одноядерного процессора. 2.00 — 100% загрузки двуядерного и т.д.

Многоядерность vs. многопроцессорность

Сведем все вместе

Давайте посмотрим на средние значения загрузки с помощью команды uptime :

Здесь представлены показатели для системы с четырехъядерным процессором и мы видим, что имеется большой запас по нагрузке. Я даже не буду задумываться о ней, пока load average не превысит 3.70.

Какое среднее значение мне следует контролировать? Для одной, пяти или 15 минут?
Количество ядер важно для правильно понимания load average. Как мне его узнать?

Команда cat /proc/cpuinfo выводит информацию обо всех процессорах в вашей системе. Чтобы узнать количество ядер, «скормите» ее вывод утилите grep :

Примечания переводчика

Выше представлен перевод самой статьи. Также много интересной информации можно почерпнуть из комментариев к ней. Так, один из комментаторов говорит о том, что не для каждой системы важно иметь запас по производтельности и не допускать значения загрузки выше 0.70 — иногда нам нужно чтобы сервер работал «на всю катушку» и в таких случаях load average = 1.00 — то, что доктор прописал.

Хабраюзер dukelion добавил в комментариях ценное замечание, что в некоторых сценариях, для достижения максимального КПД «железа», стоит держать значение load average несколько выше 1.00 в ущерб эффективности работы каждого отдельного процесса.

Хабраюзер enemo в комментариях добавил замечание о том, что высокий показатель load average может быть вызван большим количеством процессов, выполняющих в данный момент операции чтения/записи. То есть, load average > 1.00 на одноядерной машине не всегда говорит о том, что в Вашей системе отсутствует запас по загрузке процессора. Требуется более внимательное изучение причин такого показателя. Кстати, это хорошая тема для нового поста на Хабре 🙂

Источник

Linux: CPU Load — когда пора волноваться или что значит Load Average

Скорее всего — вы уже знакомы с понятием Load Average. LA представляет собой три числа, которые отображаются в утилитах uptime и top , и выглядят примерно так:

load average: 0.09, 0.05, 0.01

Большинство людей знают, что обозначают эти цифры: они отображают среднюю нагрузку за определённое время (1, 5 и 15 минут), и знают, что чем меньшее значение — тем лучше. Большие же значения означают какие-то проблемы с нагрузкой на процессор. Но — какой порог? как выглядит «хорошее» и «плохое» значение Load Average? Когда начинать беспокоиться — а когда пора уже паниковать и срочно фиксить проблему?

Для начала — давайте рассмотрим, что именно обозначает Load Average. Начнём с простого примера — машина с одноядерным процессором.

Пример с движением по дороге

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

И так, оператор — какую систему измерения вы выберете? Как на счёт такой:

  • 0.00 означает что движения по мосту нет вообще. В действительности — значения между 0.00 и 1.00 будет обозначать, что очереди нет и движение свободно;
  • 1.00 означает, что мост уже занят практически на полную пропускную способность. Всё ещё в порядке, но если движение ещё немного увеличится — то продвижение машин уже замедлится;
  • свыше 1.00 уже означает образование очереди. Насколько большая? Например, 2.00 будет обозначать, что заняты две полосы — одна уже на мосту, и одна — на подъездной дороге. 3.00 означает, что заняты уже три полосы — одна на самом мосту, и две — в очереди на дороге.
Читайте также:  Установка arch linux через wifi

= load of 0.50

= load of 1.00

= load of 1.70

Это пример того, чем является загрузка процессора. «Машины» тут — процессы, занимающие процессорное время («переезжают мост«), или стоящие в очереди на подъезде к нему. UNIX считает загрузку, как «длина в очереди на выполнение«: сумма процессов, которые в настоящие момент выполняются + количество процессов в очереди на обработку:

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

Так что — Load Average 1.00 является идеальным показателем?

Не совсем. Проблема нагрузки 1.00 в том, что у вас не остаётся «просвета» (запаса). На практике, многие системные администраторы придерживаются оптимального значения в 0.70:

  • «Пора обратить внимание«: полезное правило 0.70 — если Load Average постоянно выше 0.70 — время искать причину прежде, чем это станет настоящей проблемой;
  • «Пора исправлять это«: полезное правило 1.00 — если Load Average становится выше 1.00 — найдите причину и исправьте её уже сейчас. В противном случае — вы рискуете быть разбуженным среди ночи — и ничего прикольного в этом уже не будет;
  • «Чёрт, 3 часа ночи — WTF?«: полезное правило 5.00 — если Load Average становится выше 5.00 — у вас могут быть серьёзные проблемы, и ваша машина либо уже зависла, либо уже работает намного медленнее, и это случится (неожиданно!) в самое неподходящее время, например — среди ночи или во время конференции. Не позволяйте этому произойти.

А как на счёт многоядерных процессоров? У меня Load Average 3.00 — но всё работает отлично!

У вас четырёхъядерный процессор? Тогда — Load Average в 3.00 совершенно нормальное значение.

На многоядерных процессорах значение LA взаимосвязано с количеством процессоров. Использование на 100% отображается как 1.00 на одноядерной системе, 2.00 на двухъядерной, 4.00 на четырёх и так далее.

Если мы вернёмся к аналогии с мостом, то 1.00 значит, что одна полоса движения на мосту полностью занята. На мосту с одной полосой — это и будет 100% его «пропускной способности». На двухполосном мосту — это уже 50%, т.к. только одна полоса занята полностью — но есть ещё одна, полностью свободная.

То же самое и с процессором — нагрузка в 1.00 будет 100% на одноядерной системе, а на двухъядерной — значение 2.00 будет 100% нагрузки.

Многоядерность vs многопроцессорность

Раз уж мы затронули эту тему — давайте поговорим о разнице между многоядерными и многопроцессорными системами. С точки зрения производительности — равна ли машина с одним двухъядерным процессоров — машине с двумя процессорами по одному ядру? Грубо говоря — да. Есть много тонкостей, связанных с кешированием, передачей процессов между процессорами и так далее. Несмотря на это, в целях вычисления итоговой нагрузки на процессор(ы) — важно общее количество ядер, независимо от того, на сколько физических процессоров они распределены.

Это приводит нас к ещё двум правилам:

  • «Количество ядер = максимальной нагрузке«: на многоядерных системах, Load Average не должен превышать количество ядер;
  • «Ядра есть ядра«: не важно, как распределены ядра по процессорам. Два четырёхъядерных процессора == четырём двухъядерным == восьми одноядерным процессорам.

Подведём итог

Давайте посмотрим на Load Average в выводе утилиты uptime :

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

Далее, как на счёт остальных значений? 0.65 значит нагрузку за последнюю минуту, 0.42 — за последние 5 минут и 0.36 — за прошедшие 15 минут. Это приводит нас к вопросу:

За каким именно значением наблюдать? 1, 5 или 15 минут?

Помня правила, которые мы обсудили (1.00 == «Пора исправлять это«) — вам необходимо обращать внимание на значения 5 и 15 минут. Т.е., если на вашей машине бывают пики нагрузки за 1 минуту — это нормально. Если же значение 15-ти минут поднимается выше 1.00 и остаётся таким — пора заняться этим вопросом (конечно, учитывая момент, касающийся количества ядер в системе).

Значит, количество ядер в системе важный вопрос для выяснения реальной нагрузки. Как мне узнать — сколько ядер в моей системе?

так вы получите полную информацию о процессоре(ах).

А что бы получить просто число, без другой информации — выполните:

Оригинал статьи взят отсюда>>>. Замечания/предложения к переводу категорически приветствуются.

Источник

Оцените статью