Как узнать загруженность сервера в процентах?

Имеется два (кол-во в будущем будет расти) сервера на которых крутиться один и тот же высоконагруженный веб проект, код одинаковый, ось — CentOS. По железу сервера различаются, первый — 2-ядерный с 4 гигами оперативы, второй — 4-ядерный с 8 гигами оперативы.

На входе имеем — кучу пользователей каждый из которых грузит сервер, причем по разному — кто то больше, кто то меньше, 10 минут назад так, сейчас уже сяк; может добавиться новый юзер, который создаст очень большую нагрузку и тд. Имеется статистика всего этого. Задача — распределить юзеров по серверам, чтобы загруженность этих серверов была более менее одинакова. Так как юзер загружает сервер по разному, то и перераспределять юзеров по серверам надо каждые 10-20 минут.

Для распределения необходимы данные по загруженности серверов. Получить их надо средствами php или операционной системы в виде процентного отношения, мол средняя загруженность сервера №1 за последние 15 минут = 85%. Средствами php можно получить при помощи функции sys_getloadavg, однако получаемое значение это «the number of processes in the system run queue», и, как я понял, оно не имеет максимального значения, т.е. в процентах загруженность выразить не получится, из-за чего нельзя определить условную «мощность» каждого сервера — максимальное кол-во юзеров которых можно отправлять на тот или иной сервер. Есть вариант писать в лог или мэмкэш данные из top, однако это придется делать очень часто (каждую секунду?) дабы получить наиболее достоверные данные, нагрузка то скачет. В общем, хабратоварищи, Ваши предложения =)
  • Вопрос задан
  • 10026 просмотров
Пригласить эксперта
Ответы на вопрос 7
@redsh
LA — очень хорошая метрика для оценки загруженности системы
лучше её и юзать вместо всяких процентов
но если очень хочется, можно как-нибудь в проценты перевести эмпирически

x = 100 - 100 / (LA + 1)

например, как-то так )
Ответ написан
@keatis
А как вы хотите посчитать загруженность сервера в целом? Это же не только процессор, но и дисковая подсистема, сетевая, всякая память виртуальная и не очень… Если только какой-то составной «процент» считать, с указанием весов загрузки каждой системы.
Но зачем, когда есть load average (LA)? Просто смотрите на его цифры и чем они больше, тем сильнее волнуйтесь.
Ответ написан
Комментировать
pentarh
@pentarh
Может быть 5 параметров нагрузки на сервер: процессор, память, дисковое io, свободное место на дисках и сеть.

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

Вот и считайте. Проц — top, место — df, io — iostat, сеть — nload. Загрузку оперативы определить не так просто как с остальными. Надо смотреть free,buffers,cached и total. И шевелить мозгом. Признаками нехватки памяти сначала является возрастающая нагрузка на винт, т.к. летит кеш. А потом нарастание свопа.

LA хоть и позволяет судить о нагрузке, но только относительно. У каждого характера нагрузки своя допустимая планка LA. У меня она варьируется от 1 до 50 в зависимости от сервера. К тому же от количества виртуальных процессоров тоже зависит.

В общем надо брать это все во внимание и применять конкретно к вашей ситуации. Универсальной формулы нет.
Ответ написан
pentarh
@pentarh
Кстати, есть еще один баттлнек — context switches в vmstat. Проявляет он себя очень редко, при количестве процессов от 2k. Вроде на 5 основных есть запас, а сервер на ручник становится.
Ответ написан
Комментировать
@pwlnw
Начинай нагружать и когда сервер перестанет удовлетворительно обслуживать, запиши load average — это будет 100%.
Другие способы конечно есть, но зачем?
Ответ написан
Комментировать
Veshij
@Veshij
Если вас интересует исключительно загрузка по cpu, то вас устроят данные из /proc/stat.
Или, например, можно запустить dstat и забирать csv-форматированные данные раз в секунду.
Ответ написан
Комментировать
brick812
@brick812
команда top в консоли ssh если что =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы