Как ограничить использование процессора всего пользователя менее чем 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 должна позволить другим процессам выполняться раньше этих процессов.

решение2

Попытался ли тыCgroups?


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

Создайте cgroup с именем limitcpu. Строки, начинающиеся с group, создают cgroups и задают параметры подсистемы.

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

group limitcpu{

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

        }
}

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

Если задачи в cgroup должны иметь возможность доступа к одному ЦП в течение 0,1 (10%) секунды из каждой секунды, установите 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' и ограничен в подсистемах процессора.


В некоторых случаях вы можете попробовать использовать шаблон.

Например, укажите следующий шаблон в /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.

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

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

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

Учебное пособие от Digital Ocean.

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

решение3

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

Связанный контент