2010-07-19 12 views
1

J'ai créé une invite Bash qui, lorsque le répertoire de travail est un référentiel Git, affiche le nom du référentiel actuel. En outre, il contient la tâche en cours en cours et le temps passé à le faire (à partir d'un outil de chronométrage homebrew). Ceci, bien sûr, signifie que simplement afficher l'invite signifie exécuter deux processus.Détection de la charge du système en mettant l'accent sur le «swap thrashing» sous Linux

Cela a l'inconvénient que si le système est débattait pour une raison quelconque, il faut toujours pour obtenir une invite à faire killall nécessaire pour sauver le système, que le chargement juste le binaire git est trop demander du système un tel état. Donc, à l'heure actuelle, l'invite est désactivée par défaut et n'est activée que sur demande, mais ce n'est pas très confortable. Il serait plus agréable de détecter la charge dans .bashrc et d'activer uniquement l'invite si le système fonctionne correctement (c'est-à-dire avec une latence de disque acceptable).

Dans de telles situations, le processeur est assez bon marché, seul le disque est cher. J'ai donc besoin d'un moyen qui détecte le débordement sans dépendre des utilitaires externes.

Indice: /proc peut avoir quelque chose d'utile. Par exemple. /proc/loadavg résoudrait mon problème si c'était le CPU qui causait les goulots d'étranglement, pas le disque.

+0

I'D dites que votre invite est peut-être un peu trop intelligent. Un programme essayant de s'exécuter alors que le système est en swap thrash, même juste pour vérifier s'il devrait fonctionner, va bloquer l'attente de core (files d'attente de priorité modulo et hasard aléatoire).Par la présente, je l'appelle l'invite Catch-22: le programme qui doit exécuter pour déterminer si elle a la capacité de courir;) – msw

+0

pas de problème si vous pouviez le résoudre entièrement dans bash ?? – mvds

+0

@mvds: Ce serait même préférable! – AttishOculus

Répondre

2

vmstat pourrait vous aider. Si vous ne voulez pas l'utiliser, toutes les informations sont sur

  • /proc/meminfo
  • /proc/stat
  • /proc/PID/stat
2

La meilleure façon serait de vérifier le premier octet de /proc/loadavg, et seulement continuer quand il est un 0

Cela fonctionne

loadavg=$(</proc/loadavg) 
if [ "${loadavg:0:1}" = "0" ]; then echo "all clear"; fi 

Mais vous avez toujours test (ou [) qui peut être exécuté, bien que cela puisse être un bash intégré. edit^2 c'est un builtin au moins dans bash 3.2.39 mais je suspecte qu'il a été intégré depuis longtemps. Donc, tout peut arriver sans un autre processus.

modifier^3: mise à jour, pour le contrôle à grain fin:

if [ "${loadavg:0:1}${loadavg:2:2}" -lt "60" ]; then echo "below 0.6"; fi 

modifier^4: Je ne peux pas imaginer que le disque d'E/S est le goulot d'étranglement pour le problème à portée de main. Tant que vous n'écrivez pas, mais que vous lisez seulement, à partir d'endroits qui sont mis en cache de toute façon, c'est un problème de mémoire/cpu pur.

modifier^5: Bien sûr, cela est le cas 1 cpu, multipliez le pourcentage de seuil par le nombre de cœurs (pour les processeurs HT, prendre la moitié des « noyaux » pour être sûr)

+0

points bonus pour tous ceux qui parviennent à intégrer '$ (<...)' dans '$ {... ::}', ce qui semble impossible. – mvds

+0

Drôle, 'bash' * does * fork off pour lire'/proc/loadavg'. Je suppose qu'il n'y a rien que vous puissiez faire à ce sujet, mis à part patcher 'bash' bien sûr. – mvds

+0

@mvds: un shell se déconnecte pour presque tout faire. –