
Este documento esta dedicado a uno de los integrantes mas viejos del LUG de Zona Norte, Petato.
Es increíble como avanza la tecnología. Hoy en día podemos tener al alcance de nuestro bolsillo procesadores de pontencia increíble. Es muy común que se vendan equipos con procesadores dual core tanto de AMD como Intel a precios accesibles.
Lo que todos creen es que al tener un procesador con semejante potencia y mucha memoria RAM soluciona las cosas.
En realidad si no tenemos un sistema operativo con capacidades reales de multiprocesamiento no lo vamos a poder aprovechar.
Esto existe hace mucho tiempo en cualquier *nix, inclusive en nuestro amigo Linux.
Veamos un poco de teoría primero:
Afinidad:
Cuando un sistema operativo detecta mas de un procesador/CPU/
core, habilita el soporte para multiprocesador. Si hay mas de un trabajo o hilo que esta preparado para ser procesado, se le asigna la máxima prioridad al procesador que este listo para trabajar.
Este es un proceso dinámico que se produce sin intervención del usuario. El sistema operativo asume que cada procesador tienen iguales capacidades, de allí el nombre SMP (Symmetric Multi-Processing) o multiprocesamiento simétrico.
Asignación de tareas por afinidad de CPU:
Los sistemas operativos con capacidades SMP tienen opciones para planificar los procesos: un nuevo o nuevo proceso replanificado puede correr en cualquier CPU que este disponible. Sin embargo,no importa donde un proceso se encuentre corriendo, este debe seguir corriendo sobre el procesador asignado simplemente porque puede estar cacheando datos pertenecientes al mismo.
Por eso los algoritmos de planificación prestan atención a la afinidad de CPU y tratan de mantenerlo constante.
Ahora bien, el planificador de linux es muy bueno realizando esta tarea y en condiciones normales no debería preocuparnos.
Pero puede suceder que los resultados no sean los deseados y necesitemos tocar de alguna manera la asignación de procesos a los diferentes cores o CPUs.
Casos en los que necesitemos tocar el planificador:
-Aplicaciones que no fueron diseñadas para correr en sistemas SMP
-Aplicaciones que tiene restricciones por temas de licenciamiento que impiden su ejecución en mas de una CPU.
-Mejorar el balanceo de carga entre cores/CPUs
Como saber si nuestro sistema esta preparado?
1- verificar cuantos cores o procesadores tiene nuestro sistema
Ejemplo:
grep -i core /proc/cpuinfo
la salida debería ser algo así:
model name : Dual Core AMD Opteron(tm) Processor 170
core id : 0
cpu cores : 2
model name : Dual Core AMD Opteron(tm) Processor 170
core id : 1
cpu cores : 2
2- Verificar que el kernel de nuestro sistema tenga capacidad SMP
uname -r
2.6.15-23-686-smp
3- ver las estadísticas de la CPU
Con el comando TOP y luego pulsando la tecla 1 vemos las estadísticas de los cores disponibles.
Rendimiento:
Puede que veamos activo las capacidades SMP pero notemos que el rendimiento general es bajo y que los cores trabajen todo el tiempo en baja prioridad. Sobre todo este problema puede darse en notebooks.
Un tip para mejorar dicho rendimiento es el siguiente:
instalar el paquete sysfsutils
Luego editar /etc/sysfs.conf y agregar estas dos lineas:
devices/system/cpu/cpu0/cpufreq/scaling_governor=ondemand
devices/system/cpu/cpu1/cpufreq/scaling_governor=ondemand
cpux serán n CPUs dependiendo del tipo de sistema que tengamos. Para el ejemplo es un dual core.
Luego debemos deshabilitar del inicio el demonio powernowd y volver a arrancar el sistema.
Otro tip para los que utilicen Ubuntu es habilitar la capacidad de arranque concurrente.
Para ello editamos /etc/init.d/rc y buscamos dentro del archivo hasta encontrar lo siguiente:
CONCURRENCY=none
y lo cambiamos a:
CONCURRENCY=shell
Luego volvemos a arrancar el sistema para que se apliquen los cambios.
Manejando el planificador a nuestro antojo:
Una vez que tenemos todo preparado solamente nos falta instalar un paquete mas que en la mayoría de las distros se denomina schedutils.
En este paquete se incluyen dos útiles herramientas: taskset y chrt.
Taskset se encarga de manipular la afinidad por CPU (seteandolo, trayendo información sobre este y ejecutando una nueva tarea con una mascara de afinidad inicial).
chrt se encarga de manipular el planificador de prioridades y políticas (también seteandolo, trayendo información sobre este y ejecutando una tarea con una prioridad y política dada).
Veamos un par de ejemplos:
Supongamos que queremos realizar una copia a través de ssh y queremos asignar dicha tarea al primer procesador o core ejecutamos el siguiente comando:
taskset -c 0 scp root@servidor:/backup.tar
Somos los clásicos jugones y queremos ejecutar el unrealtornament 2003 en el segundo procesador o core, lo haríamos de la siguiente manera:
taskset -c 1 ut2003
pueden también averiguar la afinidad de CPU de un proceso de la siguiente manera:
taskset -p [pid]
taskset tiene muchas mas opciones, lean el manpage correspondiente:
man taskset
Si queremos ver los atributos de tiempo real de un determinado proceso debemos correr lo siguiente:
chrt -p [pid]
Consulten tambien para mayor información el manpage correspondiente:
man chrt
Como podrán ver podemos aprovechar al máximo las capacidades SMP de hardware actual y manejarlo a nuestro antojo.
Un motivo mas que pone a Linux por encima de otros.
ESTE TEXTO SE PUBLICA BAJO LICENCIA CREATIVE COMMONS BY-NC-SA 2.5 AR.

