8 votos

¿Por qué el rendimiento del sistema de archivos nativo de Mac sería MUCHO peor que el de varios discos virtualizados en el mismo mac?

Estaba tratando de perfilar una aplicación php cuando me di cuenta de que se estaba ejecutando mucho más lento en mi mac vs docker vs virtualbox (todos en el mismo hardware). Empecé a reducir los posibles problemas, pero ahora no estoy seguro de dónde ir. Parece estar relacionado con el sistema de archivos o con las propias utilidades del núcleo, pero no estoy seguro.

Así que empecé a simplificar el problema y a hacer algunas pruebas. Volqué un gran número de archivos de la aplicación (~7.5K archivos, 74MB de tamaño total) como un conjunto de muestra para realizar operaciones en un solo dir, y luego copié el dir al contenedor, y la vm.

Prueba 1: time -p find . -type f -exec md5sum {} \; > /dev/null

Native | Docker | VirtualBox 
  27s  |   6s   |    5s

Prueba 2: time -p find . -type f -exec cp {} /dev/null \; > /dev/null

Native | Docker | VirtualBox
  16s  |   9s   |    7s

Prueba 3: time -p { dd if=/dev/zero of=/tmp/delme bs=4k count=100000 && sync; }

Native | Docker | VirtualBox
  0.7s |   0.8s |    0.4s

Con las 2 primeras pruebas, estaba tratando de probar la lectura y el funcionamiento de muchos archivos utilizando utilidades nativas. OSX era significativamente peor . Estaba tratando de probar la velocidad del disco en bruto con la tercera prueba.

Sé que esta metodología puede ser defectuosa o puede haber una manera más precisa de probar, pero esto es sólo lo que se me ocurrió y parecía lo suficientemente representativo para la solución de problemas. (Más detalles - He ejecutado cada prueba en cada env secuencialmente, repitió el proceso 3 veces, y tomó el promedio. El Mac es Catlina 10.15.3 encriptado APFS (no se reportan errores en la unidad). El contenedor Docker es debian:latest . VB VM es Ubuntu 16.04.

¿Qué puede estar pasando aquí? ¿Estoy pasando por alto algo obvio? ¿Es probable que las diferencias en el rendimiento del sistema de archivos? También corrí estas pruebas en un contenedor de la nube de linux que se ejecuta en AWS, y tenía números alineados con el Docker / VB VM. ¿Tiene algo que ver con la forma en que los archivos virtualizados son típicamente almacenados/leídos? ¿Importa la encriptación en el disco nativo (ya que todos están en última instancia en este disco)? ¿Podría ser algún proceso corporativo de seguridad de punto final que intercepte las lecturas/escrituras nativas? (No tengo conocimiento de ninguno, pero es un portátil de la empresa, y no sé todo lo que hay instalado, pero cuando ejecuto sudo htop No veo nada inusual para mí).

¿Alguna idea para seguir solucionando problemas? Utilizar una capa virtualizada sobre el hardware nativo para obtener una mejora de 2 a 4 veces no parece correcto.

Edición 1: Resultados con la limpieza de la caché del disco

Así que después de leer este enlace: https://stackoverflow.com/questions/28845524/echo-3-proc-sys-vm-drop-caches-on-mac-osx

Volví a ejecutar las pruebas con la caché del disco vaciada y noté el cambio () entre la primera y la segunda ejecución.

Para los nativos: sync && sudo purge; ejecute la prueba; vuelva a ejecutar la prueba inmediatamente;

Para Docker y VB: echo 3 > /proc/sys/vm/drop_caches; ejecute la prueba; vuelva a ejecutar la prueba inmediatamente;

Native | Docker | VirtualBox
  5s  |   3s  |    3s

Hubo una clara diferencia entre la primera y la segunda ejecución, pero todas mejoraron con el almacenamiento en caché del disco, y los tiempos de mis pruebas originales indican una caché cebada para todas las ejecuciones originales que anoté, y la diferencia de rendimiento aún se mantiene.

Edición 2: Compartir un script para que otros lo prueben/verifiquen

He escrito un corto script para crear algunos archivos de datos de muestra, simular una carga de trabajo similar a la que he descrito e imprimir los resultados. Luego lo ejecuté en un Macbook 2015 más antiguo que recientemente reinicié e instalé Catalina en él (así que no hay aplicaciones corporativas desconocidas, no encriptado APFS, etc.) lo he probado de forma nativa y usando Docker para Mac en esa máquina. Una vez más para las pruebas limitadas, la VM de linux (ejecutando docker) en el Mac superó significativamente a OSX. Luego probé con mi aplicación php original. El mismo resultado.

Si pruebas el script y notas resultados significativamente diferentes, por favor házmelo saber. Si alguien tiene sugerencias para mejorar el script/pruebas, por favor, hágalo, pero por lo demás hay ciertos escenarios/cargas de trabajo para los que simplemente no usaré OSX a partir de ahora y usaré una vm/docker en el Mac en su lugar.

4voto

Gordan Bobic Puntos 141

Lo que está viendo es la consecuencia de que su hipervisor le mienta sobre el disco escribir flushing, presumiblemente porque tiene activado el writeback caching de disco en la configuración de la VM. Desactive el escribir caché, y encontrará que el rendimiento va a ser mucho más similar (probablemente peor que el metal desnudo).

Como prueba secundaria, puede probar en su host por LD_PRELOAD-ing libeatmydata y deberías ver que el rendimiento de tu bare metal alcanza o supera el rendimiento en las VMs.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X