Как ограничить всего пользователя менее 10% процессором, а не только процесс?


10

Я использую centos, cpanel / whm, и у меня установлен cpulimit.

У меня проблема в том, что один из моих пользователей использует слишком много ресурсов процессора. Более 100% последовательно, и это замедляет мой сервер.

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

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

Я попробовал следующее, но это не работает.

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

Я только что вернулся,

No process found
No process found
No process found
No process found
No process found
No process found

так далее

Есть две вещи, которые используют это экстремальное использование процессора.

Во-первых, этот файл в этом месте index.php. Другое - это [php], что бы это ни значило в WHM. Но в основном index.phpэто проблема.

Если бы я мог ограничить этот index.phpфайл в этом месте, это могло бы помочь смягчить эту проблему.

Кстати, я попробовал -Pфлаг, но это не доступно в качестве опции в отличие от документации.

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

возвращается

cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 1600 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Похоже, я должен сделать это с -eфлагом.

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

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

Ответы:


1

Вы правы в том, что вы не можете ограничить друга, используя процесс (PID), Apache порождает новый процесс (Worker) для каждого полученного запроса, назначая новый PID каждый раз.

В зависимости от того, какой обработчик PHP вы настроили WHM -> MultiPHP Manager -> PHP Handlers, Apache будет запускать сценарии PHP как сам по себе или запускать их как пользователь, которому принадлежит файл. Если вы используете в suPHPкачестве обработчика, процесс PHP будет выполняться от имени учетной записи, которой принадлежит файл.

Если скрипт выполняется владельцем, вы можете ограничить использование процессора учетной записью, добавив его в /etc/security/limits.confфайл. Хотя вы не можете использовать это, чтобы точно ограничить процент процессоров, вы можете изменить их «хорошее» значение, чтобы их процессы имели более низкий приоритет, чем другие процессы на сервере. Таким образом, другие процессы не должны будут ждать так долго.

Я никогда не использовал это сам (я запускаю CloudLinux), но я считаю, что следующая запись должна помочь с проблемой:

username    hard    priority    30

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

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


7

Вы пробовали Cgroups ?


  • Установите сервис sudo yum install libcgroupи запустите его sudo service cgconfig start.
  • После чего просмотрите конфигурацию подсистемы для cgroups, запустив sudo ls /cgroup

Создать группу с именем limitcpu. Строки, начинающиеся с группы, создают группы и устанавливают параметры подсистемы.

Пример /etc/cgconfig.conf:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

Для ограничения ЦП есть несколько настраиваемых параметров , которые можно использовать для ограничения явного использования ЦП.

Если задачи в cgroup должны иметь доступ к одному ЦП в течение 0,1 (10%) секунд из каждой 1 секунды, установите для cpu.cfs_quota_us значение 100000 и для cpu.cfs_period_us значение 1000000.


Cgred - это служба (которая запускает службу cgrulesengd), которая перемещает задачи в cgroups в соответствии с параметрами, установленными в файле /etc/cgrules.conf. Записи в файле /etc/cgrules.conf могут принимать одну из следующих двух форм:

user subsystems control_group
user:command subsystems control_group

Где userс именем пользователя или именем группы с префиксом «@». Замените subsystemsразделенным запятыми списком имен подсистем, control_groupпредставляет путь к cgroup и commandобозначает имя процесса или полный командный путь процесса.

Пример etc / cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefoxпроцессы, выполняемые любым пользователем, будут автоматически добавлены в браузеры cgroupи ограничены в подсистемах ЦП и памяти.

  • memhogпроцессы, запущенные кем-либо из adminгруппы, будут добавлены в cgroup limitmemи ограничены в подсистеме памяти.

    - Ваш пользователь, cpuhogбудет добавлен в cgroup 'limitcpu' и ограничен в подсистемах cpu.


Заранее используйте варианты, вместо этого вы можете попробовать использовать шаблон.

Например, укажите следующий шаблон в /etc/cgconfig.conf:

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

Затем используйте шаблон users /% g /% u в третьей строке записи /etc/cgrules.conf, который может выглядеть следующим образом:

peter:ftp       cpu     users/%g/%u

Эти %g and %uпеременные , используемые выше, автоматически заменяется группой и имя пользователя в зависимости от владельца процесса FTP.

Если процесс принадлежит peter из группы adminstaff, вышеуказанный путь преобразуется в users/adminstaff/peter.

Затем служба cgred ищет этот каталог, и, если он не существует, cgred создает его и назначает процесс пользователям / adminstaff / peter / tasks.

Обратите внимание, что правила шаблонов применяются только к определениям шаблонов в файлах конфигурации, поэтому, даже если в /etc/cgconfig.conf определено «group users / adminstaff / peter», оно будет проигнорировано в пользу «template users /% g /%». и».

Учебник по Digital Ocean.

Введение в контрольные группы.


0

Возможно, вы можете попытаться настроить /etc/security/limits.conf там, где вы сможете отрегулировать, сколько процессорного времени и памяти может потреблять пользователь. Подробнее см. Https://linux.die.net/man/5/limits.conf.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.