lunes, noviembre 13, 2006

Optimizar el rendimiento de una Máquina Virtual

Yo sigo con mis tejemanejes en relación a las máquinas virtuales, intentando sacarles el mayor rendimiento.

Como en mi máquina tengo Windows XP x64 en un principio me vi obligado a trabajar con el Virtual Server 2005 R2, luego pasé a la beta del SP1, y cuando salió el Virtual PC 2007 Beta, cambié a éste. Y ahora he vuelto de nuevo al Virtual Server R2 SP1 beta, que en mi opinión de beta tiene poco pues funciona inmejorablemente.

Y todo por el tema del rendimiento. He preguntado y leído montones de documentos, y según de qué lado estuvieran, he recibido informaciones contradictorias y en general completamente incorrectas, sobre todo cuando dejaban de comentar las cosas evidentes. Y también entre toda la paja existente he encontrado la aguja (gracias, Tella).

Al final todo queda resumido en tres reglas básicas:
  1. Quita todos los elementos gráficos accesorios. Vete a Mi PC, Propiedades, Rendimiento, y selecciona "Ajustar para mejor rendimiento". Desaparecerán todas las patochadas gráficas y quedará un sistema sobrio.
  2. Los discos virtuales han de estar situados fuera de los discos duros en los que se encuentre la partición de arranque y de paginación, y si puede ser, en discos duros situados en una controladora aparte o, mejor, RAID. Ojo, estoy hablando de discos duros físicos, no particiones.
  3. Los discos duros virtuales han de ser de tamaño fijo, con la controladora SCSI de la máquina virtual, y el fichero debe estar desfragmentado desde el ordenador anfitrión. Nada de compresiones ni chorradas de esas.

Con estas tres reglas de oro podemos aumentar significativamente el rendimiento de una máquina virtual.

1.- Eliminar todos elementos gráficos accesorios. El punto 1 es evidente por sí mismo, cuantas menos chorradas, más rendimiento.

2.- Discos virtuales en otro disco físico y/o controladora. Este también es casi evidente por sí mismo. Una máquina virtual genera un tráfico bastante intenso en su disco duro virtual, sobre todo de lectura. Si sumamos ese tráfico al que genera el propio sistema operativo, el rendimiento cae en picado.

El rendimiento mejora cuando el disco duro virtual se coloca en un disco duro aparte, porque dividimos entre dos el tráfico de datos sobre una unidad, de modo que las cabezas de lectura/escritura se han de mover en menor medida. Si el disco duro está en el mismo cable, la mejora no es muy sustancial porque todavía es necesario que un disco duro espere al otro, o mejor dicho, el sistema debe acceder primero a un disco y luego al otro.

Separando entre cables las dos partes interesadas volvemos a ganar algo más de rendimiento, pues ahora el acceso a ambos discos duros puede resultar casi simultáneo, y si a su vez dichas partes están separadas entre controladoras, mejor todavía, pues ahora el acceso sí que es completamente independiente, puesto que mientras el sistema accede a una controladora, la otra está trabajando.

Podemos todavía mejorar más el rendimiento si colocamos los ficheros de los discos duros virtuales en sistemas RAID en los que se utilicen varios discos duros simultáneamente para repartir la información.

Otra consideración a tener en cuenta es la cantidad de máquinas virtuales que vamos a tener lanzadas simultáneamente. Si podemos, cada disco duro virtual de cada máquina simultánea, ha de estar situado en diferentes discos físicos, para aumentar el rendimiento.

No vale mencionar el hecho de colocar cada cosa en varias particiones de un mismo disco duro físico, puesto que ahora estamos disminuyendo todavía más el rendimiento, pues obligamos a los cabezales a ir de un lado a otro alternativamente. Si no tienes la posibilidad de tener varios discos físicos, lo mejor es dejarlo todo en la misma partición y desfragmentar muy regularmente.

Ya por último, la controladora virtual SCSI de Microsoft tiene un desempeño mucho mejor que la IDE; ignoro el motivo, puesto que al final, el fichero que representa el disco duro virtual tiene exactamente el mismo formato en ambos casos, pero está lo sufientemente contrastado que la controladora SCSI es mucho más rápida que la IDE... De ahí mi vuelta al Virtual Server.

3.- Discos de tamaño fijo sin comprimir. Este quizás sea el tema más controvertido de todos, y el más difícil de explicar, por lo que iremos por partes.

3.1.- Discos de expansión dinámica frente a fijos. Un disco de tamaño fijo queda representado como un archivo de tamaño fijo en el sistema operativo anfitrión; esto significa que una vez desfragmentado desde fuera, todas las escrituras que se hagan desde dentro de la máquina virtual no van a afectar al rendimineto, puesto que al tener el tamaño total, cuando desde dentro se intente escribir en un espacio nuevo, ese espacio ya estará presente en el archivo, de forma que, externamente, no hay ningún cambio si no es la reescritura de un sector físico que antes contenía ceros por los nuevos valores.

