Todo el mundo ha hablado del milagroso parche de Mike Galbraith en el mundo Linux. Incluso ha salido la alternativa (pero no equivalencia) en el userspace de Lennart Poettering.

El día de hoy, Debian GNU/Linux ha incorporado en su rama experimental (Sid) el Kernel 2.6.38 con los impactantes beneficios del parche de Mike Galbraith, que ya fué incorporado en el Upstream por la gente del Kernel Team y adaptado por los mantenedores del paquete linux-2.6 en Debian. Otra interesante característica añadida a éste kernel es la remoción del Big Kernel Lock, aumentando aún más el rendimiento del sistema en casos específicos.

¿Y cómo funciona eso del “agrupamiento por TTY”?

Bueno, para empezar… el nombre mediático que se le dió fué éste, pero es erróneo. Lo cierto del parche de Mike Galbraith es que ya las tareas no se agrupan por TTY, y que se ha implementado un nuevo método que explico a continuación.

Está claro que lo más impactante de éste release es el llamado “Parche Milagroso”, éste parche cambia sustancialmente la manera en que el Manejador de Procesos (el que determina el orden en que se van a ejecutar las tareas de sistema) asigna porcentajes de procesamiento de CPU a cada proceso. Con ésta mejora, el Manejador agrupará todos los procesos con la misma ID de Sesión para convertirlos en una misma entidad reconocible para el.

El ID de Sesión es una propiedad de los procesos en Sistemas UNIX que identifica cada “rama de procesos” dentro del árbol de procesos. Es decir, en UNIX existen procesos Líderes y procesos Hijos, todos los procesos hijos derivados de un proceso líder, comparten el mismo ID de Sesión.

Por ejemplo, listemos todos los procesos de sistema, listemos las columnas “ID de Sesión” (Procesos líderes), “ID de Proceso” (Procesos hijos) y el comando utilizado para iniciar el proceso; además, ordenemoslo por ID de Sesión:

ps -e --format session,pid,cmd --sort session

