В сценарии Bash приложение «стресс» запускается дважды каждый раз, когда я его вызываю. Вызывает утечку памяти

Я пытаюсь написать сценарий, позволяющий мне использовать «стрессовое» приложение, не загружая ЦП в 100% случаев. Я разделил выделение памяти и выделение ЦП на две отдельные «стрессовые» команды, чтобы я мог постоянно нагружать память, в то время как нагружая ЦП только половину времени. Например,

#!/bin/bash
set -m

/usr/local/bin/stress --vm 1 --vm-bytes 100MB &
while [ thing that evaluates as true ]
do
  /usr/local/bin/stress --cpu 1 --timeout 5s
  /usr/bin/sleep 5s
done

echo "Running jobs at end of script are: `jobs -p`"
echo `jobs -p` | /usr/bin/xargs kill -9
echo "After trying to kill them, running jobs are now: `jobs -p`"

Однако по какой-то причине, когда я делаю это, я в конечном итоге вижу, что стресс на самом деле вызывается дважды каждый раз, когда я пытаюсь его запустить. Это означает, что в итоге я получаю два экземпляра стресса, выделяющего память, а затем два экземпляра стресса, которые связывают ЦП, затем останавливаются, затем связывают его и останавливаются и т. д.

Кроме того, когда цикл while завершается, мой kill приводит к уничтожению только одного из двух экземпляров стресса, которые выполнялись в фоновом режиме.

Что я вижу из команды ps -ef, так это то, что родительский pid одного «напряжения» является pid другого «напряжения». Поэтому, когда цикл while завершается, написанное мной kill приводит к уничтожению только одного из этих мемов, выделяющих стрессовые экземпляры, потому что второй не принадлежит сценарию.

Процессы во время выполнения скрипта:

linux:~ # ps -ef | egrep "stress|bash"
...
root     23776 20979  0 14:32 pts/0    00:00:00 /bin/bash ./base_case.sh
root     23785 23776  0 14:32 pts/0    00:00:00 stress --vm 1 --vm-bytes 100MB
root     23788 23785  0 14:32 pts/0    00:00:16 stress --vm 1 --vm-bytes 100MB
root     23802 23776  0 14:32 pts/0    00:00:00 stress --cpu 1 --timeout 5s
root     23803 23802  0 14:32 pts/0    00:00:01 stress --cpu 1 --timeout 5s
...

Вывод скрипта, похоже, подразумевает, что каждый раз вызывается только один «стресс»:

linux:~ # ./base_case.sh 
stress: info: [23785] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [23802] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [23802] successful run completed in 5s
Running jobs at end of script are: 23785
./base_case.sh: line 14: 23785 Killed /usr/local/bin/stress --vm 1 --vm-bytes 100MB
After trying to kill them, running jobs are now: 

Процессы после завершения скрипта:

linux:~ # ps -ef | egrep "stress|bash"
...
root     23788     1  0 14:32 pts/0    00:00:58 stress --vm 1 --vm-bytes 100MB
...

Я избегаю шуток о сокращении стресса наполовину, но я был бы очень признателен за любые советы, которые остановят меня от удвоения стрессовых приложений, которые вызываются из моего сценария (и вызывают утечку памяти...). Спасибо!


person bdfariello    schedule 21.03.2014    source источник


Ответы (1)


Он не создает два экземпляра, а просто создает поток. Вы можете видеть, что PID вашего стрессового вызова ЦП равен 23802, и это родительский PID для второй записи в выводе ps.

Я рекомендую использовать htop с древовидным представлением (F5), там вы можете легко увидеть иерархию. (возможно, top тоже имеет вид в виде дерева)

person fejese    schedule 21.03.2014
comment
Интересно. Я заметил, что родительский PID был таким же, как PID моего вызова стресса. Я думаю, что исключил возможность того, что это проблема с потоками, потому что я не знал, что стресс по-прежнему связывает ЦП, даже если вы не укажете флаг --cpu, и когда «верхний» вывод показал два стресса экземпляров, каждый из которых загружает процессор, я думал, что это означает, что у меня было два отдельных случая стресса процессора. Так что, похоже, я не смогу так просто сделать то, что хотел. - person bdfariello; 21.03.2014