Este funcionamiento no fragmenta un archivo. Es decir, escribir en una parte ya existente de una archivo no cambia su fragmentación, ésta sólo cambia si cambia el tamaño del mismo, aunque generalmente sólo si se incrementa.

Otra ventaja de un archivo de tamaño fijo desfragmentado consiste en que todo el espacio está contiguo, de modo que la escritura de un grupo de sectores es mucho más rápida que si se precisa que las cabezas vayan de un lado para otro, ya que aquí el tiempo de escritura es el mismo, lo que varía es el tiempo de seek o posicionamiento.

Un archivo dinámico tiene la contrapartida del aumento de la fragmentación, tanto externa como interna. La representación física del disco duro dentro de un archivo estático es lineal, de cero al tamaño total; la representación en uno dinámico es relativa, tan sólo existen los sectores escritos alguna vez. Cuando el sistema operativo virtual necesita un nuevo sector, ése se graba a acontinuación de los ya existentes.

Esto genera una doble fragmentación, la interna que consiste en que los sectores podrían estar desordenados con la consecuente pérdida de tiempo en su búsqueda, y la externa, porque el archivo crece y podría no existir tamaño contiguo suficiente, fragmentando el mismo.

La ventaja real de archivo estático frente al dinámico consiste tan solo en el nivel de fragmentación, que en el caso de unos pocos accesos es insignificante, pero que en accesos continuados puede llegar a reperesentar una mejora drástica, superior incluso a la de un ordenador real.

Son los tiempos de movimientos de cabezales de lectura/escritura los que determinan en todo momento el rendimiento. La cantidad de información a leer o escribir es la misma, pero si los datos están más cerca unos de otros, el tiempo es menor. Y el comportamiento se puede ver a simple vista, con los discos para deshacer.

Pon a tu máquina virtual ese tipo de discos y compara el rendimiento (y el ruido que emite el disco duro). Ahora podemos comprobar prácticamente los efectos de la fragmentación. En este caso tenemos dos ficheros diferentes, generalmente muy separado uno de otro físicamente...

3.2.- Discos comprimidos frente a discos sin comprimr. Esta es quizás la explicación más difícil de todas, así que vamos a hacerlo mediante un ejemplo.

Imaginemos que tenemos una máquina virtual almacenada en un disco virtual de tamaño fijo pero que está comprimido por fuera (es decir, es el archivo el que está comprimido, no la partición interna de la máquina virtual).

Ahora supongamos que estamos realizando una operación dentro del sistema operativo virtual, algo que determine que un fichero existente cambie de tamaño y a una tasa de compresión menor. Dentro del sistema operativo virtual, el nuevo fichero se alojará sobre el anterior, y nada más.

Pero fuera ocurrirán extraños efectos. Un pedazo del fichero que antes ocupaba, por poner un ejemplo, 4K, pasa ahora a ocupar 5k, con lo que aumentamos un sector más. ¿Cómo responde a esto el sistema? Pues la solución más sencilla es insertar un sector nuevo, cosa nada trivial cuando se trata de un fichero grande.

El sistema operativo podría mover todo el fichero, desde el final hacia atrás hasta hacerle hueco. Imagina que el ordenador tiene que mover un fichero de dos gigabytes...

Pero no es así como ocurre realmente. Lo que ocurre es que el archivo se fragmenta. Un archivo que antes estaba de una pieza, ahora está partido en tres. La primera llega hasta el sector modificado, la segunda es el sector añadido (en general lejos del archivo original, sobre todo si hay muchos de gran tamaño, como suele ser habitual en particiones que contienen máquinas virtuales) y la tercera el resto del fichero.

Imaginemos ahora la operación contraria, que un archivo en la máquina virtual ocupe menos espacio que antes. Ahora, lo que tenemos en el archivo externo es un hueco, que las cabezas deben saltar...

Ahora repitamos el procedimiento un rato. ¿Qué nos queda? Un sistema enormenente fragmentado, el más fragmentado de todos, más fragmentado todavía si la máquina virtual está en un archivo fijo.

Sólo nos queda determinar qué ocurre con el sistema operativo virtual comprimido en un archivo fijo. Aquí el autor considera que podría obtenerse alguna mejora en el rendimiento, ya que el tiempo de proceso de comprimir es menor que el de escribir la parte no comprimida, pero prácticamente no ha encontrado diferencia significativa, quizás porque el tiempo de compresión sea más o menos igual al del ahorro en la escritura, al menos en su máquina.

1 comentario:

Anónimo dijo...

MUy buena tu aportacion sobre las maquinas virtuales, posiblemnte hay mucha gente que sea nueva en este tema, tus consejos nos ayudaran a encontrar una mejor utilidad a estas herramientas

Gracias y un saludo.

Carlos.