Я использую 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
группе, будут добавлены в cgrouplimitmem
и ограничены в подсистеме памяти.- Ваш пользователь,
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».
решение3
Вы, вероятно, можете попробовать настроить /etc/security/limits.conf, там вы сможете настроить, сколько процессорного времени и памяти может потреблять пользователь. Подробнее см.https://linux.die.net/man/5/limits.conf