Table of Contents
Nociones básicas sobre el tamaño de bloque / Formato avanzado
Los discos de Formato Avanzado usan sectores de 4,096 bytes en lugar de los sectores más comunes de 512 bytes. Este cambio está enmascarado por el firmware que rompe los sectores físicos de 4,096 bytes en sectores lógicos de 512 bytes para beneficio del sistema operativo, pero el uso de sectores físicos más grandes tiene implicaciones para la disposición del disco y el rendimiento del sistema.
Este artículo examina estas implicaciones, incluyendo las pruebas de referencia tipo benchmark que ilustran los efectos probables del mundo real en algunos sistemas comunes de archivos Linux. Conforme los discos de Formato Avanzado se han convertido en la norma, entender cómo enfrentarse a estos discos es una habilidad vital para cualquiera que quiera evitar sanciones serias de rendimiento asociadas con una configuración menor a la óptima.
Si está familiarizado con la estructura de los discos, usted sabe que están divididos en sectores, que típicamente tienen un tamaño de 512 bytes, todas las operaciones de Lectura o Escritura suceden en múltiplos del tamaño del sector. Cuando observa más de cerca los discos duros incluyen datos adicionales entre sectores. El disco usa estos bytes adicionales para detectar y corregir errores dentro de cada sector.
Cuando se aumenta el tamaño del sector de 512 bytes a un valor mayor, se pueden usar algoritmos de corrección de errores más eficientes y poderosos. Así pues, cambiar a un tamaño de sector más grande tiene dos beneficios prácticos, confiabilidad mejorada y una mayor capacidad de disco — al menos en teoría.
Los discos de Formato Avanzado traducen cada sector físico de 4,096 bytes en ocho sectores lógicos de 512 bytes. Para el firmware, el sistema operativo y todos los utilitarios del disco, el disco parece tener sectores de 512 bytes, aunque el tamaño físico subyacente del sector es de 4,096 bytes. Sin embargo, cambiar el tamaño aparente del sector en el firmware puede degradar el rendimiento. Para entender por qué, usted necesita entender algo acerca de las estructuras de datos del sistema de archivos y cómo se colocan las particiones en el disco duro.
En términos del tamaño del sector lógico, IDEMA especifica dos tipos de discos de formato avanzado:
- Los discos de 512 Byte emulation (512e) tienen un tamaño del sector lógico de 512 bytes. Estos discos son compatibles en Windows, tanto en Windows Vista como en las modernas distribuciones Linux. Microsoft y Western Digital utilizan exclusivamente el término “Formato avanzado” para este tipo de discos.
- Los discos de 4K native (4Kn) tienen un tamaño del sector lógico de 4 KB. Los sistemas operativos modernos pueden almacenar datos en estos discos, pero generalmente no pueden arrancar desde estos discos. Estos discos suelen ser unidades externas con conexión USB.
Ejemplo de disco con emulación.
cat /sys/block/sda/queue/logical_block_size 512 cat /sys/block/sda/queue/physical_block_size 4096
¿Por qué las estructuras de datos del sistema de archivos afectan el rendimiento?
La mayoría de los sistemas de archivos modernos usa estructuras de datos que tienen 4,096 bytes o más grandes. Así, la mayoría de operaciones de disco I/O están en múltiplos de esta cantidad. Considere lo que sucede cuando Linux quiere leer o escribir una de estas estructuras de datos en un disco nuevo con sectores de 4,096 bytes. Si sucede que las estructuras de datos del sistema de archivos se alinean perfectamente con el tamaño físico subyacente del sector, la Lectura o Escritura de una estructura de datos de 4,096 bytes resulta en una Lectura o Escritura de un sólo sector. El firmware del disco duro no necesita hacer nada extraordinario, pero cuando las estructuras de datos del sistema de archivos no se alinean perfectamente con los sectores físicos subyacentes, una operación de Lectura o Escritura debe acceder a dos sectores físicos.
En teoría, las operaciones de Lectura deben verse menos afectadas por una mala alineación que las operaciones de Escritura. En el caso de una lectura del disco, la cabeza de lectura/escritura del disco posiblemente pase sobre ambos sectores en una secuencia rápida, así que la tarea del firmware de regresar la estructura de datos de 4 kibibytes (KiB) es relativamente simple. En contraste, las escrituras de estructuras de datos mal alineadas requieren que el firmware del disco lea dos sectores, modifique porciones de ambos sectores y luego escriba dos sectores. Esta operación se lleva más tiempo que cuando las 4,096 bytes ocupan un sólo sector. Así, se degrada el rendimiento. En la práctica, las operaciones de Lectura se pueden ver afectadas negativamente algunas veces tanto como las operaciones de Escritura.
¿Cómo puede saber si sus estructuras de datos están alineadas correctamente?
La mayoría de los sistemas de archivos alinean sus estructuras de datos con el inicio de las particiones que las contienen. Así, si una partición empieza en el límite de 4,096 bytes (sector ocho), está alineada adecuadamente. Sin embargo, en los años anteriores a 2010 (aproximadamente), las herramientas de partición de Linux no creaban particiones alineadas de esta manera. Incluso hoy, quedan algunas dificultades, así que ejerza precaución cuando cree sus particiones.
Si usted usa un administrador de volúmenes lógico (LVM), esté consciente que las reglas de alineación para LVMs son las mismas que para las particiones. Aunque no necesita preocuparse acerca de la alineación de los volúmenes lógicos dentro de LVMs, usted poner atención en la alineación de las particiones LVM mismas. Una verificación aleatoria de unos cuantos sistemas de archivos utilizando LVMs replicó los resultados anteriores.
Usted debe empezar determinando el tamaño del sector físico de su disco. Si descubre que tiene una unidad de Formato Avanzado, debe alinear sus particiones adecuadamente.
Determinar el tamaño del sector físico
En teoría, el núcleo Linux debe retornar información acerca del tamaño del sector físico en el pseudo archivo /sys/block/sdX/queue/physical_block_size y en el tamaño del sector lógico en el pseudo archivo /sys/block/sdX/queue/logical_block_size, donde sdX es el nombre del nodo de su dispositivo (típicamente, sda, sdb y así sucesivamente). En la práctica, sin embargo, la información del tamaño del bloque físico es frecuentemente falsa — en mi experiencia, el núcleo reporta información precisa sólo para algunos discos y la precisión del reporte también varía con la versión del núcleo. Esto significa que los utilitarios del disco no pueden detectar confiablemente la presencia de tales discos.
Así que usted puede necesitar las especificaciones de su unidad en el sitio Web del fabricante o de otras maneras. El pseudo archivo /sys/block/sdX/device/model tiene el número de modelo del dispositivo, así que puede buscar allí y luego checar con el fabricante. Si tiene duda, suponga que su disco es un modelo de Formato Avanzado — la mayoría de los discos lo son.
Definición de superbloque: el superbloque (superblock) contiene metadatos críticos del sistema de archivos tales como información acerca del tamaño, cantidad de espacio libre y donde se encuentra los datos. Si el superbloque es dañado, y su información se pierde, no podría determinar que partes del sistema de archivos contiene información. Por este motivo, se guardan varias copias del superbloque en determinados bloques del sistema de archivos.
Alinear las particiones
Casi todas o todas las unidades de Formato Avanzado de Western Digital incluyen un puente que puede configurar para compatibilidad con Windows XP. Este puente cambia la numeración de sectores por 1, un arreglo rápido y sucio para la situación común en Windows XP de usar una partición alineada con un sólo cilindro que abarca toda la unidad. Sin embargo, este puente crea problemas si usa particiones múltiples o si usted usa un software de creación de particiones moderno, así que recomiendo fuertemente no intentarlo. En cambio, use su software de creación de particiones Linux para crear particiones alineadas adecuadamente. (Ni Seagate ni Toshiba proporcionan un puente así en sus unidades de disco).
Hay tres familias de herramientas para crear particiones, master boot record (MBR) y GPT, disponibles para Linux y cada una ofrece su propio método para alinear las particiones. Si usted tiene una unidad de disco de Formato Avanzado, su mejor opción es la de operar el último software de creación de particiones Linux disponible.
Actualmente, el supuesto más seguro es que cualquier disco duro nuevo que compre utiliza la tecnología de Formato Avanzado. Desde luego, usted puede verificar las hojas de especificaciones del fabricante para confirmar esta suposición, pero alinear las particiones como para un disco de Formato Avanzado no tiene efectos perjudiciales en tipos de discos más viejos excepto cuando se usen utilidades o sistemas operativos obsoletos.
Actualmente, algunos discos externos usan sectores de 4,096 bytes, pero los discos internos usan la traducción del tamaño del sector. Esto puede cambiar en el futuro. Si encuentra una unidad de disco con sectores de 4,096 bytes pero con una opción para usar el tamaño de sector verdadero, puede que la quiera usar, sin embargo, tenga cuidado de algunas advertencias.
El software del BIOS puede hacer algunas suposiciones acerca del tamaño del sector del disco duro. Si el BIOS contiene tal suposición, probablemente su computadora no arrancará desde un disco que tenga sectores de 4.096 bytes y le falte la traducción de firmware a sectores de 512 bytes. Usando lo último en software puede ayudarle a darle la vuelta a los problemas, como puede ser usar un disco convencional como el disco de arranque, restringiendo su disco de tecnología nueva para usarse como un disco de datos.
Cuando se manipulan discos MBR, esté consciente de que la alineación de particiones extendidas no es importante. Estas particiones tienen estructuras de datos de un sector que define particiones lógicas, así que en un sentido real, las particiones extendidas no se pueden alinear adecuadamente. Sin embargo, tenga cuidado de alinear las particiones primarias y lógicas.
Recomendación: Establézca el comienzo de una partición siempre por sectores y a múltiplos de 8 para una alineación adecuada con discos de Formato Avanzado. Esta es un esquema de particionado correcto.
Disposit. Inicio Comienzo Final Sectores Tamaño Id Tipo /dev/sda1 2048 206847 204800 100M 7 HPFS/NTFS/exFAT /dev/sda2 206848 409599999 409393152 195,2G 7 HPFS/NTFS/exFAT /dev/sda3 * 409600000 409985559 385560 188,3M 83 Linux /dev/sda4 409985560 1953525167 1543539608 736G 8e Linux LVM
Algunos programas para visualizar alineaciones de particiones.
- fdisk.
- Gparted / libgparted.
- GPT fdisk (Puede verificar alineaciones).
Comandos relacionados con el tamaño de bloque en Discos / Sistemas de ficheros
Tipos de disco físicos.
lsblk -o NAME,PHY-SeC,LOG-SEC NAME PHY-SEC LOG-SEC sda 4096 512 ├─sda1 4096 512 ├─sda2 4096 512 ├─sda3 4096 512 └─sda4 4096 512 ├─Volgroup00-lv_root 4096 512 ├─Volgroup00-lv_swap 4096 512 └─Volgroup00-cifrado 4096 512 └─luks-20b2aaf7-9353-4732-8f62-ff83bb5e54b7 4096 512 sdb 512 512 └─sdb1 512 512 └─Volgroup00-lv_root 4096 512 sdc 512 512 └─sdc1 512 512 sr0 512 512
cat /sys/block/sda/queue/physical_block_size 4096 cat /sys/block/sdc/queue/physical_block_size 512 cat /sys/block/sdb/queue/physical_block_size 512 cat /sys/block/sdb/queue/logical_block_size 512
smartctl -i /dev/sda | grep -i sector Sector Sizes: 512 bytes logical, 4096 bytes physical
hdparm -I /dev/sda | grep "Sector size" Logical Sector size: 512 bytes Physical Sector size: 4096 bytes
Sistemas de ficheros.
Sistema de ficheros XFS.
xfs_info /run/media/busi/037ee8d0-0fd8-47a2-abc9-3b59609b137d/ meta-data=/dev/mapper/luks-20b2aaf7-9353-4732-8f62-ff83bb5e54b7 isize=256 agcount=4, agsize=36028800 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 spinodes=0 data = bsize=4096 blocks=144115200, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=70368, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
Sistema de ficheros Ext3/4.
tune2fs -l /dev/sda3 | grep "Block size\|Fragment size" Block size: 1024 Fragment size: 1024 # Identificar el tamaño de bloque físico y lógico en LVM. tune2fs -l /dev/mapper/Volgroup0-lv_root | grep "Block size\|Fragment size" Block size: 4096 Fragment size: 4096 # Tambien se puede utilizar dumpe2fs. dumpe2fs /dev/sda3 | grep -i "Block size" Block size: 1024 dumpe2fs /dev/mapper/Volgroup00-lv_root | grep -i "Block size" Block size: 4096
Al crear un sistema de ficheros, se puede especificar el tamaño de bloque deseado respetando los límites que el propio sistema de ficheros establece. Por norma un uso superior a 4096 no es soportado debido al “page size” del kernel, veamos un ejemplo.
# XFS: Valor por defecto 4KB / Mínimo 512 bytes / Máximo 64KB # Probamos con el mínimo mkfs.xfs -f -b size=512 /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=2851110 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=512 blocks=11404440, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=512 blocks=20480, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # Se Monta sin problemas. mount -t xfs /dev/sdb1 /mnt/es_backups/ xfs_info /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=2851110 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=512 blocks=11404440, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=512 blocks=20480, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # Desmontamos y probamos con el máximo (64K). umount /mnt/es_backups/ mkfs.xfs -b size=65536 /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=22275 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=65536 blocks=89097, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=65536 ascii-ci=0 log =internal log bsize=65536 blocks=1000, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=65536 blocks=0, rtextents=0 # Falla al montarse debido al tamaño de página predeterminado del Kernel (4096 = 4K), se debe recompilar para hacer efectivo otro tipo de tamaño de página / la CPU debe también soportarlo. mount -t xfs /dev/sdb1 /mnt/es_backups/ mount: Function not implemented getconf PAGE_SIZE 4096
Aumentar el pagesize (Huge Pages): https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
Diferencias de velocidad al cambiar el tamaño del bloque en dd
dd if=/dev/zero of=/root/test3 bs=512 count=1000000 conv=fsync 1000000+0 records in 1000000+0 records out 512000000 bytes (512 MB) copied, 7.49203 s, 68.3 MB/s # dd if=/dev/zero of=/root/test3 bs=4096 count=125000 conv=fsync 125000+0 records in 125000+0 records out 512000000 bytes (512 MB) copied, 4.14054 s, 124 MB/s