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.