В скрипте 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 завершает работу только тем, что убивает один из этих mem, выделяющих экземпляры стресса, поскольку второй не принадлежит сценарию.
Процессы во время выполнения скрипта:
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
...
Я буду избегать любых шуток о сокращении моего напряжения пополам, но я был бы очень признателен за любые советы, которые не позволят мне удвоить приложения со стрессом, которые вызываются из моего сценария (и вызывают утечку памяти...) Спасибо!
1 ответ
Это не создание двух экземпляров, это просто создание потока. Вы можете видеть, что PID стресс-вызова вашего процессора равен 23802, и это родительский PID для второй записи в ps
выход.
Я рекомендую использовать htop
с древовидным представлением (F5) вы можете легко увидеть иерархию. (может быть top
также имеет вид на дерево)