Copia lenta entre directorios NFS/CIFS en el mismo servidor

Copia lenta entre directorios NFS/CIFS en el mismo servidor

Por favor tengan paciencia conmigo, sé que hay mucho que leer. Este problema puede ser aplicable a otros, por lo que sería fantástico tener una respuesta. Tuve que regalar la recompensa porque iba a caducar.

Cuando copio hacia o desde mi servidor NFS (Debian) desde un cliente (Ubuntu), maximiza el gigabit. Pero, cuando copio entre dos directorios en el mismo servidor, su velocidad oscila entre < 30 MB/seg y más de 100 MB/seg. La mayoría de las veces ronda los 50 MB/s.

La misma copia realizada directamente en el servidor NFS (discos locales) obtengo 100-150 MB/seg, a veces más. Una copia de un archivo entre esta exportación NFS y un recurso compartido CIFS exportado desde el mismo directorio en el mismo servidor es igual de lenta y una copia entre dos directorios a través de CIFS en el mismo servidor es lenta. iperfmuestra que la velocidad bidireccional es 941Mb/940Mb entre el cliente y el servidor.

Me aseguré de que NFS esté usando async en el servidor. También deshabilité la sincronización en el conjunto de datos ZFS e intenté eliminar los dispositivos de registro y caché de ZFS.

Lo probé en un espejo seccionado ZFS muy rápido de discos de 4x2 TB, con un SSD para dispositivos de registro y caché.

Especificaciones del servidor NFS:

Debian 8.2 core 4Ghz AMD-FX
32GB ram
ZFS raid 10, caché/registro SSD
17GB ARC
4x2GB WD red drives
Intel 82574L NIC

Cliente de prueba:

Ubuntu 15.04, Core2Quad 2,4 Ghz
8 GB de RAM
SSD
Intel 82574L NIC

Así están las cosas actualmente. /pool2/Mediaes la acción con la que he estado probando.

/etc/fstaben el cliente:

UUID=575701cc-53b1-450c-9981-e1adeaa283f0 /               ext4        errors=remount-ro,discard,noatime,user_xattr 0       1
UUID=16e505ad-ab7d-4c92-b414-c6a90078c400 none            swap    sw              0       0 
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
tmpfs    /tmp    tmpfs   mode=1777       0       0


igor:/pool2/other     /other        nfs         soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock
igor:/pool2/Media       /Media          nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock,noac
igor:/pool2/home        /nfshome        nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock

/etc/exportsen el servidor (igor):

#LAN
/pool2/home 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/test 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)

#OpenVPN
/pool2/home 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)

estado de zpool:

  pool: pool2
 state: ONLINE
  scan: scrub repaired 0 in 6h10m with 0 errors on Sat Oct  3 08:10:26 2015
config:

        NAME                                                 STATE     READ WRITE CKSUM
        pool2                                                ONLINE       0     0     0
          mirror-0                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX         ONLINE       0     0     0
          mirror-1                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE         ONLINE       0     0     0
        logs
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part1  ONLINE       0     0     0
        cache
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part2  ONLINE       0     0     0

errors: No known data errors

  pool: pool3
 state: ONLINE
  scan: scrub repaired 0 in 3h13m with 0 errors on Sat Oct  3 05:13:33 2015
config:

        NAME                                        STATE     READ WRITE CKSUM
        pool3                                       ONLINE       0     0     0
          ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E5PSCNYV  ONLINE       0     0     0

errors: No known data errors

/pool2 bonnie++ en el servidor:

Versión 1.97 ------Salida secuencial------ --Entrada secuencial- --Aleatorio-
Concurrencia 1 -Por Chr- --Bloque-- -Reescritura- -Por Chr- --Bloque-- --Busca--
Tamaño de la máquina K/seg %CP K/seg %CP K/seg %CP K/seg %CP K/seg %CP /seg %CP
Ígor 63G 100 99 187367 44 97357 24 325 99 274882 27 367,1 27

Vinculación

Intenté vincularme y con una conexión directa, vinculación balance-rr, obtengo 220 MB/s de lectura y 117 MB/s de escritura, 40-50 MB/s de copia.