Por lo tanto, usted es libre de: 1) Copiarlo, distribuirlo y exhibirlo. 2) Hacer obras derivadas. Bajo las siguientes condiciones: 1) Debe dar atribución mencionando el nombre del autor y del LUG Zona Norte. En caso de las notas que no llevan firma, mencionar sólo el nombre del LUG.
2) Usted no puede usar esta obra con fines comerciales. 3) Si usted altera, transforma, o crea sobre este texto, sólo podrá distribuir la obra derivada resultante bajo una licencia idéntica a ésta.
Más detalles y texto legal de la licencia en: http://creativecommons.org/licenses/by-nc-sa/2.5/ar
#1 by Gez on 15/04/2007 - 13:34
Interesantísimo.
Justo en estos días me está llegando mi nuevo equipo con procesador de doble núcleo, así que veo que le voy a poder sacar el jugo.
Mi intención es dejar sólo linux (Ubuntu, en mi caso) y correr windows virtualizado para las 2 aplicaciones que necesito y que hasta ahora me forzaron al booteo dual.
La idea es investigar la virtualización por kernel y aprovechar el nuevo seamless desktop para tener las aplicaciones virtualizadas integradas al escritorio de gnome en lugar de tener que entrar en el escritorio de Windows.
De esta forma que mostrás acá se podría forzar un núcleo para el trabajo de las aplicaciones virtualizadas y de esa forma tener un rendimiento parejo en el sistema completo?
Pregunto porque ahora con un Ahtlon 2600 virtualizando con Virtualbox, cuando estoy corriendo el sistema operativo virtualizado el sistema anfitrión se vuelve lentísimo. Estimo que esto con el procesador de doble núcleo mejorará bastante.
Pero mi pregunta es si conviene en este caso forzar la separación de los núcleos o dejar que el planificador de Ubuntu se encargue.
Aclaro que soy un usuario intermedio, no uno avanzado.
#2 by sechole on 16/04/2007 - 1:22
Gez, si tu proxima maquina va a venir con procesador doble nucleo y esta preparado para virtualizar (o sea contiene la extension correspondiente Intel VT or AMD-V) por supuesto que vas a obtener un mejor rendimiento. Si virtualizas con KVM te acercarias practicamente a la velocidad de la maquina real.
Antes de salir a comprar tu maquina te recomiendo elegir el procesador correcto de esta lista:
http://wiki.xensource.com/xenwiki/HVM_Compatible_Processors
Si lo haces seria interesante que tomaras los valores que arroja TOP tanto dejando que el kernel decida como utilizar los núcleos como también forzándolo a que utilice uno determinado.
Tambien podes usar mpstat para ver como se comportan ambos núcleos, esta aplicación esta dentro del paquete systat.
Comparando ambos resultados podes sacar las diferencias.
Manteneme al tanto cuando hagas el experimento.
La verdad no veo la hora de tener un equipo con estas capacidades para experimentar.
Saludos