martes, 11 de abril de 2017

LINUX-optimizar la ejecución de procesos: setear (nice) o cambiar (renice) la prioridad de un proceso en ejecución

Niceness (Nice value ) y Priority 

Priority se refiere a la prioridad actual con la que un proceso se ejecuta en el espacio de la CPU asignado al kernel. Mientras que Nice Value o Niceness es lo correspondiente al espacio de la CPU asignado al usuario. 
En linux el rango de valores asignado de kernel space para prioridades es 0 hasta 139, mientras que para el niceness o user space es desde -20 (más alto), hasta el +19 (más bajo). Siendo el valor 0 el asignado por default.  

la relación entre priority y niceness es:

PR = 20 + NI

Cómo obtener el valor de la prioridad de un proceso en ejecución. 

Poner atención a las siguiente columnas
PR: 20
NI: 0
Cuando NI es 0 (default), el valor de PR es 20 (default)
root@centOS-testing02 ~]# dd if=/dev/zero of=/dev/null &
[1] 1578
[root@centOS-testing02 ~]# top

top - 14:32:10 up 4 min,  2 users,  load average: 0.16, 0.06, 0.01
Tasks: 101 total,   2 running,  99 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.4%us,  7.5%sy,  0.0%ni, 90.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020380k total,   137708k used,   882672k free,     6884k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39384k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                1578 root      20   0  102m  708  588 R 99.7  0.1   0:11.20 dd                                                                                              
[root@centOS-testing02 ~]# ps -o pid,comm,nice -p 1578
  PID COMMAND          NI
 1584 dd                0
[root@centOS-testing02 ~]# 


Cómo cambiar la prioridad de un proceso en ejecución. 

El comando para modificar la prioridad de un proceso en ejecución es renice

[root@centOS-testing02 ~]# renice -n -10 -p 1578
1578: old priority 0, new priority -10
[root@centOS-testing02 ~]# ps -o pid,comm,nice -p 1578
  PID COMMAND          NI
 1578 dd              -10
[root@centOS-testing02 ~]# 

Observar qué ocurre con los valores de las columnas PR y NI.
columna PR indica que la prioridad del proceso asciende de 20 a 10
columna NI indica que el niceness desciende de 0 a -10

top - 15:15:09 up 3 min,  3 users,  load average: 0.65, 0.24, 0.09
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.0%us, 75.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020540k total,   137228k used,   883312k free,     6900k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39124k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND              1578 root      20   0  102m  708  588 R 99.7  0.1   0:59.04 dd                                     
top - 15:15:12 up 3 min,  3 users,  load average: 0.68, 0.26, 0.09
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 21.9%us, 75.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  3.1%hi,  0.0%si,  0.0%st
Mem:   1020540k total,   137228k used,   883312k free,     6912k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39132k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                1578 root      10 -10  102m  708  588 R 99.9  0.1   1:02.05 dd    

Volvemos a asignar una nueva prioridad. Esta vez más alta (-19)

[root@centOS-testing02 ~]# renice -n -19 -p 1578
1578: old priority -10, new priority -19
[root@centOS-testing02 ~]# ps -o pid,comm,nice -p 1578
  PID COMMAND          NI
 1578 dd              -19
[root@centOS-testing02 ~]# 

Observamos cómo cambian las columnas PR y NI.
columna PR indica que la prioridad del proceso asciende de 10 a 1
columna NI indica que el niceness desciende de -10 a -19

top - 15:34:41 up 23 min,  3 users,  load average: 1.00, 0.97, 0.71
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 21.2%us, 72.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  3.0%hi,  3.0%si,  0.0%st
Mem:   1020540k total,   137628k used,   882912k free,     7124k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39248k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                
 1578 root      10 -10  102m  708  588 R 99.9  0.1  20:30.69 dd                                     


top - 15:34:44 up 23 min,  3 users,  load average: 1.00, 0.97, 0.71
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 24.2%us, 72.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  3.0%hi,  0.0%si,  0.0%st
Mem:   1020540k total,   137628k used,   882912k free,     7124k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39248k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                
 1578 root       1 -19  102m  708  588 R 99.7  0.1  20:33.69 dd  


Cómo setear la prioridad antes de lanzar un proceso. 

[root@centOS-testing02 ~]# nice -n 19 dd if=/dev/zero of=/dev/null &
[1] 1604
[root@centOS-testing02 ~]# ps -o pid,comm,nice -p 1604
  PID COMMAND          NI
 1604 dd               19
[root@centOS-testing02 ~]# 

Observamos los valores que muestran las columnas PR y NI.
columna PR indica que la prioridad del proceso comienza con 39
columna NI indica que el niceness es de 19

[root@centOS-testing02 ~]# top -b -p 1604
top - 15:58:13 up 46 min,  3 users,  load average: 0.69, 0.90, 0.88
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s): 14.8%us, 47.3%sy,  0.1%ni, 35.2%id,  2.3%wa,  0.2%hi,  0.0%si,  0.0%st
Mem:   1020540k total,   137752k used,   882788k free,     7348k buffers
Swap:  1048568k total,        0k used,  1048568k free,    39276k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                
 1604 root      39  19  102m  704  588 R 99.9  0.1   0:14.93 dd                                     

Esto es debido a que por default la prioridad de un proceso es 20 y el niceness es 0

Cómo definir de antemano la prioridad que un usuario puede entregar a un proceso al ejecutarlo. 

Para modificar la prioridad por default es necesario setear el niceness. El comportamiento de ambos params es el siguiente:
A mayor valor de niceness, Es menos prioritario 
A menor valor de niceness, Es más prioritario. 

Para setear la niceness por default que pueden tener todos los procesos que ejecute un determinado usuario dentro del server, se debe inscribir a través del archivo de confoguración limits.conf
Dentro de este archivo se describe el formato para la inscripción, el cual es de la siguiente forma:

[username] [hard|soft] priority [nice value]

En el siguiente ejemplo, vamos a darle menor prioridad a todos los procesos que ejecute el usuario "user3". Para ello seteamos el niceness con un valor de 5, y con esto la prioridad por default en sus procesos es de 25. 

[root@centOS-testing02 ~]# grep user3 /etc/security/limits.conf 
user3 hard priority 5
[root@centOS-testing02 ~]# 

con el usuario "user3" se ejecuta el proceso y se verifica la prioridad y el niceness
bash-4.1$ dd if=/dev/zero of=/dev/null &
[1] 1786
bash-4.1$ top -b -p 1786
top - 10:11:52 up 25 min,  3 users,  load average: 0.18, 0.05, 0.02
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 98.7%id,  1.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020540k total,   145380k used,   875160k free,     8416k buffers
Swap:  1048568k total,        0k used,  1048568k free,    40800k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                
 1786 user3     25   5  102m  700  580 R 99.7  0.1   0:11.25 dd                                     
^C
bash-4.1$ 
[root@centOS-testing02 ~]# ps -o pid,comm,nice -p 1786
  PID COMMAND          NI
 1786 dd                5
[root@centOS-testing02 ~]# 

Fuentes

No hay comentarios:

Publicar un comentario