Obtendremos una salida variante, dependiendo de cada sistema, pero en el mío salió algo así (SESS=ID de Sesión; PID=ID de Proceso; CMD=Comando):

 SESS   PID CMD
    0     2 [kthreadd]
    0     3 [ksoftirqd/0]
    0     6 [migration/0]
    0     7 [migration/1]
    0     9 [ksoftirqd/1]
    0    11 [cpuset]
    0    12 [khelper]
    0    13 [netns]
    0    14 [sync_supers]
    0    15 [bdi-default]
    0    16 [kintegrityd]
    0    17 [kblockd]
    0    18 [kacpid]
    0    19 [kacpi_notify]
    0    20 [kacpi_hotplug]
    0    21 [kseriod]
    0    22 [kworker/1:1]
    0    23 [kondemand]
    0    24 [khungtaskd]
    0    25 [kswapd0]
    0    26 [ksmd]
    0    27 [fsnotify_mark]
    0    28 [aio]
    0    29 [crypto]
    0   176 [khubd]
    0   177 [ata_sff]
    0   180 [scsi_eh_0]
    0   181 [scsi_eh_1]
    0   182 [scsi_eh_2]
    0   183 [scsi_eh_3]
    0   236 [jbd2/sda2-8]
    0   237 [ext4-dio-unwrit]
    0   505 [kpsmoused]
    0   527 [cfg80211]
    0   530 [hd-audio0]
    0   763 [xfs_mru_cache]
    0   764 [xfslogd]
    0   765 [xfsdatad]
    0   766 [xfsconvertd]
    0   767 [xfsbufd/sda3]
    0   768 [xfsaild/sda3]
    0   775 [xfssyncd/sda3]
    0  1112 [kconservative]
    0  1249 [flush-8:0]
    0  7081 [kauditd]
    0  8440 [kworker/0:0]
    0  8454 [kworker/1:2]
    0  8462 [kworker/u:0]
    0  8479 [kworker/u:2]
    0  8481 [kworker/0:1]
    0  8504 [kworker/u:1]
    1     1 init [2]
  322   322 udevd --daemon
  322   419 udevd --daemon
  322   420 udevd --daemon
  978  1001 /usr/sbin/rsyslogd -c4
 1056  1056 /usr/sbin/preload -s /var/lib/preload/preload.state
 1064  1064 /usr/sbin/lpd -s
 1073  1073 /usr/bin/dbus-daemon --system
 1073  1132 /usr/sbin/modem-manager
 1073  1160 /sbin/wpa_supplicant -u -s
 1073  1499 /usr/sbin/console-kit-daemon --no-daemon
 1073  1899 /usr/lib/policykit-1/polkitd
 1073  1901 /usr/lib/upower/upowerd
 1073  7470 /usr/lib/udisks/udisks-daemon
 1073  7471 udisks-daemon: not polling any devices
 1088  1088 /usr/sbin/cron
 1092  1092 /usr/sbin/sshd
 1116  1116 /usr/sbin/NetworkManager
 1116  1162 /sbin/dhclient -d -4 -sf /usr/lib/NetworkManager/nm-dhcp-client.action -pf /var/run/dhclient-eth0.pid -lf /var/lib
 1129  1129 /usr/sbin/cupsd -C /etc/cups/cupsd.conf
 1187  1189 /usr/sbin/gdm3
 1187  1194 /usr/lib/gdm3/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1
 1187  1902 /usr/lib/gdm3/gdm-session-worker
 1187  7079 /usr/bin/gnome-keyring-daemon --daemonize --login
 1213  1213 /usr/bin/Xorg :0 -br -verbose -audit 0 -novtswitch -auth /var/run/gdm3/auth-for-Debian-gdm-P3oV7M/database -nolist
 1245  1245 /sbin/getty 38400 tty1
 1246  1246 /sbin/getty 38400 tty2
 1786  1895 /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
 7098  7098 x-session-manager
 7098  7446 /usr/bin/dbus-launch --exit-with-session x-session-manager
 7098  7451 gnome-power-manager
 7098  7464 /usr/bin/metacity
 7098  7466 gnome-panel
 7098  7477 nautilus
 7098  7485 bluetooth-applet
 7098  7486 python /usr/bin/system-config-printer-applet
 7098  7487 /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
 7098  7489 nm-applet --sm-disable
 7098  7490 /usr/lib/evolution/2.30/evolution-alarm-notify
 7098  7491 /usr/lib/gnome-disk-utility/gdu-notification-daemon
 7098  7528 /usr/bin/python /usr/bin/turpial
 7098  7805 /usr/lib/cunaguaro/firefox-bin
 7098  7820 /bin/sh /usr/lib/guacharo/run-mozilla.sh /usr/lib/guacharo/guacharo-bin
 7098  7840 /usr/lib/guacharo/guacharo-bin
 7098  8157 /usr/lib/xulrunner-1.9.2/plugin-container /usr/lib/flashplugin-nonfree/libflashplayer.so 7805 plugin
 7098  8471 gnome-terminal
 7098  8472 gnome-pty-helper
 7443  7443 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-manager
 7447  7447 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
 7447  7450 /usr/lib/libgconf2-4/gconfd-2
 7447  7461 /usr/lib/gvfs/gvfsd
 7447  7468 /usr/lib/gvfs/gvfs-gdu-volume-monitor
 7447  7473 /usr/lib/gvfs/gvfs-afc-volume-monitor
 7447  7476 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
 7447  7506 /usr/lib/gvfs/gvfsd-trash --spawner :1.8 /org/gtk/gvfs/exec_spaw/0
 7447  7515 /usr/lib/gvfs/gvfsd-burn --spawner :1.8 /org/gtk/gvfs/exec_spaw/1
 7447  7526 /usr/lib/gvfs/gvfsd-metadata
 7447  8253 /usr/lib/gvfs/gvfsd-http --spawner :1.8 /org/gtk/gvfs/exec_spaw/2
 7459  7459 /usr/lib/gnome-settings-daemon/gnome-settings-daemon
 7479  7479 /usr/lib/bonobo-activation/bonobo-activation-server --ac-activate --ior-output-fd=18
 7479  7499 /usr/lib/gnome-applets/cpufreq-applet --oaf-activate-iid=OAFIID:GNOME_CPUFreqApplet_Factory --oaf-ior-fd=18
 7479  7501 /usr/lib/gnome-applets/mixer_applet2 --oaf-activate-iid=OAFIID:GNOME_MixerApplet_Factory --oaf-ior-fd=24
 7507  7507 gnome-screensaver
 8297  8297 [gnome-open]
 8473  8473 bash
 8473  8507 ps -e --format session,pid,cmd --sort session

Como ven, existen muchos procesos que comparten el mismo ID de sesión, y que con el kernel 2.6.38 ya no serán manejados como procesos independientes sino como procesos agrupados, mejorando aún más la latencia del sistema.

¿Cómo lo pongo en funcionamiento en mi pc?

Abre el archivo /etc/apt/sources.list con tu editor de textos preferido (con permisos de root) y modifícalo de forma tal que te asegures que sólo queden las fuentes binarias de Sid, listadas más abajo:

deb http://http.us.debian.org/debian sid main contrib non-free

Si estás en Venezuela, puedes usar el mirror Debian de Canaima GNU/Linux que es más rápido:

deb http://universo.canaima.softwarelibre.gob.ve/ sid main contrib non-free

Luego ejecuta los siguientes comandos:

aptitude update
aptitude install linux-image-2.6.38-1-686

Listo, con ésto quedará instalado.

Sin embargo, no hemos terminado. Revisando el changelog del kernel, me doy cuenta que el comportamiento no está activado por defecto debido a un bug, hay que activarlo mediante la variable sysctl kernel.sched_autogroup_enabled. Para hacerlo sólo hay que agregar la siguiente línea al final del archivo /etc/sysctl.conf y reiniciar el sistema (ésto hay que hacerlo sólo una vez).

kernel.sched_autogroup_enabled=1

Recuerda reiniciar el sistema con el nuevo kernel para ver el agrupamiento por SESSIONID en acción.

Gracias a ésta nueva mejora, seguramente podrás ejecutar muchos más procesos simultáneamente sin experimentar un detrimento en el rendimiento del sistema… Te invito a que lo pruebes y me cuentes por acá como te fué!