Comment mettre en cache ou autrement accélérer les résumés `du`?

33

Nous avons un grand système de fichiers sur lequel un durésumé complet (utilisation du disque) prend plus de deux minutes. Je voudrais trouver un moyen d'accélérer un résumé d'utilisation du disque pour des répertoires arbitraires sur ce système de fichiers.

Pour les petites branches, j'ai remarqué que les durésultats semblent être mis en cache d'une manière ou d'une autre, car les demandes répétées sont beaucoup plus rapides, mais sur les grandes branches, l'accélération devient négligeable.

Existe-t-il un moyen simple d'accélérer duou de mettre en cache de manière plus agressive les résultats pour les branches qui n'ont pas été modifiées depuis la recherche précédente?

Ou existe-t-il une autre commande qui peut fournir des résumés d'utilisation du disque plus rapidement?

Ian Mackinnon
la source
8
Deux minutes ne me semblent pas si longues. Mais la vraie question est: "Voulez-vous vraiment que du cache quelque chose?" Du ne devrait-il pas vous donner un nombre de blocs de disque exact, aussi actuel que possible?
Bruce Ediger
Je suis d'accord que le remplacement duserait mauvais, mais un script wrapper plus rapide avec une interface identique nous serait très utile. De plus, je m'attendrais à ce que les résultats de mise en cache dépendant de l'heure de la dernière modification (et en supposant qu'aucune opération sur le disque, par exemple la défragmentation) ne donnerait des résultats de taille exacte: ai-je quelque chose?
Ian Mackinnon
2
Si vous êtes préoccupé par une utilisation excessive du disque, vous pouvez envisager d'implémenter un quota.
pyasi
2
Bruce - vous pourriez poser la même question find. Mais alors il y a locate.
Yuval
Si vous êtes sur Android , jetez un œil à StatFsune estimation ultra rapide de la taille des répertoires. Il était presque 1000 fois plus rapide pour les grands répertoires complexes que pour du.
Joshua Pinter

Réponses:

21

Ce que vous voyez lorsque vous réexécutez une commande du est l'effet de la mise en mémoire tampon du disque. Une fois que vous avez lu un bloc, son tampon de disque est conservé dans le cache de tampon jusqu'à ce que ce bloc soit nécessaire. Pour du, vous devez lire le répertoire et l'inode de chaque fichier du répertoire. Les résultats du ne sont pas mis en cache dans ce cas, mais peuvent être dérivés avec beaucoup moins d'E / S disque.

Bien qu'il soit possible de forcer le système à mettre en cache ces informations, les performances globales en souffriraient car l'espace tampon requis ne serait pas disponible pour les fichiers auxquels vous accédez activement.

Le répertoire lui-même n'a aucune idée de la taille d'un fichier, il faut donc accéder à l'inode de chaque fichier. Pour maintenir la valeur mise en cache à jour chaque fois qu'un fichier change de taille, la valeur mise en cache doit être mise à jour. Comme un fichier peut être répertorié dans 0 ou plusieurs répertoires, cela nécessiterait que chaque inode de fichier sache dans quels répertoires il est répertorié. Cela compliquerait considérablement la structure de l'inode et réduirait les performances d'E / S. De plus, comme du vous permet d'obtenir des résultats en supposant différentes tailles de bloc, les données requises dans le cache devraient augmenter ou diminuer la valeur mise en cache pour chaque taille de bloc possible, ce qui ralentit encore les performances.

BillThor
la source
7

Si vous pouvez faire en sorte que les différentes hiérarchies de fichiers appartiennent à différents groupes, vous pouvez configurer des quotas de disque . Ne donnez pas de limite supérieure (ou ne lui donnez pas la taille du disque) sauf si vous en voulez une. Vous serez toujours en mesure de dire instantanément la quantité de son quota (effectivement infini) que le groupe utilise.

Cela nécessite que votre système de fichiers prenne en charge les quotas par groupe. Ext de Linux [234] et zfs de Solaris / * BSD / Linux le font. Ce serait bien pour votre cas d'utilisation si les quotas de groupe prenaient en compte les ACL, mais je ne pense pas qu'ils le fassent.

Gilles, arrête de faire le mal
la source
7

L'utilisation courante de dupeut être considérablement accélérée en utilisant ncdu.

ncdu - NCurses Disk Usage

effectue le du, met en cache les résultats et les affiche dans une belle interface de ligne de commande, quelque peu comparable à du -hc -d 1 | sort -h. L'indexation initiale prend autant de temps du, mais la recherche du véritable «coupable» qui remplit un espace précieux est accélérée, car tous les sous-répertoires disposent des informations du cache initialement disponibles.

Si nécessaire, les sous-répertoires peuvent être actualisés en appuyant sur [r] et les fichiers / dossiers peuvent être supprimés en appuyant sur [d], qui mettent à jour les statistiques de tous les répertoires parents. La suppression demande une confirmation.

Si nécessaire, une accélération supplémentaire peut être obtenue en mettant ncdu -1xo- / | gzip >export.gzen cache dans un cronjob et en y accédant plus tard zcat export.gz | ncdu -f-, mais donne évidemment des informations plus obsolètes.

DennisH
la source
7

Je préfère utiliser le agesu

Agedu est un logiciel qui tente de trouver des fichiers anciens et utilisés de manière irrégulière en supposant que ces fichiers ne seront probablement pas recherchés. (Par exemple, les téléchargements qui n'ont été consultés qu'une seule fois.)

Il effectue essentiellement le même type d'analyse de disque que du, mais il enregistre également les derniers accès de tout ce qu'il analyse. Ensuite, il construit un index qui lui permet de générer efficacement des rapports donnant un résumé des résultats pour chaque sous-répertoire, puis il produit ces rapports à la demande.

SHW
la source
4
Ne répond pas à la question, mais quand même +1. Bon conseil.
0xC0000022L
J'ai édité la question pour qu'il soit plus clair que cela répond réellement à la question (agesu indexe l'utilisation du disque ainsi que le temps d'accès).
Anthony G - justice pour Monica
5

Comme mentionné par SHW, en agedueffet créé un index. J'ai pensé partager une autre façon de créer un index, après avoir lu locatedb. Vous pouvez créer votre propre version d'une locatedbde dusortie:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkréorganise la sortie du pour avoir les noms de fichiers en premier, afin que cela frcodefonctionne correctement. Utilisez ensuite locateavec cette base de données pour signaler rapidement l'utilisation du disque:

locate --database=du.locatedb pingus

Vous pouvez l'étendre en fonction de vos besoins. Je pense que c'est une bonne utilisation de locatedb.

Yuval
la source
3
duc

(voir https://duc.zevv.nl ) pourrait être ce que vous recherchez.

Duc stocke l'utilisation du disque dans une base de données optimisée, résultant en une interface utilisateur rapide. Aucun temps d'attente une fois l'index terminé.

La mise à jour de l'index est très rapide pour moi (moins de 10 secondes pour environ 950k fichiers dans 121k répertoires, 2,8 To). Possède également une interface graphique et une interface utilisateur ncurses.

Utilisation par exemple:

duc index /usr
duc ui /usr

Depuis le site Web:

Duc est conçu pour s'adapter à d'énormes systèmes de fichiers: il indexera et affichera sans problème des centaines de millions de fichiers sur des pétaoctets de stockage.

Peter
la source
2

J'ai un cronjob configuré pour exécuter updatedb toutes les 10 minutes. Garde tous les tampons du système de fichiers agréables et frais. Autant utiliser cette RAM bon marché pour quelque chose de bien. Utilisez slabtop voir «avant» et «après».

Marcin
la source
Je ne comprends pas comment votre réponse se rapporte à la question. updatedbne dit rien sur l'utilisation du disque. Si vous le faites juste pour parcourir le disque, vous allez nuire aux performances globales.
Gilles 'SO- arrête d'être méchant'
3
Le comptage des tailles de fichiers duest lent car vous devez accéder aux métadonnées d'un nombre potentiellement important de fichiers, dispersés sur le disque. Si vous exécutez agressivement updatedb, les métadonnées de tous les fichiers sont forcées d'être stockées dans la RAM. La prochaine fois que vous exécutez une autre opération lourde de métadonnées, au lieu d'effectuer des milliers de recherches sur les disques, vous utilisez le cache. Normalement, vous avez une petite chance d'avoir cette partie particulière des métadonnées de l'arbre en cache. Avec mon 'amorçage du cache de métadonnées', il est très probable que les données que vous souhaitez soient fraîchement mises en cache. Aucune recherche physique == RAPIDE.
Marcin
2

Si vous avez seulement besoin de connaître la taille du répertoire, vous pouvez l'accélérer beaucoup en évitant simplement d'écrire les informations à l'écran. Puisque le total général est la dernière ligne de la ducommande, vous pouvez simplement le diriger vers tail.

du -hc | tail -n 1

Une structure de répertoire de 2 Go prend plus d'une seconde pour la liste complète, mais moins d'un cinquième de celle-ci avec ce formulaire.

Franc
la source
2
Je pense que du -hsc'est plus pratique à cet effet.
lepe
1
aussi--max-depth 1
stevesliva