¿Cómo mejoro el rendimiento del disco de mi servidor?

10

Tengo un HP Microserver con Ubuntu 10.04 LTS. Es un servidor de baja potencia con 5 bahías de unidades internas. Lo uso para hacer una copia de seguridad de mis servidores remotos, VPS y computadoras portátiles locales a través de la red. Quiero obtener el mejor rendimiento de los discos, pero no sé si está configurado de manera óptima, así que estoy buscando algunos consejos.

Mi servidor ejecuta rsnapshot varias veces al día para respaldar hosts remotos. La parte de copia de seguridad incremental real lleva muy poco tiempo. El tiempo significativo se dedica a hacer cosas como: -

/bin/cp -al /srv/rsnapshot/hourly.0 /srv/rsnapshot/hourly.1

Que toma alrededor de 2 horas. Me doy cuenta de que hay un billón de pequeños archivos allí.

$ sudo du -hs hourly.1
659G    hourly.1

Además, cuando rsnapshot elimina una copia de seguridad anterior, esto puede llevar mucho tiempo: -

/bin/rm -rf /srv/rsnapshot/daily.6/

Lo cual toma alrededor de media hora.

Mis preguntas son las siguientes, la configuración del servidor y algunas estadísticas de E / S se detallan a continuación. Por supuesto, puedo proporcionar más información de depuración si es necesario: -

¿Cómo puedo identificar dónde están los cuellos de botella?

¿Estoy llegando al límite de lo que es capaz (IO wise) con esta caja?

¿Hay algún ajuste de rendimiento que pueda hacer?

¿Debo usar un nivel RAID diferente?

¿Tendría sentido intercambiar dos de los discos RAID internos (la mitad de cada espejo) con dos 'otras mitades del otro espejo' en la matriz externa?

Nota: de alguna manera no estoy dispuesto a hacer cosas como compilar mi propio núcleo. Idealmente, me gustaría seguir con 10.04 LTS, a menos que haya algo de magia en versiones posteriores que haga que todo esto funcione mucho más rápido.

Internamente, el servidor tiene un disco de arranque SATA de 1x160GB y discos de 4x2TB: -

Disk /dev/sde: 160.0 GB, 160041885696 bytes
Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdh: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdi: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdg: 2000.4 GB, 2000398934016 bytes

Los cuatro discos internos de 2 TB están en una configuración de software MD RAID10: -

md0 : active raid10 sdg1[3] sdh1[0] sdi1[2] sdf1[1]
      3907023872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

Además, tengo una caja de unidad externa EDGE10 que está conectada a través de una tarjeta PCI-E eSATA y contiene cuatro unidades más de 500 GB:

Disk /dev/sda: 500.1 GB, 500107862016 bytes
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
Disk /dev/sdc: 500.1 GB, 500107862016 bytes
Disk /dev/sdd: 500.1 GB, 500107862016 bytes

Esto también se configura como una matriz MD RAID10

md1 : active raid10 sdb1[1] sda1[0] sdd1[3] sdc1[2]
      976767872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

md0 y md1 se combinan para hacer un gran LVM. Nota: Hace poco agregué la matriz externa, por lo que está bastante en blanco, no creo que haya ningún bloque en este momento.

Esto se presenta como un volumen LVM: -

--- Logical volume ---
LV Name                /dev/data/data
VG Name                data
LV UUID                amZCgU-sQLi-R363-dUFx-Bcdf-iwlt-ZNnDp8
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                4.54 TiB
Current LE             1190134
Segments               2
Allocation             inherit
Read ahead sectors     auto
- currently set to     512
Block device           251:0

Formateado como EXT4 y montado como / srv: -

/dev/mapper/data-data on /srv type ext4 (rw)

Hay mucho espacio libre.

/dev/mapper/data-data
                      4.5T  2.2T  2.1T  51% /srv

Otra información que puede ser útil: -

$ uname -a
Linux ubuntuserver 2.6.32-32-server #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011 x86_64 GNU/Linux

.

00:11.0 SATA controller: ATI Technologies Inc SB700/SB800 SATA Controller [AHCI mode] (rev 40)
02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3132 Serial ATA Raid II Controller (rev 01)

Al hacer el comando cp durante rsnapshot, veo lo siguiente en iostat: -

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.55    0.00    5.47   66.14    0.00   27.85

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.10    0.00     0.80     0.00     8.00     0.00    0.00   0.00   0.00
sdf               0.00   407.50    0.00   66.80     0.00  3790.40    56.74   124.86 1524.88  13.55  90.50
sdh               0.00   406.90    0.00   66.90     0.00  3790.40    56.66    92.89 1230.52  13.21  88.40
sdi               0.00   407.80    5.50   70.20    44.00  3824.00    51.10   113.83 1333.84  12.34  93.40
sdg               0.00   406.80    6.10   71.60    48.80  3827.20    49.88    64.32  787.68  11.69  90.80
md0               0.00     0.00   11.50 1484.60    92.00 11876.80     8.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00   11.50 1484.70    92.00 11877.60     8.00  5331.18  471.91   0.63  94.70
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Básicamente, muchas escrituras, muchas IO esperan