iperf con unión

[ID] Retr. de ancho de banda de transferencia de intervalo
[ 4] 0,00-10,00 s 1,10 GBytes 942 Mbits/s 707 remitente
[ 4] 0,00-10,00 s 1,10 GBytes 941 Mbits/s receptor
[ 6] 0,00-10,00 s 1,06 GBytes 909 Mbits/s 672 remitente
[ 6] 0,00-10,00 s 1,06 GBytes 908 Mbits/s receptor
[SUM] 0,00-10,00 s 2,15 GBytes 1,85 Gbits/s 1379 remitente
[SUM] 0,00-10,00 s 2,15 GBytes 1,85 Gbits/s receptor

Bonnie++ con vinculación a través de NFS

Versión 1.97 ------Salida secuencial------ --Entrada secuencial- --Aleatorio-
Concurrencia 1 -Por Chr- --Bloque-- -Reescritura- -Por Chr- --Bloque-- --Busca--
Tamaño de la máquina K/seg %CP K/seg %CP K/seg %CP K/seg %CP K/seg %CP /seg %CP
neblina 16G 1442 99 192941 16 89157 15 3375 96 179716 13 6082 77

Con el caché/registro del SSD eliminado, copiando a través de NFS, iostat muestra esto

sdb 0,80 0,00 67,60 214,00 8561,60 23689,60 229,06 1,36 4,80 14,77 1,64 1,90 53,60
dds 0,80 0,00 54,60 214,20 7016,00 23689,60 228,46 1,37 5,14 17,41 2,01 2,15 57,76
COSUDE 0,00 0,00 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 0,00 0,00
sda 1,60 0,00 133,00 385,20 17011,20 45104,00 239,73 2,24 4,31 12,29 1,56 1,57 81,60
sdf 0,40 0,00 121,40 385,40 15387,20 45104,00 238,72 2,36 4,63 14,29 1,58 1,62 82,16
ODS 0,00 0,00 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 0,00 0,00
dhs 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00

TMPFS

Exporté un tmpfs a través de NFS e hice una copia del archivo. La velocidad fue de 108 MB/seg. Local desde el servidor, es 410MB/seg.

zvol montado sobre NFS

La velocidad oscila entre < 50 MB/seg hasta > 180 MB/seg, pero tiene un promedio de aproximadamente 100 MB/seg. Esto es lo que estoy buscando. Este zvol está en el mismo grupo (grupo2) en el que he estado probando. Esto realmente me hace pensar que se trata más bien de un problema de tipo de conjunto de datos/almacenamiento en caché de ZFS.

Prueba de lectura de disco sin formato

Usando este comando

dd if=/dev/disk/by-id/ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 of=/dev/null bs=1M count=2000

Obtengo 146-148 MB/s para los 4 discos

Uso lento y desigual del disco en el grupo

Gracias a una persona muy útil en la lista de correo de ZFS, sé qué hacer para lograr un uso más uniforme de los discos.

La razón por la que ZFS prefiere el espejo-1 es que parece que se agregó después de que el espejo-0 se llenó bastante, ahora ZFS está intentando reequilibrar el nivel de llenado.

En caso de que quiera deshacerse de eso y tener algo de tiempo: zfs envía iterativamente los conjuntos de datos del grupo a nuevos conjuntos de datos sobre sí mismo, luego destruye la fuente y repite hasta que se reequilibre el grupo.

He solucionado este problema, los datos ahora están nivelados en todos los discos. Esto ha dado como resultado una velocidad de copia de 75 MB/s a través de NFS. Y 118 MB/seg local.

La pregunta

Mis preguntas). Si puede responder alguna de las preguntas, aceptaré su respuesta:

  1. ¿Cómo se puede solucionar mi problema? (copia lenta sobre NFS, pero no local)
  2. Si no puede responder la respuesta número 1, ¿puede probar esto en su servidor NFS comparable con ZFS en Linux y decirme los resultados para tener algo con qué compararlo?
  3. Si no puede responder a la pregunta 1 o 2, ¿puede realizar la misma prueba en un servidor similar pero que no sea ZFS a través de NFS?

