Receta: Optimización de las unidades de disco (Guadalinex 2004)
De Guadapedia, la enciclopedia libre.
| Tabla de contenidos |
Introducción
El acceso a disco es una de las operaciones más lentas que realiza un sistema operativo y, del tiempo que se emplee, depende en gran medida las prestaciones globales. Habitualmente los ordenadores utilizados en entornos domésticos y de oficina incorporan discos duros y unidades de CD-ROM con tecnología IDE.
Existe gran variedad de fabricantes y tecnologías asociadas a los dispositivos IDE y, por este motivo, es complicado crear una configuración de rendimiento óptimo que funcione en todas las máquinas. Por esta razón, habitualmente Linux viene configurado con una configuración por defecto que funciona correctamente en todos los ordenadores pero que dista mucho de ser óptima. En este documento vamos a estudiar las opciones disponibles para aumentar el rendimiento de las unidades de disco.
Advertencia
La gran variedad de fabricantes y discos disponibles hace imposible asegurar que una configuración va a funcionar adecuadamente en una máquina. Se da la circunstancia de que, en algunos dispositivos, el uso de determinadas opciones de optimización provocan un funcionamiento erróneo y, excepcionalmente, la pérdida de información.
Por este motivo se recomienda encarecidamente que se realice una copia de seguridad de la información contenida en el disco que queremos aumentar el rendimiento. En cualquier caso, las opciones de configuración funcionan en la gran mayoría de los ordenadores y la pérdida de datos es una circunstancia bastante excepcional.
Nomenclatura
Es importante conocer la nomenclatura que utiliza el sistema operativo Linux para nombrar las unidades de disco. Las unidades IDE son identificadas por el sistema como hdX donde la X es una letra que comienza desde la 'a' y distingue los dispositivos entre sí.
En la siguiente tabla podemos ver las unidades de discos más habituales en un ordenador doméstico.
| Unidad | Nombre en Linux |
| Disco principal (Master), Canal IDE 0 | hda |
| Disco esclavo (Slave), Canal IDE 0 | hdb |
| Disco principal (Master), Canal IDE 1 | hdc |
| Disco esclavo (Slave), Canal IDE 1 | hdd |
Linux representa mediante un fichero cualquier dispositivo existente en la máquina y los almacena en el directorio /dev. Por la tanto, el fichero que representa el primer disco duro conectado al sistema es /dev/hda, el segundo será /dev/hdb y así sucesivamente.
Hdparm
La utilidad que usaremos para optimizar el acceso a las unidades se denomina 'hdparm'. Ésta es una aplicación muy común en todos los sistemas Linux y se incluye por defecto en Guadalinex. Todas las operaciones que se van a realizar requieren privilegios de superusuario.
Prueba de velocidad
En primer lugar realizaremos una prueba de velocidad para comprobar la tasa de transferencia actual de la unidad de disco. En una terminal, ejecutaremos como root el siguiente comando:
guadalinex:~# hdparm -tT /dev/hda /dev/hda: Timing buffer-cache reads: 1332 MB in 2.00 seconds = 666.00 MB/sec Timing buffered disk reads: 10 MB in 3.33 seconds = 3.00 MB/sec
El comando nos muestra la tasa de transferencia del disco utilizando un buffer y sin él. El valor que nos aporta una medida más exacta de las prestaciones del disco es la tasa de transferencia sin utilizar buffer (buffered). Para que no influyan en la medida de la velocidad, es recomendable que la máquina no ejecute programas que estén accediendo al disco. Podemos repetir varias veces la medida para obtener un resultado medio que refleje más fielmente las características de la máquina.
Para conocer la configuración actual de un disco utilizaremos ejecutaremos 'hdparm' sin parámetros:
guadalinex:~# hdparm /dev/hda /dev/hda: multcount = 16 (on) IO_support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 4865/255/63, sectors = 78165360, start = 0
Ésta es la configuración habitual de un disco sin ningún tipo de optimización, de ahí el rendimiento tan pobre obtenido en la prueba anterior. Las variables más importantes en relación al rendimiento son multcount, IO_support, unmaskirq y using_dma. En el siguiente apartado veremos cómo se modifican y los efectos en el rendimiento.
Opciones disponibles
La opción más importante que podemos modificar en un disco es el uso o no de acceso por DMA. De la utilización de DMA depende en gran medida la tasa de transferencia del disco y el uso de la CPU en los movimientos de datos. Para modificar el uso de DMA ejecutaremos:
guadalinex:~# hdparm -d1 /dev/hda /dev/hda: setting using_dma to 1 (on) using_dma = 1 (on)
A continuación realizamos una prueba de velocidad para comprobar el aumento de las prestaciones. Esta vez sólo utilizamos el parámetro -t para que se nos muestre la tasa de transferencia sin buffer.
guadalinex:~# hdparm -t /dev/hda /dev/hda: Timing buffered disk reads: 80 MB in 3.00 seconds = 26.67 MB/sec
Podemos ver que se ha producido un aumento espectacular del rendimiento pasando de 3 a 26 MB/s de transferencia. Veamos otros parámetros que se pueden modificar. A continuación, probaremos a modificar el acceso al disco utilizando 32 bits. Para ello, ejecutaremos el comando:
guadalinex:~# hdparm -c3 /dev/hda /dev/hda: setting 32-bit IO_support flag to 3 IO_support = 3 (32-bit w/sync)
Y volvemos a realizar una prueba de velocidad.
guadalinex:~# hdparm -t /dev/hda /dev/hda: Timing buffered disk reads: 82 MB in 3.05 seconds = 26.89 MB/sec
Como podemos observar, la variación en la velocidad ha sido mínima. Dependiendo del tipo de disco y ordenador los resultados pueden variar.
Es posible modificar otros parámetros pero los comentados aquí son los más comunes y seguros.
Arranque
La configuración de un disco no se guarda al apagar la máquina, por lo tanto es necesario asignar en el arranque los parámetros adecuados para que mantengan el efecto. En Guadalinex, como en todos los sistemas Debian, la configuración de 'hdparm' se almacena en el fichero /etc/hdparm.conf. En este archivo podremos asignar de una forma muy sencilla la configuración necesaria a cada unidad.
Por ejemplo, para configurar un disco de la misma forma que hemos hecho manualmente añadiremos al final del fichero hdparm.conf el siguiente bloque:
/dev/cdroms/cdrom0 {
dma = on
io32_support = 3
}

