Como renunciar a um grupo de processos?

5

lb build pode criar a imagem do sistema em tempo real e invoca muitos processos durante a criação da imagem. Se eu começar como abaixo:

# nice -n 19 ionice -n 7 -c 3 lb build

todos os processos filhos recebem o mesmo nível:

  PID USER       IORR  IOWR    IO IO PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command                                                 
26196 morfik        0     0     0 B4  20   0 23888   672   668 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   536   536 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  6260  1144 S  0.0  0.6  0:02.60 │  │     └─ -su
11784 root          0     0     0 ??  39  19  4496   796   524 S  0.0  0.1  0:00.01 │  │        └─ /bin/sh /usr/lib/live/build/build               
11797 root          0     0     0 ??  39  19  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
11806 root          0     0     0 ??  39  19  7028   604   504 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
11798 root          0     0     0 ??  39  19  4496   824   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
11915 root          0     0     0 ??  39  19  4496   836   544 S  0.0  0.1  0:00.01 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
12753 root          0     0     0 ??  39  19  4496   856   548 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
12867 root          0     0     0 ??  39  19 62980  3508  2132 S 11.2  0.3  0:07.00 │  │                       └─ aptitude --assume-yes update
12943 root          0     0     0 ??  39  19 24296  1916  1568 S  0.0  0.2  0:00.14 │  │                          ├─ /usr/lib/apt/methods/xz
12927 root          0     0     0 ??  39  19 53280 30688 30172 R 86.5  3.0  0:28.65 │  │                          ├─ /usr/lib/apt/methods/rred
12891 root          0     0     0 ??  39  19 24304  1784  1440 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
12889 root          0     0     0 ??  39  19 24292  1624  1384 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/copy
12887 root          0     0     0 ??  39  19 32860  1956  1560 S  0.0  0.2  0:00.17 │  │                          ├─ /usr/lib/apt/methods/http
12886 root          0     0     0 ??  39  19 24292  1696  1444 S  0.0  0.2  0:00.00 │  │                          └─ /usr/lib/apt/methods/fil

Mas esqueci de adicionar este nice -n 19 ionice -n 7 -c 3 e corri apenas lb build . Então, tentei renice o processo pai:

# renice -n 19 -p 6187

Mas isso não substitui os outros processos. Então, parece assim:

26196 morfik        0     0     0 B4  20   0 23888   668   664 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   528   528 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  5952  1224 S  0.0  0.6  0:02.62 │  │     └─ -su
 6187 root          0     0     0 B7  39  19  4496   800   524 S  0.0  0.1  0:00.00 │  │        └─ /bin/sh /usr/lib/live/build/build
 6349 root          0     0     0 B4  20   0  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
 6351 root          0     0     0 B4  20   0  7028   592   488 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
 6350 root          0     0     0 B4  20   0  4496   828   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
 6445 root          0     0     0 B4  20   0  4496   840   548 S  0.0  0.1  0:00.00 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
 7580 root          0     0     0 B4  20   0  4496   856   552 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
 7692 root          0     0     0 B4  20   0 62924  5236  3848 S 15.5  0.5  0:03.78 │  │                       └─ aptitude --assume-yes update
 7932 root          0     0     0 B4  20   0 54776 16480 15916 R 84.1  1.6  0:16.60 │  │                          ├─ /usr/lib/apt/methods/rred
 7912 root          0     0     0 B4  20   0 24296  2036  1648 S  0.0  0.2  0:01.62 │  │                          ├─ /usr/lib/apt/methods/gzip
 7733 root          0     0     0 B4  20   0 27948  5552  1632 S  0.0  0.5  0:02.85 │  │                          ├─ /usr/lib/apt/methods/bzip2
 7711 root          0     0     0 B4  20   0 24304  1780  1436 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
 7709 root          0     0     0 B4  20   0 30800  2200  1812 S  0.0  0.2  0:01.01 │  │                          └─ /usr/lib/apt/methods/http     

Eu poderia renunciar todos os processos manualmente, mas eles estão mudando.

EDIT # 1

O seguinte comando:

# nice -n 19 ionice -n 7 -c 3 lb build

também define:

ionice - sets or gets process io scheduling class and priority. ...

-c, --class scheduling class name or number 0: none, 1: realtime, 2: best-effort, 3: idle

-n, --classdata scheduling class data 0-7 for realtime and best-effort classes

Como definir a opção -c e -n de ionice para os processos?

    
por Mikhail Morfikov 03.02.2014 / 03:39

1 resposta

8

Como todos os processos-filhos ainda fazem parte do ID da sessão ( sess in ps output), poderíamos explorar esse fato usando este comando:

$ parent=6187
$ ps -eo sess:1=,pid:1= |sed -n "s/^$parent //p"

Isso deve retornar para nós todos os IDs de processo dos processos filhos gerados a partir de lb load . Também podemos obter isso diretamente de pgrep , usando também a opção -s .

$ pgrep -s $parent

Podemos então renice deles assim:

$ renice $(pgrep -s $parent)

Exemplo

Aqui está um exemplo artificial que ilustra como isso tudo funciona. Nós começamos com um shell, "PID = 10515".

1. Confirme o ID da sessão
$ ps -j
  PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
30781 30781 10515 pts/8    00:00:00 ps
2. Trabalhos falsos

Em seguida, iniciamos alguns trabalhos falsos que nos esquecemos de renice .

$ sleep 10000 &
$ sleep 10000 &

Confirmamos que estão sob o ID de sessão do nosso shell ( SID ).

$ ps -j
  PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
31107 31107 10515 pts/8    00:00:00 sleep
31111 31111 10515 pts/8    00:00:00 sleep
31140 31140 10515 pts/8    00:00:00 ps
3. Obter PIDs associados ao SID

Podemos obter uma lista de todos os processos, cujo SID é 10515.

$ pgrep -s 10515
10515
31107
31111
4. Confirme atual agradável

Qual é o nível legal de todos atualmente? Use este comando para verificar:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 0
10515 31111 0
10515 31354 0
10515 31355 0
5. Mudar legal de todos os descendentes do SID

OK, então todo mundo está nice em 0, vamos mudar isso.

$ renice $(pgrep -s 10515)
31107 (process ID) old priority 0, new priority 19
31111 (process ID) old priority 0, new priority 19
6. Confirme

Confira nosso trabalho:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 19
10515 31111 19
10515 31426 0
10515 31427 0

PIDs 31107 & 31111 são os nossos processos de suspensão e nós apenas mudamos de forma agradável para 19 com apenas as informações sobre a qual SID eles estão associados.

7. Verifique novamente

Você também pode verificar ps output se você estiver realmente paranoico:

$ ps -eaf | grep -E "31107|31111"
saml     31107 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31111 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31531 10515  0 22:35 pts/8    00:00:00 grep --color=auto -E 31107|31111

Referências

ionice

Se você está tentando controlar a prioridade de E / S dos processos, bem como seu nível legal, você deve poder alterar o exemplo de comando acima para algo como isto:

$ renice -n 19 $(pgrep -s $parent)
$ ionice -c 3 -p $(pgrep -s $parent)

Se você observar a página do manual de ionice , não será possível misturar -c 3 com -n .

   -c, --class class
          Specify the name or number of the scheduling class to use; 0 for
         none, 1 for realtime, 2 for best-effort, 3 for idle.

   -n, --classdata level
          Specify  the  scheduling class data.  This only has an effect if 
          the class accepts an argument.  For realtime and best-effort, 0-7 
          are valid data (priority levels).
    
por 03.02.2014 / 04:41