Respuesta1

Hmm... Noté algunos problemas y creo que encontré una o dos pruebas irrefutables. Pero primero haré algunas preguntas y haré suposiciones sobre sus probables respuestas. Presentaré algunos datos que al principio parecerán irrelevantes, pero prometo que valdrá la pena leerlos. Así que, por favor, espérenlo... :-)

  • Supongo que para raid10, tendrá cuatro unidades en total + redundantes.
  • Y que está utilizando el ataque automático de Linux (frente a un controlador de ataque de hardware).
  • También supongo que todos los puertos SATA pueden transferirse independientemente unos de otros a máxima velocidad de transferencia, bidireccionalmente, y que todos los puertos SATA tienen la misma velocidad. Es decir, si tiene un único adaptador/controlador SATA, es totalmente capaz de ejecutar todos los discos conectados a él a la velocidad nominal.
  • También supongo que tienes las últimas unidades y controlador SATA con especificaciones. Es decir, 6,0 Gb/s. Eso es 600 MB/seg. Para ser conservadores, supongamos que obtenemos la mitad, o 300 MB/seg.
  • La conexión cliente-servidor tiene una NIC limitada (a 100 MB/s), por lo que no puede estresar lo suficiente las unidades.
  • Para ir más rápido que la NIC, al hacer NFS a NFS, supongo que estás usando localhost, por lo que puedes ir más allá de las velocidades limitadas de la NIC (lo cual creo que dijiste que hiciste uniendo para demostrar que no es un problema). )

TEMA #1. Las tasas de transferencia reportadas incluso para las rápidas de local a local parecen bajas. Con discos tan rápidos, esperaría más de 150 MB/s. Tengo un sistema raid0 de 3 discos que solo produce 3,0 Gb/s [adaptador limitado] y puedo obtener 450 MB/s en franjas. Sus discos/controlador tienen el doble de velocidad que los míos, por lo que esperaría [debido a la división] que obtenga 300 MB/s, no solo 150 MB/s para local a local. O tal vez incluso 600 MB/s [menos la sobrecarga de FS que podría reducirlo a la mitad por el bien de la discusión]

  • De su información de zpool, noté que la configuración de su disco es Western Digital y es:
espejo-0
  ata-WDC_WD20EFRX-68AX9N0
  ata-WDC_WD20EFRX-68EUZN0
espejo 1
  ata-WDC_WD20EFRX-68AX9N0
  ata-WDC_WD20EFRX-68EUZN0
  • Ahora comparemos esto con la información de su iostat. Sería bueno tener información de iostat en todas las unidades para todas las pruebas, pero creo que puedo diagnosticar el problema solo con lo que usted proporcionó.
  • sdb y sdd están al máximo
  • Como has notado, esto esextraño. Yo esperaríatodoimpulsa a tener uso/estadísticas equilibradas en una incursión10. Esta es [mi] prueba irrefutable.
  • Combinando los dos. Las unidades al máximo son un modelo ligeramente diferente a las que no lo están. Supongo que el orden de zpool es sda/sdb sdc/sdd [pero podría invertirse]
  • sda/sdc son 68AX9N0
  • sdb/sdd son 68EUZN0

TEMA #2. De una búsqueda en Google sobre WD20EFRX + 68AX9N0 + 68EUZN0, encontré esta página:http://forums.whirlpool.net.au/archive/2197640

Parece que los accionamientos 68EUZN0 pueden aparcar la cabeza después de unos 8 segundos, mientras que el otro es más inteligente al respecto [o viceversa].

Entonces, dado el almacenamiento en caché NFS + el almacenamiento en caché FS + el almacenamiento en caché SSD, las unidades subyacentes pueden estar inactivas y estacionadas. Supongo que la capa adicional de almacenamiento en caché de NFS es lo que lo lleva al límite.

Puede probar esto variando las opciones de sincronización de FS, tal vez la sincronización sea mejor que la asíncrona. Además, si puede, volvería a ejecutar las pruebas con el almacenamiento en caché SSD desactivado. La idea es garantizar que el aparcamiento nonoocurrir y ver los resultados.

