- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Приветствую.
Пытаюсь найти способы для справедливого разделения ресурсов (CPU, RAM, I/O) в Unix.
У меня имеется веб-сервер (nginx - php-fpm на Debian) и некоторое количество сайтов. Несколько скриптов (где число их = кол-ву ядер) могут истратить все ресурсы процессора и не дать остальным скриптам нормально работать. Нужно позволить скрипту использовать все ресурсы только, когда он работает единственный в системе. В остальных же случаев скрипты/процессы должны делится между собой ресурсами (т.е. начинать тратить меньше).
Вторая задача - это честное разделение ресурсов по домену или юзеру. Допустим по домену. У нас есть два активных работающих PHP скрипта на разных доменах, который являются тестовыми и занимают 100% допустимых ресурсов. Тогда первый скрипт должен тратить 50%, и второй 50%. А определять это можно по папке /var/www/$domain. Соответственно если домена три, то в случае трёх скриптов - каждый должен занимать не более 33%.
Кто-нибудь сталкивался с такой задачей? Получилось ли реализовать? Какими методами? Я предполагаю, что первый вопрос относится к модифицированному ядру Linux, может быть с BFS/BFQ. Но разделение памяти останется не честным.
Что касается второго вопроса, то мне кажется он намного сложнее. У меня абсолютно ней идей, как и на каком вообще уровне это может быть реализовано.
На виртуальные машины сервер попилить не хотите? В этом случае не потребуется писать скрипты, т.к. лимиты ресурсов на виртуальные машины поддерживаются "из коробки".
nice, ionice, cgroups
или виртуалки, например на openvz
nice, ionice, cgroups
Я понимаю, но я новичёк, подскажите, как хотя бы в теории это реализовывается, я в основном про второй вариант (когда надо честное разделение по домену)? Написать скрипт на bash? Модифицировать ядро?
p.s. У вас полезный блог. Может напишите статейку про мою проблему?)
Два варианта
- "жесткие лимиты, пусть использует N ресурсов и не больше"
- "мягкие лимиты(например изменение nice), пусть лучше быстрее обработает"
Для первого - это поднять виртуалки и раскидать туда клиентов. Каждому гарантировано CPU, RAM.
Или использовать cgroups -> для юзеров на CPU и RAM. PHP-PFM можно запускать под разными пользователями. Для RAM - лучше выставить лимиты на кол-во процессов php. И лимит делать только по CPU.
Для LAMP - лимит делать на I/O, не особо актуально. Грузит больше mysql, но есть userstat у percona.
И второй случай, можно менять nice пользователям
Для ISPmanager -> php как fcgi
http://poiuty.ru/ispmanager-menyaem-nice-pri-dlya-processov.html (набросок)
{
echo $item->name." - ".$cpu_pool_intval."\n";
}
if($cpu_pool_intval > 25 && $cpu_pool_intval < 50)
{
echo $item->name." - ".$cpu_pool_intval." RENICE!\n";
$cpu_nice = shell_exec("renice +3 -u '$item->name'");
}
if($cpu_pool_intval > 50 && $cpu_pool_intval < 75)
{
echo $item->name." - ".$cpu_pool_intval." RENICE!\n";
$cpu_nice = shell_exec("renice +4 -u '$item->name'");
}
А так же блокировать тех, кто нагрузил весь сервер (например форк или ddos)
http://poiuty.ru/process-killer-dlya-ispmanager-pro.html (набросок)
Два варианта
- "жесткие лимиты, пусть использует N ресурсов и не больше"
- "мягкие лимиты, пусть лучше быстрее обработает"
Для первого - это поднять виртуалки и раскидать туда клиентов. Каждому гарантировано CPU, RAM.
Или использовать cgroups -> для юзеров на CPU и RAM. PHP-PFM можно запускать под разными пользователями. Для RAM - лучше выставить лимиты на кол-во процессов php. И лимит делать только по CPU.
Для LAMP - лимит делать на I/O, не особо актуально. Грузит больше mysql, но есть userstat у percona.
И второй случай, можно менять nice пользователям
Для ISPmanager -> php как fcgi
http://poiuty.ru/ispmanager-menyaem-nice-pri-dlya-processov.html (набросок)
А так же блокировать тех, кто нагрузил весь сервер (например форк или ddos)
http://poiuty.ru/process-killer-dlya-ispmanager-pro.html (набросок)
Мне если честно любой из предложенных вами вариантов подойдёт. Но в идеале "жесткие лимиты", правда хотелось бы без виртуалок...
ISPManager не использую и не планирую. Можно как-нибудь без него это сделать? И если делать скрипт, то как часто его запускать? Ну т.е. понятно что запуск один раз навечно, но как часто он должен выполнять действия - если раз в милисекунду - не будет ли слишком грузить CPU? Прежде всего волнуют динамические фреймворки (php, perl, node.js, ruby)
Можете накодить скрипты и пускать их по крону. Можете нагуглить себе мануал по cgroups (ядро модифицировать не надо вроде)
Можете накодить скрипты и пускать их по крону.
Но как часто?
Но как часто?
я раз в 3 минуты пускаю, но при этом еще собираю стату
http://poiuty.ru/grafiki-cpu-load-na-virtualnom-xostinge.html
я раз в 3 минуты пускаю, но при этом еще собираю стату
http://poiuty.ru/grafiki-cpu-load-na-virtualnom-xostinge.html
Не совсем понятно.
Скрипты PHP например обычно работают не больше, чем 10 секунд. Если запускать раз в 3 минуты, то сама проблема (занятые ресурсы) никуда не денется.
Не совсем понятно.
Скрипты PHP например обычно работают не больше, чем 10 секунд. Если запускать раз в 3 минуты, то сама проблема (занятые ресурсы) никуда не денется.
Процессы не работают 10 секунд под нагрузкой. Так же через ps aux стата падает не резко в 0
Вот пример -> сбор статы, юзер почти не создает нагрузку.
Получаем сколько ест CPU в % от ядер (например процессы пользователя юзают 50% от 1 ядра, или процессы пользователя юзают 150% от 2 ядер)
Если cpu > n -> меняем приоритет процессам пользователя.
Если cpu > max -> отключаем пользователя.
Хотите жесткие лимиты используйте cgroups