velocidad
Los discos duros son lentos. Normalmente no se nota demasiado, porque o bien nos beneficiamos de la RAM del ordenador utilizada como memoria caché, o bien estamos leyendo un fichero largo en modo secuencial, que sí es una operación bastante rápida (un disco duro cualquiera moderno puede dar más de 50MB/s en modo secuencial).
Pero, a veces, manejamos un volumen de datos tan inmenso y accedemos a él de forma tan "desordenada", que no podemos evitar tropezarnos con la realidad física: los discos duros son lentos. Muy lentos.
Supongamos que tenemos un disco duro Seagate ST3250823A. Las especificaciones técnicas de este disco duro de 250 gigabytes indican que el tiempo medio de lectura es de 8 milisegundos. Es decir, que puede hacer unas 125 lecturas por segundo, si éstas están repartidas por todo el disco duro. Si leemos sectores aislados (512bytes), nuestro estupendo disco duro nos estará entregando apenas 60Kbytes por segundo.
El tiempo medio de lectura tiene dos componentes: el tiempo de "seek", o movimiento del cabezal, y el tiempo de rotación del disco. Dado que el disco duro es de 7200 revoluciones por minuto, o 120 revoluciones por segundo, el tiempo medio de rotación es de la mitad: 4.16 milisegundos. El tiempo medio de "seek", según el manual, es de menos de 11 milisegundos así que el tiempo medio de acceso tendría que ser la suma de ambos, unos 14-15 milisegundos. A saber cómo calcula el fabricante los 8 milisegundos que nos indica de tiempo medio de lectura. Un dato interesante es que el tiempo de "seek" a pistas cercanas es de 0.8 milisegundos.
En la práctica influyen muchos factores, como la distribución exacta de los accesos, la caché del disco duro, otros accesos concurrentes y el planificador de disco del sistema operativo, entre otros.
Pensando en mejoras para mi sistema de "backend" para Durus, una de las posibilidades que se me ocurren es disponer de varios hilos o "threads" para repartir las lecturas. De esta forma, cuando un cliente del sistema de persistencia quiere cargar en memoria cien objetos, por ejemplo, puede enviar al planificador de disco del sistema operativo (y éste al disco duro) las cien peticiones en paralelo, en vez de hacerlo de manera secuencial. De esta forma el sistema operativo y el disco duro tendrán más información y podrán optimizar los accesos al máximo.
La velocidad de transmisión, tanto de escritura como de lectura en un disco duro, depende del tipo de disco duro, la velocidad de rotación y la interfaz que se use para su conexión (IDE, SATA, SCSI, USB, etc).
Por ejemplo, la velocidad de transferencia máxima de un disco duro SATA 1 alcanza los 192 MB/seg, en tanto los de SATA 2 los 384 MB/seg. Dichas velocidades son las óptimas o, en otras palabras, son las velocidades máximas que pueden transferir dichas tecnologías.
En la práctica, los discos duros alcanzan velocidades menores, dependiendo de múltiples factores. Un disco duro de 7200 revoluciones por minuto, tiene un promedio de transferencia del disco duro a la memoria buffer de 70 MB por segundo.
Un disco duro que tiene un número más alto de revoluciones por minutos, podrá trabajar a velocidades mayores. Lo mismo para un disco duro que ha sido desfragmentado, trabajará más rápido.
Pero, a veces, manejamos un volumen de datos tan inmenso y accedemos a él de forma tan "desordenada", que no podemos evitar tropezarnos con la realidad física: los discos duros son lentos. Muy lentos.
Supongamos que tenemos un disco duro Seagate ST3250823A. Las especificaciones técnicas de este disco duro de 250 gigabytes indican que el tiempo medio de lectura es de 8 milisegundos. Es decir, que puede hacer unas 125 lecturas por segundo, si éstas están repartidas por todo el disco duro. Si leemos sectores aislados (512bytes), nuestro estupendo disco duro nos estará entregando apenas 60Kbytes por segundo.
El tiempo medio de lectura tiene dos componentes: el tiempo de "seek", o movimiento del cabezal, y el tiempo de rotación del disco. Dado que el disco duro es de 7200 revoluciones por minuto, o 120 revoluciones por segundo, el tiempo medio de rotación es de la mitad: 4.16 milisegundos. El tiempo medio de "seek", según el manual, es de menos de 11 milisegundos así que el tiempo medio de acceso tendría que ser la suma de ambos, unos 14-15 milisegundos. A saber cómo calcula el fabricante los 8 milisegundos que nos indica de tiempo medio de lectura. Un dato interesante es que el tiempo de "seek" a pistas cercanas es de 0.8 milisegundos.
En la práctica influyen muchos factores, como la distribución exacta de los accesos, la caché del disco duro, otros accesos concurrentes y el planificador de disco del sistema operativo, entre otros.
Pensando en mejoras para mi sistema de "backend" para Durus, una de las posibilidades que se me ocurren es disponer de varios hilos o "threads" para repartir las lecturas. De esta forma, cuando un cliente del sistema de persistencia quiere cargar en memoria cien objetos, por ejemplo, puede enviar al planificador de disco del sistema operativo (y éste al disco duro) las cien peticiones en paralelo, en vez de hacerlo de manera secuencial. De esta forma el sistema operativo y el disco duro tendrán más información y podrán optimizar los accesos al máximo.
La velocidad de transmisión, tanto de escritura como de lectura en un disco duro, depende del tipo de disco duro, la velocidad de rotación y la interfaz que se use para su conexión (IDE, SATA, SCSI, USB, etc).
Por ejemplo, la velocidad de transferencia máxima de un disco duro SATA 1 alcanza los 192 MB/seg, en tanto los de SATA 2 los 384 MB/seg. Dichas velocidades son las óptimas o, en otras palabras, son las velocidades máximas que pueden transferir dichas tecnologías.
En la práctica, los discos duros alcanzan velocidades menores, dependiendo de múltiples factores. Un disco duro de 7200 revoluciones por minuto, tiene un promedio de transferencia del disco duro a la memoria buffer de 70 MB por segundo.
Un disco duro que tiene un número más alto de revoluciones por minutos, podrá trabajar a velocidades mayores. Lo mismo para un disco duro que ha sido desfragmentado, trabajará más rápido.