Como se menciona en la página web, existen algunas utilidades que pueden ajustar el intervalo de retraso del estacionamiento. Si esa es la opción, asegúrese de investigarla a fondo.

ACTUALIZAR:

Su problema puede verse como un problema de rendimiento a través de una red de almacenamiento y reenvío [con entrega garantizada]. Nota, estoynohablando de la NIC o equivalente.

Considere que una operación de E/S es como un paquete que contiene una solicitud (por ejemplo, lectura/escritura, buf_addr, buf_len) que se almacena en una estructura. Este paquete/estructura de solicitud se pasa entre las distintas capas de caché: NFS, ZFS, controlador de dispositivo, controlador SATA, disco duro. En cada punto, tiene una hora de llegada a la capa y una hora de salida cuando la solicitud se envía a la siguiente capa.

En este contexto, la velocidad real de transferencia del disco, cuando la transferencia realmente ocurre, es análoga a la velocidad del enlace. Cuando la mayoría de las personas consideran los discos, solo consideran la velocidad de transferencia y no cuándo se inició realmente la transferencia.

En un enrutador de red, los paquetes llegan, pero no siempre se reenvían inmediatamente, incluso si el enlace saliente está libre. Dependiendo de la política del enrutador, el enrutador puede retrasar el paquete un poco, esperando que lleguen más paquetes de otras fuentes [o de la misma fuente si es UDP], de modo que el enrutador pueda agregar los paquetes más pequeños en uno grande que pueda ser transmitirse en el enlace de salida de manera más eficiente.

Para los discos, este "retraso" podría caracterizarse por la política de caché de una capa FS determinada. En otras palabras, si una solicitud llega a una capa en el momento T, en lugar de salir de la capa en T+1 y llegar a la siguiente capa en T+1, podría salir/llegar a T+n. Una capa de caché de FS podría hacer esto, de modo que pueda buscar optimización/clasificación del orden.

El comportamiento que estás viendo es muy similar al de un socket TCP que redujo su ventana debido a la congestión.

Creo que es importante dividir las pruebas. Ahora mismo estás leyendo y escribiendo. Y no sabes cuál es el factor limitante/cuello de botella. Creo que sería útil dividir las pruebas en lectura o escritura. Un programa de referencia decente probablemente logrará esto. Lo que estoy defendiendo es una versión más sofisticada de [estos son sólo ejemplos aproximados, no los argumentos exactos a usar]:

Para escritura, tiempo dd if=/dev/zero of=/whatever_file count=64g
Para lectura, tiempo dd if=/whatever of=/dev/null count=64g
El motivo de 64 GB es que es el doble de tu RAM física y elimina los efectos del caché de bloque. Realice el comando de sincronización entre pruebas.

Aplique esto en FS local y repita en NFS.

Además, haz loleerprueba en cada uno de /dev/{sda,sdb,sdc,sdd}

Haga iostat durante estas pruebas.

Tenga en cuenta que realizar la prueba de lectura en el disco físico sin formato le brinda una línea de base/máximo de qué tan rápido puede funcionar realmente el hardware. Las lecturas sin procesar del dispositivo deben aproximarse a las capacidades máximas de las especificaciones de transferencia de sus unidades. La velocidad de escritura esperada debería ser similar para un disco duro. ¿Si no, porque no? Todos los discos deben probarse aproximadamente a la misma velocidad. Lo que busco aquí es la razón por la cual solo dos discos están al máximo en sus pruebas anteriores.

Haciendo los cálculos, con 32 GB y suponiendo una velocidad de transferencia máxima de 600 MB/seg, se necesitarían un mínimo de 50 segundos para llenar/vaciar eso. Entonces, ¿cuál es el tiempo de espera del parque?

Además, puede variar un poco las cosas reduciendo la cantidad de RAM física que permitirá el kernel a través del parámetro de arranque mem=. Pruebe algo como mem=8g para ver qué efecto tiene. También hay algunas entradas /proc que pueden ajustar la política de vaciado de caché de la capa de bloque.

