1 votes

Qu'est-ce qui peut causer "l'inscription dans un annuaire" sur Android à être de 50 à 250 fois plus lent que prévu?

Je me suis retrouvé avec mon appareil Android (Google Pixel 7a, sur AOSP 15) ayant accumulé environ ~14k fichiers vidéos/photos dans /sdcard/DCIM/Camera. En conséquence, j'ai remarqué un délai très inattendu lors de la liste de ce répertoire dans ce dossier particulier, mais aussi en général.

Je lance les tests suivants

[user@archlinux-box ~] $ ## ayant le Pixle 7a connecté via un port USB-3 debugger USB
[user@archlinux-box ~] $ adb shell
lynx:/ $ ## chronométrer la liste de /sdcard/DCIM/Camera
lynx:/ $ (cd /sdcard/DCIM/Camera; time ls | wc)
  13980   13980  398700
    0m04.55s réel     0m00.07s utilisateur     0m00.31s système
lynx:/ $ ## exclure que ce soit une faute du binaire `ls` je vérifie également via `find`
lynx:/ $ (cd /sdcard/DCIM/Camera; time find | wc)
  13981   13981  426662
    0m05.25s réel     0m00.07s utilisateur     0m00.41s système

Soupçonnant que la liste de ~14k fichiers pourrait prendre un certain temps, mais pas ~5 secondes (et encore moins lors des lectures de liste de répertoires supplémentaires, étant donné que je suppose qu'une mise en cache se produit) j'ai testé si cela est lié au dossier spécifique /sdcard/DCIM/Camera en le faisant

lynx:/ $ ## créer et entrer dans un répertoire de test pour contenir 14k fichiers
lynx:/ $ mkdir /sdcard/14k-files-dir
lynx:/ $ cd  /sdcard/14k-files-dir
lynx:/sdcard/14k-files-dir $ ## créer 14k fichiers de manière assez efficace
lynx:/sdcard/14k-files-dir $ ## avoir des noms de fichiers de longueur comparable aux fichiers photo
lynx:/sdcard/14k-files-dir $ PREFIX='nom-de-fichier-similaire-aux-fichiers-photo-fichier-no-'
lynx:/sdcard/14k-files-dir $ seq 1 14000 | sed 's/^/'"$PREFIX"'/' | xargs sh -c 'touch "$@"' _
lynx:/sdcard/14k-files-dir $ ## rerun tests
130|lynx:/sdcard/14k-files-dir $ time ls | wc
  14000   14000  618894
    0m01.92s réel     0m00.10s utilisateur     0m00.28s système
lynx:/sdcard/14k-files-dir $ time find | wc
  14001   14001  646896
    0m00.72s réel     0m00.03s utilisateur     0m00.13s système
lynx:/sdcard/14k-files-dir $ time ls | wc
  14000   14000  618894
    0m00.80s réel     0m00.10s utilisateur     0m00.13s système

comme on peut le voir cette fois, la liste du répertoire est beaucoup plus rapide (surtout une fois qu'il semble être en cache).

Enfin, je voulais tester - Android étant basé sur le noyau Linux - à quel point mon ordinateur portable de plus de 10 ans se comparerait.

[user@archlinux-box ~] $ ## test sur un ordinateur portable de 10 ans
[user@archlinux-box ~] $ mkdir 14k-files-dir
[user@archlinux-box ~] $ cd 14k-files-dir
[user@archlinux-box 14k-files-dir ] $ ## créer 14k fichiers de manière assez efficace
[user@archlinux-box 14k-files-dir ] $ ## avoir des noms de fichiers de longueur comparable aux fichiers photo
[user@archlinux-box 14k-files-dir ] $ PREFIX='nom-de-fichier-similaire-aux-fichiers-photo-fichier-no-'
[user@archlinux-box 14k-files-dir ] $ seq 1 14000 | sed 's/^/'"$PREFIX"'/' | xargs sh -c 'touch "$@"' _
[user@archlinux-box 14k-files-dir ] $ ## exécuter les tests sur l'ordinateur portable
[user@archlinux-box 14k-files-dir]$ time ls | wc
  14000   14000  632894

réel    0m0.025s
utilisateur    0m0.015s
système    0m0.014s
[user@archlinux-box 14k-files-dir]$ time find | wc
  14001   14001  660896

réel    0m0.030s
utilisateur    0m0.019s
système    0m0.020s
[user@archlinux-box 14k-files-dir]$ time ls | wc
  14000   14000  632894

réel    0m0.021s
utilisateur    0m0.009s
système    0m0.015s

Comme on peut le voir, la vitesse de liste des répertoires diffère grandement. Je suis perplexe pour déterminer les raisons.

  1. Il est surtout peu clair pourquoi la comparaison directe "sur l'appareil Android" des temps de liste des répertoires est si énorme (1-0.7 secondes contre 4-5 secondes pour /sdcard/DCIM/Camera)
  2. C'est déconcertant car je m'attendrais à ce que les deux dossiers résident sur le même périphérique de bloc et le même système de fichiers en dessous de /sdcard ?
  3. Dans une perspective plus large, cependant, je ne peux pas comprendre (et cherche avec cette question les causes pour lesquelles un ordinateur portable Linux de 10 ans peut répertorier 14k fichiers en 0,02 secondes alors qu'un Google Pixel 7a plutôt récent a besoin de 0,7 à 5+ secondes, soit de manière évidente 250 fois plus longtemps ?

Mise à jour# J'ai trouvé ces informations sur Reddit qui mentionnent

Comme mentionné ci-dessous, il semble qu'avec Android 11, tout l'accès aux fichiers externes passe par SAF, même en ciblant l'API 29 et en utilisant les fonctions d'accès aux fichiers standard. C'est un changement par rapport à Android 10. Cela explique la différence de vitesse.

Je me demande donc (en ce qui concerne les causes que je recherche dans cette question ici) si c'est toujours la raison?

Avec ces nouvelles informations, je ne vois toujours pas pourquoi les deux dossiers ont des vitesses de recherche de répertoires différentes de 5 à 10 fois.

0voto

John Dallman Points 123

Réponse partielle

Je ne peux pas expliquer tout cela, mais je peux en expliquer des parties.

Ordinateur portable vs /sdcard

Cet ordinateur portable Linux utilise probablement des systèmes de fichiers ext3 ou ext4? Ceux-ci sont bien plus efficaces que le système de fichiers FAT32 simpliste que Android utilise (en réalité, émule via sdcardfs) sur /sdcard, et fonctionnent beaucoup plus rapidement.

Pourquoi Android utilise-t-il FAT32?

Android doit être capable de gérer le stockage sur des cartes mémoire amovibles (généralement des cartes micro-SD), et ces cartes doivent être lisibles, inscriptibles et formattables sur Windows, Linux et macOS. Tous ces systèmes d'exploitation de bureau/portable peuvent gérer FAT32, mais les faire gérer les systèmes de fichiers principaux des uns et des autres est bien plus difficile.

Android a également la capacité de "adopter" une carte mémoire comme partie du stockage de l'appareil, et c'est bien plus simple si le stockage de l'appareil utilise le même type de système de fichiers qu'une carte mémoire.

Pour plus de complexité, le système de fichiers interne natif d'Android est ext4 mais il utilise un pilote FUSE ("Filesystem in Userspace") pour permettre au stockage interne d'être accédé comme du FAT32.

Pourquoi la liste de 14 000 fichiers de zéro octet est-elle plus rapide que 14 000 photos?

C'est la partie que je ne connais pas, mais l'expérience évidente est de créer 14 000 fichiers, chacun de la taille de vos photos typiques, et de voir si c'est aussi lent que les photos. Je m'attends à ce que ce le soit.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X