[Linux] нагрузка на CPU

SergeRRRRRR

Хочу написать скрипт, который будет автоматически масштабировать облачный VPS в зависимости от нагрузки. По памяти понятно - парсить вывод команды top или free. Прикинул, что норм будет, если 40% оперативки свободно, при менее 20% или более 60% свободной оперативки общее количество памяти будет доводиться до того значения, чтобы свободной было 40%.
Загвоздка в CPU - каким параметром можно воспользоваться при определении нагрузки на CPU и как его привязать к скорости проца?

tokuchu

Мне чего-то кажется, что с CPU как раз проще, чем с памятью. Т.к. она обычно вся используется под кеш и чтобы точно сказать можно ли от этого кеша безболезненно откусить, это надо знать специфику приложения.
Загрузку проца тебе разве top не показывает?

Viktory-s

How to Limit The CPU Usage of Any Process in Linux
http://maketecheasier.com/limit-cpu-usage-of-any-process-in-...
И ещё много таких утилит по ограничению ресурсов для процессов. Ничего практически писать самому не придётся. Тебе только нужно придумать критерии по которым происходит то или иное ограничение. В твоём случае по CPU.

Viktory-s

Вот ещё:
Putting a Group of Processes into a CPU and Memory Jail — First Steps with Control Groups in Linux
http://linux-tipps.blogspot.com/2011/06/putting-group-of-pro...

SergeRRRRRR

Разве та память, которая free в выводе top'a не является свободной? Да и по идее есть swap раздел, так что думаю ОС туда выгрузить что-то сможет.
top показывает нагрузку на различные режимы проца, думаю логичным было бы использовать показатель idle, но как связать его с вычислительной мощностью проца?

Viktory-s

А вообще много всего интересного на эту тему можно найти тут:
Интересные ссылки, HOWTO, tips и т.д. постим здесь :

SergeRRRRRR

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

BondarAndrey

Это вообще нужно, чтобы например при наплыве посетителей сервак не начинал жутко тормозить и свапить
Я бы в качестве первого решения просто мониторил бы LA (load average)

SergeRRRRRR

LA - слишком расплывчатый показатель, который зависит от многих подсистем, а не только проца. Да и опять же непонятно, как его связать с цпу. При одном и том же ЛА сервак может и еле ползать и норм работать.

BondarAndrey

LA - слишком расплывчатый показатель, который зависит от многих подсистем, а не только проца. Да и опять же непонятно, как его связать с цпу. При одном и том же ЛА сервак может и еле ползать и норм работать.
Если что, субъективное ощущение "торможения" вызывается не активным использованием проца, а активным I/O, так что если ты ищешь, как сделать, "чтобы не тормозило", надо не проц делить, а ввод/вывод тюнить, в том числе и проверить, что нет интенсивного свопа.

Viktory-s

Это не совсем то, мне не нужно ограничивать процессы по нагрузке - мне необходимо узнать текущую нагрузку на цпу и исходя из этого увеличить или уменьшить вычислительную мощность цпу.
Ты имеешь ввиду это?:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0 1 2 3
CPUs which need to have their frequency coordinated by software: 3
maximum transition latency: 10.0 us.
hardware limits: 933 MHz - 2.13 GHz
available frequency steps: 2.13 GHz, 2.00 GHz, 1.87 GHz, 1.73 GHz, 1.60 GHz, 1.47 GHz, 1.33 GHz, 1.20 GHz, 1.07 GHz, 933 MHz
available cpufreq governors: ondemand, conservative, powersave, userspace, performance
current policy: frequency should be within 933 MHz and 2.13 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 2.13 GHz.

При увеличении нагрузки увеличить частоту проца из заданного предела?
Или дать больше ядер на задачу?
Или выделить больше циклов проца на задачу?
Других вариантов я не придумал пока.

Viktory-s

Есть ещё это:

SergeRRRRRR

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

katrin2201

Не в кассу, но все равно посоветую вариант привязаться не к загрузке памяти/проца - а к среднему времени ответа на запрос. Это может оказаться сложнее в реализации, зато метрика более правильная имхо.

SergeRRRRRR

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

tokuchu

Разве та память, которая free в выводе top'a не является свободной? Да и по идее есть swap раздел, так что думаю ОС туда выгрузить что-то сможет.
swap вообще можно отключить, наверное в таких условиях.
Ну вот смотри пример top с моего компа:
Mem:    761832k total,   566432k used,   195400k free,       12k buffers
Swap: 0k total, 0k used, 0k free, 299404k cached

Тут free 195400 — да, она свободная. Но она при первой же возможности будет занята файловым кешем, который там останется до тех пор, пока не "протухнет" или не понадобится память приложению.
Тут сильно зависит от твоего приложения. Если у тебя что-нибудь числодробильное, которому нужна память, чтобы хранить данные, и совсем не надо читать файлы какие-нибудь, то тут можно ориентироваться на свободное как cached+free. А если у тебя какой-нибудь файловый сервер, то ему чем больше памяти тем лучше и скорее всего у него free будет около 0 всегда.
Ну собственно даже пример с файлового сервера:
Mem:   4053108k total,  3991604k used,    61504k free,       24k buffers
Swap: 8789056k total, 0k used, 8789056k free, 3661068k cached

