Я вижу, что Вы работали apache
с 1G ram
, у меня был a vps
в прошлом году и имел Вашу проблему. apache
потребность о поршне K 300-400 и это очень плохо для a VPS
, я удалил apache
и установленный lighthttpd
. Вы делаете это.
Я написал скрипт на Python, который просто раскручивает некоторые потоки и сжигает циклы процессора. Идея заключается в том, чтобы протестировать набор задач против него, так как он достаточно прост.
#!/usr/bin/env python
import threading
def cycle_burner():
while True:
meh = 84908230489 % 323422
for i in range(3):
thread = threading.Thread(target=cycle_burner)
print "Starting a thread"
thread.start()
Просто запуск скрипта на Python съедает около 150% использования процессора.
[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Запуск скрипта на Python с набором задач работает, как и ожидалось. Смотрите вверху показывает, что процесс на Python привязан к 100% использованию.
[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Интересно, что запуск скрипта на Python и последующее немедленное использование набора задач для установки только что запущенного процесса на 100%. Обратите внимание, что планировщик Linux закончил выполнение команд Bash до порождения потоков Python. Итак, процесс на Python был запущен, затем он был настроен на выполнение на процессоре 0, затем он породил свои потоки, которые унаследовали соответствующее сродство.
[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread
Этот результат контрастирует с этим методом, который является точно таким же, но позволяет питоновским нитям нереститься до установки сродства процесса Python. Это повторяет результаты "taskset ничего не делает", описанные мною выше.
[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0
Что здесь происходит?
Видимо, потоки, порожденные до изменения сродства родительского процесса, не наследуют сродства своего родителя. Если бы кто-нибудь мог отредактировать ссылку на документацию, объясняющую это, это было бы полезно.
Я думаю, вам понадобится позвонить на задачу один раз за нить, т. Е. Использовать PS -el
вместо PGREP
и труба, которая в CaseSet -CP 0
ps -eLo cmd,tid | grep python | perl -pe 's/.* (\d+)$/\1/' | xargs -n 1 taskset -cp 0
Это задача задач для всех идентификаторов потоков.
попробуйте вместо него numactl с - Physcpubind
(или -C
). На странице руководства сказано:
... Политика установлена для команды и наследуется всеми ее дочерними элементами.
(в последних версиях набора задач
есть также параметр -a
, который ] Устанавливает или извлекает соответствие ЦП всех задач (потоков) для данного PID.
, но неясно, работает ли это также для дочерних процессов задачи, запущенной с набором задач
, в отличие от изменения уже запущенного процесса)
Я успешно использую опцию taskset
-a
. У меня есть сервер с именем videoconverterd, который потребляет много ресурсов ЦП; top
показывает
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8991 root 20 0 1299472 346724 47380 S 385.7 4.3 42:41.37 videoconverterd
После запуска taskset -apc 0 8991
загрузка ЦП падает до
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8991 root 20 0 1221832 293344 47380 S 99.7 3.7 49:13.28 videoconverterd
Я использую CentOS 7 с taskset
версией 2.23.2.