Además, mis FS son ext4 y están montados con noatime. Quizás quieras considerarzfs set atime=off ...

Además, observe el registro del sistema. A veces, una unidad informa un error de detección y el sistema la reconfigura para utilizar una velocidad de transferencia más baja.

Además, eche un vistazo a los datos SMART de las unidades. ¿Ves algo inusual? Reintentos suaves excesivos en una unidad determinada (por ejemplo).

Como dije, el rendimiento del disco local es mucho menor de lo esperado. Creo que ese problema debe resolverse primero antes de abordar todo el sistema con NFS. Si todos los discos raid tuvieran una utilización equilibrada y estuvieran en el estadio, estaría menos preocupado por eso.

Mi sistema [que también tiene discos WDC] no está configurado para NFS (uso mucho rsync). Tengo algunas cosas urgentes que hacer durante los próximos 1 o 2 días. Después de eso, tendré tiempo para probarlo [yo mismo tendría curiosidad].

ACTUALIZACIÓN #2:

Buen truco para el problema del desequilibrio de ZFS. Esto ayuda a explicar mi "problema n.º 1". ÉlpodríaTambién explique la debilidad de NFS si las operaciones de reequilibrio de alguna manera confundieron a NFS con respecto a la latencia/sincronización, provocando el comportamiento de "ventana/retraso de TCP", no una probabilidad muy alta, pero de todos modos es una posibilidad.

Con las pruebas de rsync no es necesario ni deseo utilizar NFS. Si puede ingresar mediante ssh al servidor, rsyncyLos NFS son redundantes. Con NFS, simplemente use cp, etc. Para realizar rsync, vaya directamente al ZFS subyacente a través de ssh. Esto funcionará incluso sin un montaje NFS [aquí está la configuración de rsync que uso]:

exportar RSYNC_SSH="/usr/bin/ssh"
exportar SSH_NOCOMPRESS=1
rsync /dondequiera1 servidor:/zfsmount/lo que sea
Hacer este host local o vinculado puede lograr que el rendimiento sea el esperado (sin el problema del desequilibrio de ZFS). Si es así, claramente reduce el problema a NFS.sí mismo.

He examinado detenidamente algunas de las fuentes del kernel para NFS. Por lo poco que miré no me gustó lo que vi respecto a la puntualidad. NFS comenzó en los años 80, cuando los enlaces eran lentos, por lo que [todavía] tiene mucho código para intentar conservar el ancho de banda de la NIC. Es decir, sólo "comprometerse" [a] una acción cuando sea absolutamente necesario. No necesariamente lo que queremos. En mi extravagante analogía con la política del enrutador de red, la caché de NFS parecería ser la que tiene el retraso "T+n".

Recomiendo hacer todo lo posible para deshabilitar el caché de NFS y hacer que pase su solicitud a ZFS lo antes posible. Dejemos que ZFS sea el inteligente y NFS el "canal tonto". El almacenamiento en caché de NFS sólo puede ser de naturaleza genérica (por ejemplo, ni siquiera sabrá que el almacén de respaldo es un RAID o conocerá demasiado las características especiales del FS base en el que está montado). ZFS tiene un conocimiento profundo del RAID y de los discos que lo componen. Por lo tanto, la caché de ZFS puede ser mucho más inteligente en cuanto a las opciones.

Yo diría que intente hacer que NFS realice un montaje sincronizado; eso podría funcionar. Además, vi algo sobre noatime, así que activa esa opción también. Puede haber otras opciones de ajuste/montaje de NFS. Con suerte, si NFS es el sospechoso habitual, se puede reconfigurar para que funcione lo suficientemente bien.

Si, por otro lado, ninguna opción pone a NFS bajo control, ¿sería rsync sobre ssh una alternativa viable? ¿Cuál es el caso de uso real? Parece que está utilizando NFS como conducto para grandes transferencias masivas que necesitan un alto rendimiento (en comparación con [digamos] simplemente como un punto de montaje automático para los directorios de inicio de los usuarios). ¿Esto es para cosas como copia de seguridad del cliente en el servidor, etc.?

información relacionada