Así que ahora la caja está inactiva, he suspendido todos los trabajos.

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdf               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdh               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdg               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

¡Parece color de rosa!

$ sudo hdparm -T -t /dev/sd[a-i]

/dev/sda:
 Timing cached reads:   2532 MB in  2.00 seconds = 1265.95 MB/sec
 Timing buffered disk reads:  270 MB in  3.02 seconds =  89.53 MB/sec

/dev/sdb:
 Timing cached reads:   2516 MB in  2.00 seconds = 1258.07 MB/sec
 Timing buffered disk reads:  264 MB in  3.02 seconds =  87.37 MB/sec

/dev/sdc:
 Timing cached reads:   2442 MB in  2.00 seconds = 1220.80 MB/sec
 Timing buffered disk reads:  272 MB in  3.00 seconds =  90.60 MB/sec

/dev/sdd:
 Timing cached reads:   2520 MB in  2.00 seconds = 1259.64 MB/sec
 Timing buffered disk reads:  272 MB in  3.02 seconds =  90.07 MB/sec

/dev/sde:
 Timing cached reads:   2524 MB in  2.00 seconds = 1261.48 MB/sec
 Timing buffered disk reads:  306 MB in  3.01 seconds = 101.56 MB/sec

/dev/sdf:
 Timing cached reads:   2366 MB in  2.00 seconds = 1183.28 MB/sec
 Timing buffered disk reads:  388 MB in  3.01 seconds = 128.88 MB/sec

/dev/sdg:
 Timing cached reads:   2536 MB in  2.00 seconds = 1267.52 MB/sec
 Timing buffered disk reads:  400 MB in  3.00 seconds = 133.12 MB/sec

/dev/sdh:
 Timing cached reads:   2538 MB in  2.00 seconds = 1269.08 MB/sec
 Timing buffered disk reads:  426 MB in  3.00 seconds = 141.90 MB/sec

/dev/sdi:
 Timing cached reads:   2538 MB in  2.00 seconds = 1268.57 MB/sec
 Timing buffered disk reads:  402 MB in  3.01 seconds = 133.69 MB/sec
papa
fuente
Hmm Odio dividir las estructuras de disco en diferentes hardware porque hace que cosas como esta sean tan difíciles de solucionar. Normalmente sugeriría ejecutar algo como bonnie++en cada matriz por separado para que tenga puntos de referencia de velocidad básicos para ellos. No tengo mucha experiencia con LVM, así que no estoy seguro de que desacoplarlos sea una opción ahora.
Oli
La matriz externa realmente no es un problema. No hay bloques en él. Es el rendimiento del disco interno el que espero obtener sonido.
papa

Respuestas:

3

Desafortunadamente, el caché de bandas solo se aplica a RAID5 y 6; no hay equivalente para RAID 0/1/10.

El rendimiento de sus unidades individuales (según hdparm) se ve bien: todas funcionan como se espera para las unidades de esa clase.

Mis sugerencias:

  1. Compruebe que AHCI esté habilitado en el BIOS y que las unidades instaladas internamente no estén utilizando el modo IDE heredado. Hay un BIOS pirateado para el MicroServer disponible que también habilita AHCI para el puerto eSATA también (consulte este enlace para obtener más información); puede valer la pena investigar las unidades en el gabinete externo, aunque aún estarán limitadas por estar detrás de un multiplicador de puerto.
  2. Habilite NCQ para todas las unidades y vea si eso hace la diferencia (puede que no).
  3. Asegúrese de que la configuración del sistema de archivos esté optimizada (montaje noatime, nodiratime). También puede deshabilitar las barreras de escritura , pero eso puede ser demasiado arriesgado.
  4. Compruebe si ve algún beneficio al cambiar el programador de E / S (noop puede ayudar aquí).
  5. Ajuste el búfer de lectura anticipada para los dispositivos md y LVM: blockdev --setra <size> /dev/md1por ejemplo (donde <size>hay sectores de 512 bytes). Sin embargo, eso solo ayudará a las lecturas.

Otras dos cosas que pueden afectar el rendimiento son la alineación de particiones y los parámetros de creación del sistema de archivos (zancadas, etc.), pero como está utilizando herramientas modernas, eso no debería ser un problema.

mjturner
fuente
Se agregaron los tiempos de hdparm de disco y se editó fstab (y se volvió a montar) para usar noatime y nodiratime. Lo dejaré 24 horas así.
papa