Kernel Linux y renice/ionice

Ricardo Albarracin B. ralbab en gmail.com
Mar Feb 1 17:48:04 CLST 2011


El Tue, 1 Feb 2011 17:16:19 -0300
Daniel Serpell <dserpell en gmail.com> escribió:
> ¡Hola!

Estimado amigo... un gusto como siempre..

> Lo que más te conviene aquí es cambiar la clase de schedulling del
> programa, pasar de la clase estándar a la clase round-robin. Esto
> garantiza que tu aplicación va a recibir CPU cada cierto tiempo por
> lo menos.

Perfecto... es la idea.
 
> Para hacerlo, basta con utilizar la llamada sched_setscheduler(), ve
> en su página de manual. En nuestro caso, agregamos esto:
> 
>  void set_priority()
>  {
>      struct sched_param sp;
>      sp.sched_priority = 10;
>      sched_setscheduler(0, SCHED_RR, &sp);
>  }

bien... 

> Todas las tareas en round-robin tienen más prioridad que las tareas
> estándares, esto significa que si usas el 100% de CPU, nada más se
> ejecutará en tu computador. Esto no es un problema si la aplicación
> sólo recibe datos, ya que debería realizar la recepción y luego volver
> a esperar más datos.

Perfecto, esto me resolvería el overflow de los buffers.

> El problema ahora es que no quieres que la aplicación tenga permisos
> de super-usuario.

Es la idea final... pero para probar no me complica que lo haga
momentáneamente.

>                    Si usas Linux mayor a 2.6.12, la solución es
> cambiar el límite de prioridad permitida de los procesos por medio de
> la capacidad "RLIMIT_RTPRIO" usando setrlimit. Esto se hace con el
> siguiente pseudocódigo:
> 
>  // Programa ejecutado con UID=0, cambia los límites
>  setrlimit(...);
>  if(!fork())
>  {
>   // Cambia a usuario 1000 (por ejemplo)
>   setuid(1000);
>   // Ejecuta el programa
>   execve(....);
>  }
>  // Termina.
>  exit(0);

Ok... se ve simple el cambio.

> Obviamente, con manejo de errores, etc. Lamentablemente el programa
> "padre" debe todavía ser root, esto es difícil de evitar, ya que de
> alguna manera se tiene que dar el permiso.

cierto... 

> Nota que en versiones de Linux mayores a 2.6.25 puedes también fijar
> el límite "RLIMIT_RTTIME", el cual limita el total de tiempo que un
> proceso de prioridad RT puede utilizar de una sola vez. Esto sirve
> para impedir que un proceso RT use el 100% de CPU y haga que el resto
> del sistema no responda. Ve en el manual de "setrlimit".

Ok...

> Por último, si insistes en que el proceso inicial (que fija los
> límites) no sea ejecutado como root, puedes utilizar el sistema de
> capacidades de Linux, ve capabilities(7), con énfasis en la sección
> llamada "File Capabilities". La gracia es que, si usas un sistema
> de archivos que lo soporte, puedes asignar a un ejecutable la
> capacidad "CAP_SYS_NICE", usando "setcap cap_sys_nice+p programa".
> Lee bien, eso si, lo que esto permite al proceso.

ok... quedé con bastante pega por delante :-)

> Lamentablemente, en UBIFS que usamos aquí no hay soporte para
> capabilities.

Ok... pero en definitiva no es tan grave por el momento, el primero
objetivo a lograr es evitar el problema de perdida de datos en máquinas
pequeñas.... luego veremos los temas de seguridad y escalamiento de
privilegios.
 
>     Daniel.

Gracias estimado amigo por tus comentarios, han sido de mucha utilidad,
siempre un gusto compartir experiencias.

-- 
Atentamente.
+-----------------------+-------------------------+
| Ricardo Albarracin B. | email: ralbab en gmail.com |
+-----------------------+-------------------------+


Más información sobre la lista de distribución Linux