Из 4-х гигов 3.6 заюзано под файловый кеш. free колеблется 50-200 мегов.
Т.е. тут надо искать компромисс. Как тебе уже сказали — если, например, у тебя это веб-сервер, обслуживающий клиентов, то можно остановиться после достижения удовлетворительного времени отклика.
top показывает нагрузку на различные режимы проца, думаю логичным было бы использовать показатель idle, но как связать его с вычислительной мощностью проца?
Опять же всё зависит от приложения. Load Average, кстати, не такая уж и плохая характеристика. А если на загрузку в % смотреть, то тут на idle, wait можно обратить внимание.

SergeRRRRRR

по умолчанию это все-таки веб-сервер.
Настройка на отклик, имхо, не самое лучшее - почему, описал в предыдущем посте.
Интересно, как в среднем изменяется idle при увеличении мощности проца. Думаю, помогут какие-нибудь бенчмарки с не стресс-тестами, иначе не смогу понять динамику зависимости свободных ресурсов проца от тактовой частоты для одной и той же задачи. Да, проц 4-ядерный, в top'e как я понял, выводится среднее по всем ядрам.

tokuchu

Настройка на отклик, имхо, не самое лучшее - почему, описал в предыдущем посте.
Там чего-то непонятное написано, про апачи в свопе. Т.к. когда твои апачи в свопе не смогут работать из-за того, что память занята, то это повлияет на время отклика и оно вырастет.
Интересно, как в среднем изменяется idle при увеличении мощности проца.
Смотря на что проц расходуется. Для вычислительных независимых задач — примерно линейно производительность растёт. Если оно на ожидание IO тратится, то тут уже другие проблемы.
Да, проц 4-ядерный, в top'e как я понял, выводится среднее по всем ядрам.
Там если нажимать "1", то оно будет переключаться между общим и по каждому процессору.

SergeRRRRRR

Т.к. когда твои апачи в свопе не смогут работать из-за того, что память занята, то это повлияет на время отклика и оно вырастет.
ну да, есть демон - измеряю от него ответ, так как он уже загружен в память, отсутствие свободной оперативки на его работе не скажется, но при этом новый процессы апача или , например, sshd будут располагаться в свопе, что приведет к снижению производительности конкретно этих процессов. В случае VPS на openVZ они просто не смогут форкнуться, тк там нет свопа и умрут, сейчас к счастью Хen, так что этой проблемы не будет.

tokuchu

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

SergeRRRRRR

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

juliuzz

скорость проца (в MHz типа-производительность (в BogoMIPS) и количество ядер берётся из /proc/cpuinfo
текущая загрузка из load

katrin2201

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

SergeRRRRRR

не очевидно - почему упирается именно в цпу, а не в сеть или I/O, в LA -это тоже учитывается. А ошибка тут будет стоить денег, ибо будет увеличена частота проца - а это дополнительные деньги.

Viktory-s

не очевидно
Поверь.

SergeRRRRRR

Вот тестировал VPS с помощью ab, проц 4-ядерный: Обратите внимание на LA (в 2 раза больше колва ядер) и загрузку CPU по us и id.
top - 17:35:36 up 1 day, 20:06,  2 users,  load average: 8.15, 4.70, 2.44
Tasks: 24 total, 12 running, 12 sleeping, 0 stopped, 0 zombie
Cpu(s): 15.9%us, 39.4%sy, 0.0%ni, 44.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1048576k total, 340736k used, 707840k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached

katrin2201

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

katrin2201

клац

SergeRRRRRR

это на openVZ, бенчмарк еще работал.

katrin2201

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

SergeRRRRRR

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

Viktory-s

Интересные изменения в новой версии GNU Parallel 20110722 ('Murdoch'):
New in this release:
niceload: --hard will suspend a program if a limit is reached - as opposed to just slowing the program down.
niceload: --soft will slow the program down - as opposed to suspending the program completely.
niceload: --run-io will slow down a program if disk io goes above a certain limit.
niceload: --run-load will slow down a program if loadaverage goes above a certain limit.
niceload: --run-mem will slow down a program if free memory goes below a certain limit.
niceload: --run-noswap will slow down a program if the computer is swapping.
niceload: --start-io, --start-load, --start-mem, --start-noswap will defer starting a program until the system is below the limit.
--io, --load, --mem, and --noswap sets both --run-* and --start-*.
niceload got a major rewrite and is now object oriented.

Может быть там что-то будет полезное при написании твоей программы?

SergeRRRRRR

не, решил мониторить оперативу free+cache+buffered и LA. Я немного ошибся, частоту cpu менять нельзя, можно изменять количество ядер на лету, так даже проще.
Оставить комментарий
Имя или ник:
Комментарий: