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!