web-dev-qa-db-fra.com

Montez / usr dans RAM (chargement depuis le disque dur au démarrage et enregistrement sur lors de la fermeture)

J'ai le scénario actuel:

  • 16 Go ou RAM. Pour la plupart, environ 10 ~ 12 Go non utilisés

  • Presque jamais installer/supprimer un logiciel, c'est un système mature

  • Ne redémarrez qu'une fois par semaine, le temps de (re) démarrage n'a donc aucune importance

  • /usr fait environ 8 Go

  • Le disque dur est lent et aucun budget n'est prévu pour changer cela dans un avenir proche

  • Monter /tmp comme tmpfs dans fstab a fait des merveilles pour la performance

Et je viens d'avoir cette idée folle:

Est-il possible, d'une manière ou d'une autre, d'utiliser ma RAM pour "stocker" /usr?

En cela, lors du démarrage, il lit le contenu actuel de /usr sur le disque dur et le copie dans un fichier tmpfs et le monte en tant que /usr?

Si possible, rincer également le contenu (peut-être mis à jour) sur le disque dur lors de la fermeture? Ou peut-être me permettant de facilement "basculer temporairement sur le disque dur" lorsque finalement nécessaire pour installer/supprimer un nouveau logiciel ou des mises à jour?

Toute approche est la bienvenue, les commandes prêtes à l’emploi seront très appréciées.

Merci!

4
MestreLion

C'est possible, mais inutile. Le noyau conserve un cache des données du disque dans la RAM. Les données que vous avez utilisées le plus récemment sont conservées dans la RAM. Vous allez naturellement vous retrouver avec les parties de /usr que vous utilisez souvent dans la RAM, et les parties que vous n'utilisez pas ne prendront pas de mémoire vive.

Si vous souhaitez un meilleur temps de réaction lorsque vous démarrez une application, vous pouvez ensemencer le cache. Un fichier est chargé en mémoire lors de la première utilisation et y reste jusqu'à ce que la mémoire soit réutilisée. Vous pouvez forcer le chargement d’un fichier:

cat /path/to/file >/dev/null

Par exemple, pour précharger tous les exécutables et les bibliothèques dans la RAM:

cat /bin/* /lib/* /usr/bin/* /usr/lib/* >/dev/null

Cela peut prendre un certain temps, vous devez donc le faire en arrière-plan. Vous pouvez mettre la commande suivante dans /etc/rc.local:

ionice -c 3 cat /bin/* /lib/* /usr/bin/* /usr/lib/* >/dev/null &

Pour charger également toutes les bibliothèques dans les sous-répertoires de /usr/lib*, il pourrait être utile d’exécuter find:

ionice -c 3 find /bin /usr/bin /usr/lib* -type f -exec ionice -c 3 cat '{}' ';' > /dev/null &
7
Gilles
ionice -c 3 cat /bin/* /lib/* /usr/bin/* /usr/lib/* >/dev/null &

Ne fonctionnera pas, car il y a beaucoup de répertoires dans les bibliothèques. essayez de trouver:

ionice -c 3 find /bin /usr/bin /usr/lib* -type f -exec cat '{}' ';' > /dev/null &

Tout ce qu'il produit va dans/dev/null pour que rien ne vous agace.

Je pense que les deux ionice sont obligatoires car find exécute les commandes dans un processus propre. Corrigez-moi si j'ai tort, s'il-vous plait. (On dirait que je me suis trompé.)

Cette ligne dans rc.local devrait faire l'affaire à la réponse déjà choisie.

[modifier] supprime le deuxième "ionice" comme suggéré dans le commentaire.

2
qwc