J'étais en train d'essayer de profiler une application php lorsque j'ai remarqué qu'elle fonctionnait BEAUCOUP plus lentement sur mon mac vs docker vs virtualbox (tous sur le même matériel). J'ai commencé à réduire les problèmes possibles, mais maintenant je ne suis pas sûr de savoir où aller. Il semble que ce soit lié au système de fichiers ou aux utilitaires de base eux-mêmes, mais je ne suis pas sûr.
J'ai donc commencé à simplifier le problème et à effectuer quelques tests. J'ai déversé un grand nombre de fichiers de l'application (~7.5K fichiers, 74MB de taille totale) comme un ensemble d'échantillons pour effectuer des opérations sur un seul répertoire, puis j'ai copié le répertoire dans le conteneur, et la vm.
Test 1 : time -p find . -type f -exec md5sum {} \; > /dev/null
Native | Docker | VirtualBox
27s | 6s | 5s
Test 2 : time -p find . -type f -exec cp {} /dev/null \; > /dev/null
Native | Docker | VirtualBox
16s | 9s | 7s
Test 3 : time -p { dd if=/dev/zero of=/tmp/delme bs=4k count=100000 && sync; }
Native | Docker | VirtualBox
0.7s | 0.8s | 0.4s
Avec les 2 premiers tests, j'essayais de tester la lecture et l'exploitation de nombreux fichiers en utilisant les utilitaires natifs. OSX était nettement moins bon . J'essayais de tester la vitesse brute du disque avec le troisième test.
Je sais que cette méthodologie peut être imparfaite ou qu'il peut y avoir des moyens plus précis de tester, mais c'est juste ce que j'ai trouvé et qui m'a semblé suffisamment représentatif pour le dépannage. (Plus de détails - j'ai exécuté chaque test sur chaque env séquentiellement, répété le processus 3 fois, et pris la moyenne. Le Mac est un APFS crypté Catlina 10.15.3 (aucune erreur n'a été signalée sur le disque). Le conteneur Docker est debian:latest
. La VM VB est Ubuntu 16.04.
Que se passe-t-il donc ici ? Ai-je oublié quelque chose d'évident ? S'agit-il probablement des différences de performances du système de fichiers ? J'ai également effectué ces tests sur un conteneur cloud linux fonctionnant sur AWS, et les chiffres étaient alignés sur ceux de la VM Docker/VB. Est-ce que cela a quelque chose à voir avec la façon dont les fichiers virtualisés sont généralement stockés / lus ? Le cryptage du disque natif a-t-il une importance (puisqu'ils sont tous sur ce disque) ? Est-ce que cela pourrait être un processus de sécurité du point final de l'entreprise qui intercepte les lectures/écritures natives ? (Je n'en ai pas connaissance, mais il s'agit d'un ordinateur portable de l'entreprise et je ne connais pas toutes les installations, mais lorsque j'exécute le programme sudo htop
Je ne vois rien d'inhabituel).
Des idées pour la suite du dépannage ? L'utilisation d'une couche virtualisée au-dessus du matériel natif pour obtenir une amélioration de 2 à 4 fois semble erronée.
Édition 1 : Résultats de l'effacement du cache du disque
Après avoir lu ce lien : https://stackoverflow.com/questions/28845524/echo-3-proc-sys-vm-drop-caches-on-mac-osx
J'ai refait les tests avec un cache disque nettoyé et j'ai noté le changement () entre la première et la deuxième exécution.
Pour les autochtones : sync && sudo purge;
exécuter le test ; exécuter à nouveau le test immédiatement ;
Pour Docker et VB : echo 3 > /proc/sys/vm/drop_caches;
exécuter le test ; exécuter à nouveau le test immédiatement ;
Native | Docker | VirtualBox
5s | 3s | 3s
Il y avait une nette différence entre la première et la deuxième exécution, mais elles se sont toutes améliorées avec la mise en cache du disque, et les temps de mes tests originaux indiquent un cache amorcé pour toutes les exécutions originales que j'ai notées, et la différence de performance subsiste toujours.
Edit 2 : Partage d'un script pour que d'autres puissent le tester/vérifier
J'ai écrit un court script pour créer des exemples de fichiers de données, simuler une charge de travail similaire à celle que j'ai décrite et imprimer les résultats. Je l'ai ensuite exécuté sur un ancien Macbook 2015 que j'ai récemment réinitialisé et sur lequel j'ai installé Catalina (donc pas d'applications d'entreprise inconnues, pas de crypté APFS, etc.) Je l'ai testé en mode natif et en utilisant Docker pour Mac sur cette machine. Une fois de plus, pour les tests limités, la VM linux (exécutant Docker) sur le Mac a été nettement plus performante qu'OSX. J'ai ensuite essayé avec mon application php originale. Même résultat.
Si vous essayez le script et que vous remarquez des résultats significativement différents, merci de me le faire savoir. Si quelqu'un a des suggestions pour améliorer le script/tests, n'hésitez pas, mais sinon il y a certains scénarios/charges de travail pour lesquels je n'utiliserai tout simplement pas OSX à partir de maintenant et j'utiliserai un vm/docker sur le Mac à la place.