8

Я использую 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, но сейчас не могу этого сделать. Пока я не могу это сделать, мне нужна помощь, чтобы сделать это вручную с чем-то, что не требует перезагрузки сервера.

3 ответа3

6

Вы пробовали 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 будут добавлены в 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 определена «группа пользователей /adminstaff /peter», она будет игнорироваться в пользу «пользователей шаблона /% g /% и».

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

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

2

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

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

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

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

username    hard    priority    30

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .