web-dev-qa-db-fra.com

Forcer le répertoire à toujours être dans le cache

J'ai testé différentes méthodes pour améliorer le temps nécessaire pour compiler tout mon projet C++. Actuellement, il faut environ 5 minutes. J'ai expérimenté Discc, Ccache et d'autres. Récemment, j'ai découvert que si je copie tout mon projet sur un lecteur RAM, puis compilez de là, il réduit la compilation jusqu'à 30% de son original-- seulement 1,5 minute.

Évidemment, travailler du RAM Lecteur n'est pas pratique. Donc, quelqu'un sait-elle d'une manière que je peux forcer le système d'exploitation à toujours garder une certaine mise en cache de répertoire? I? Vous voulez toujours que le répertoire soit synchronisé sur le disque comme normal, mais je souhaite toujours une copie des données en mémoire. Est-ce que cela est possible?

éditer : En tant que solution possible, nous avons juste pensé à lancer un démon qui exécute rsync toutes les 10 secondes ou de synchroniser le lecteur de disque avec A RAM = lecteur. Ensuite, nous exécutons la compilation du RAM lecteur. Le rsync _ est flamboyant vite, mais cela fonctionnerait-il vraiment? Le système d'exploitation pourrait sûrement faire mieux ....

37
JaredC

Le moyen évident de conserver un tas de fichiers dans le cache est d'y accéder souvent. Linux est plutôt bon pour arbitrer entre échange et mise en cache, alors je soupçonne que la différence de vitesse que vous observez n'est en réalité pas due au système d'exploitation ne garantit pas les choses dans le cache, mais à une autre différence entre votre utilisation de TMPFS et vos autres tentatives.

Essayez d'observer ce qui se fait IO dans chaque cas. L'outil de base pour cela est iotop . Les autres outils peuvent être utiles; voir Disque Linux IO Coffre de charge, par chemin de fichier de fichiers et/ou processus? , quel programme sous Linux peut mesurer les E/S au fil du temps? et autres threads au défaut de serveur.

Voici quelques hypothèses quant à ce qui pourrait se passer. Si vous prenez des mesures, veuillez les montrer afin que nous puissions confirmer ou réfuter ces hypothèses.

  • Si vous avez des fichiers Horaires d'accès activés, le système d'exploitation peut perdre un peu de temps à écrire ces temps d'accès. Les heures d'accès sont inutiles pour un arbre de compilation, assurez-vous donc d'être désactivé avec l'option noatime. Votre solution TMPFS + RSYNC n'a jamais lit à partir du disque dur, de sorte qu'il ne doit jamais passer de temps supplémentaire à écrire chez soi.
  • Si les écritures sont synchronisation , soit parce que le compilateur appelle sync() ou parce que le noyau affleure fréquemment ses tampons de sortie, les écrivies prendront plus de plus sur un disque dur que les TMPFS.

Linux Par défaut Utilisez le RAM comme cache de disque. En tant que démonstration, essayez d'exécuter time find /some/dir/containing/a/lot/of/files > /dev/null Deux fois, la deuxième fois est beaucoup plus rapide car chaque disque d'inode est mis en cache. Le point ici est de savoir comment utiliser cette fonctionnalité du noyau et arrêter votre tentative de la remplacer.

Le point est de changer le swappiness. Considérons trois types principaux d'utilisation de la mémoire: programmes actifs, programmes inactifs et cache de disque. De toute évidence, la mémoire utilisée par les programmes actifs ne doit pas être échangée et le choix entre deux autres est assez arbitraire. Souhaitez-vous une commutation rapide du programme ou un accès rapide au fichier? A faible taille Préfère à Gardez les programmes en mémoire (même s'il n'est pas utilisé pendant longtemps) et a Butée élevé Préfère to Gardez plus de cache de disque (en échangeant des programmes inutilisés). (L'échelle de l'échange est de 0 à 100 et la valeur par défaut est de 60)

Ma solution à votre problème est de changer l'échantillon à très élevé (90-95 pour ne pas dire 100) et pour charger le cache:

echo 95 | Sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

Comme vous le devinez, vous devez avoir suffisamment de mémoire libre pour tenir en cache tous vos fichiers source et vos fichiers d'objet, ainsi que le compilateur, les fichiers d'en-têtes inclus, les bibliothèques liées, votre IDE et autres programmes utilisés .

8
shellholic

Cette chose semble fonctionner pour moi si je veux conserver certains fichiers ou tous les fichiers dans un certain répertoire du cache.

vmtouch Semble faire exactement la chose. Exemple 5 Il pourrait y avoir ce dont vous avez besoin.

vmtouch -dl /whatever/directory/

J'avais besoin de le courir comme la racine avec Sudo

6
Highstaker

Forcer le cache n'est pas la bonne façon de le faire. Mieux vaut maintenir des sources sur le disque dur et les compiler sur TMPFS. De nombreux systèmes de construction, tels que QMake et Cumake, prend en charge des constructions hors source.

6
gelraen

Le démon inosync démon semble que cela fait exactement ce que vous voulez si vous allez à RSYNC à un RAMDISK. Au lieu de rsyncing toutes les 10 secondes environ, il utilise la facilité d'inotification de Linux sur RSYNC lorsqu'un fichier change. Je l'ai trouvé dans le référentiel debian comme le package inosync ou sa source est disponible à http://bb.xnull.de/projects/inosync/ .

6
Jander

Compte tenu de la mémoire suffisante, votre construction de la ramdisk n'entre pas d'E/S. Cela peut accélérer tout ce qui lit ou écrit des fichiers. E/S est l'une des opérations les plus lentes. Même si vous avez tout mis en cache avant la construction, vous avez toujours l'I/OS pour écrire, bien qu'ils aient un impact minimal.

Vous pouvez obtenir un peu de vitesse en pré-chargement de tous les fichiers dans le cache, mais le temps nécessaire à celui-ci devrait être inclus dans les temps de construction totaux. Cela peut ne pas vous donner beaucoup d'avantage.

Construire l'objet et les fichiers intermédiaires dans RAM plutôt que sur le disque. Faire des constructions incrémentielles peut obtenir des gains importants sur des constructions fréquentes. Sur la plupart des projets, je fais une construction propre et des constructions incrémentielles quotidiennes. Sont toujours des constructions propres, mais j'essaie de les limiter à moins d'une par jour.

Vous pouvez obtenir des performances en utilisant une partition ext2 avec ATime éteint. Votre source devrait être dans la commande de version sur un système de fichiers journalisé comme EXT3/4.

3
BillThor

Comme indiqué précédemment, la manière évidente est de lire toute la structure de répertoire et du contenu du fichier de ce que vous souhaitez être mis en cache.

Vous pouvez l'automatiser en écrivant un script pour surveiller la sortie de vmstat 1 (Utilisez n'importe quel outil équivalent de votre système d'exploitation) et conservez une somme du nombre de blocs écrits et lus. Une fois que la somme passe un seuil de votre choix, lisez tous les fichiers que vous souhaitez mettre en cache, réinitialiser la somme, puis continuer à surveiller la sortie VStat. Pour la lecture rapide des fichiers: si votre arbre contient de nombreux fichiers, évitez find ... -exec cat, essayez plutôt find ... -print0 | xargs -0 cat ou un programme personnalisé qui n'exécutera pas de chat pour chaque fichier.

Disque de surveillance IO est préférable à utiliser un intervalle fixe car il signale de relire vos données plus ou moins fréquemment en fonction du disque IO Load.

J'ai utilisé cette méthode automatisée avec succès sur les systèmes où j'avais besoin de certains lectures de fichier d'index pour toujours être rapides, en évitant le disque dur I/O. J'ai également utilisé la Strace pour créer une liste de chaque fichier accessible lorsque je me connecte afin que je puisse tout garder chaud dans le cache pour connaître les connexions rapides.

Cela peut ne pas être la meilleure solution possible, mais cela m'a bien adapté.

2
filebarn