virtualisation

warning: Creating default object from empty value in /home/ivan/vc/git/elvil-drupal/drupal/sites/all/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc on line 34.

UML ràpid com el llamp!

Preparant una màquina virtual amb User Mode Linux (UML) per al taller de seguretat de l'altre dia va ocórrer-me una cosa ben estranya: vaig crear un ordinador virtual ultra-ràpid! Mireu si no l'eixida d'aquesta ordre (damocles és la màquina virtual):

ivan@damocles:~$ time sleep 60

real    0m7.565s
user    0m0.000s
sys     0m0.490s
ivan@damocles:~$

Uau! Un ordinador que fa una espera d'un minut en set segons i mig! No és genial?

Doncs no, no ho és. Proveu a fer una connexió per SSH o IMAP a una màquina així. Abans de que tingueu temps d'entrar la contrasenya, el servidor diu que la connexió ja ha expirat! O sou Billy «dits ràpids» o no hi ha forma d'entrar.

Ja havia llegit la frase de Linus Torvalds dient que Linux és tan ràpid que completa un bucle infinit en 10 segons, però no em va semblar que fora el cas. Després de quasi un dia de trencar-me les banyes amb el portàtil i la màquina virtual, una sospita («idea feliç», que diuen els matemàtics) s'apoderà de mi. Així que vaig consultar les caràctiques de la CPU de tardis, la màquina amfitriona:

ivan[LX]tardis:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Pentium(R) 4 CPU 2.53GHz
stepping        : 7
cpu MHz         : 315.495
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce [...]
bogomips        : 4997.12

ivan[LX]tardis:~$

CPU de 2.5 GHz funcionant a 315 MHz (gràcies a CPUFreq i PowerNowd) per a estalviar bateria. Sense novetat en el front. Però, ostres, i si UML usa la freqüència en Hz de la CPU amfitriona per a saber quants tics de rellotge dura un segon? Si així fora, l'acceleració hauria de ser proporcional a la disminució de freqüència. Així que vaig posar el portàtil a la freqüència màxima i torní a llençar la UML i l'ordre anterior:

ivan@damocles:~$ time sleep 60

real    1m0.116s
user    0m0.030s
sys     0m0.060s
ivan@damocles:~$

Ei, això és un minut! Bé, el meu ordinador virtual torna a respectar les lleis de l'espai-temps. Prenguem nota de la freqüència de la CPU amfitriona:

ivan[LX]tardis:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Pentium(R) 4 CPU 2.53GHz
stepping        : 7
cpu MHz         : 2523.968
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce [...]
bogomips        : 4997.12

ivan[LX]tardis:~$

Es compleix la proporcionalitat? D'una banda tenim una acceleració de 2523.968 MHz / 315.495 MHz = 8, val. I d'altra banda, 60.116 s / 7.565 s = 7.95, voilà!

En efecte, és necessari posar la màquina amfitriona a la freqüència màxima (on un segon dura un segon, per dir-ho així) per a llençar-hi una màquina UML. Fixeu-vos en que és un poc desconcertant veure com la mateixa màquina UML amb la mateixa configuració en l'amfitriona funciona en un ordinador de sobretaula, però no en un de portàtil. Em sembla que posaré una nota al respecte en la guia UML+debootstrap.

Companys, què perversa és la informàtica!