LINUX.ORG.RU

непропорциональное падение производительности форков


0

0

такая ситуация: есть сервер (2-ядерный), на котором сейчас постоянно
работают 5 процессов полностью жрущих процессор:

Cpu(s): 98.3% us, 1.5% sy, 0.0% ni, 0.0% id, 0.0% wa, 0.2% hi, 0.0% si

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8849 root 25 0 78008 73m 2680 R 50 3.6 18:01.27 OPSTask_clone_r
8876 root 25 0 80044 75m 2404 R 42 3.7 20:12.03 OPSTask_clone_r
8854 root 25 0 80156 75m 2404 R 40 3.7 17:36.53 OPSTask_clone_r
27544 root 25 0 78240 73m 2684 R 32 3.6 17:01.54 OPSTask_clone_r
8922 root 25 0 79232 74m 2404 R 30 3.7 20:33.89 OPSTask_clone_r

логично предположить, что если я на нем запущу свой CPU-bound процесс, то его
производительность будет в 3-4 раза хуже, чем на ненагруженном
сервере. Ну хорошо, сделаем скидку -- допустим в 5 раз.

если процесс обычный, то так и есть. Но у меня шелловский скрипт,
который делает много форков. И его производительность (даже с renice -20)
упала в 20-40 раз по сравнению с ненагруженным сервером.
Это баг линукса? Пофиксили ли его в новых ядрах?

мое ядро: 2.6.20-vs2.2.0

★★★★★

Зачем тебе много форков? Форкаться дорого. Может, дизайн изменить?

mv ★★★★★
()
Ответ на: комментарий от mv

> Зачем тебе много форков? Форкаться дорого. Может, дизайн изменить?

это такой код, который берет исходные данные в тех форматах которые есть, и генерирует описание на неком DSL. То есть это такой грязный код парсящий и генерирующий текст. Он написан на шелле, на шелле довольно сложно писать без форков.

То есть речь идет не о смене дизайна, а о переписывании на awk или перл..

dilmah ★★★★★
() автор топика
Ответ на: комментарий от sdio

в данном случае речь идет о злокачественном поведении шедулера линукса -- скрипт производительность которого была весьма хороша проседает в производительности на порядки на загруженной машине

dilmah ★★★★★
() автор топика

Взял сейчас CentOS 5.2 (2.6.18-92.el5) Celeron 1.70GHz. Нагрузку на процессор создавал с помощью команды:

i=0 ; while : ; do i=$(( i + 1 )) ; done

скорость форков измерял:

time nice -n -19 /bin/bash -c "for (( i=1; i<10000 ; i++ )) ; do /bin/true ; done"

Если запущено 5 процессов while, то 50.835s, если 3 while, то 37.819s, если проц не чем не занят, то 20.929s.

Может у вас процессы OPSTask_clone_r грузят не только процессор, но и дисковую подсистему или забирают дисковый кеш?

mky ★★★★★
()
Ответ на: комментарий от dilmah

Вряд ли это поможет, но попробуй поиграть с настройками планировщика; /proc/sys/kernel/sched_* Я бы начал с sched_child_runs_first.

tailgunner ★★★★★
()

Наверное скажу глупость, но при форке процесс тормозится, освобождая остаток кванта времени системе до тех пор, пока не будет создан новый процесс. Пока новый процесс запустится и старый выйдет из заморозки остальные процессы жрут время в своих больших квантах (которые должы им выделятся, т.к. они - активные потребители процессорного времени).
Потом, когда разморозятся и запустятся новый+старый процесс - они будут нормально работать, но во время этой паузы - они будут простаивать. Причем их в очереди планирования не будет. Когда они туда снова попадут - им будут выделятся небольшие кванты времени. В итоге они не на равных участвуют в распределении квантов процессорного времени.
Во всяком случае так получается в теории для теоретической ОС.
Насколько это соответствует модели распределения времени в Linux я не в курсе.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

В доCFS'ную эпоху процесс-родитель отдавал половину оставшегося тайм слайса потомку. CFS понятие тайм слайс изничтожил совсем.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.