lsof fonctionne très lentement sur mon serveur

8

J'exécute lsof dans l'un de mes serveurs Linux pour vérifier si un fichier ( /tmp/incoming_data.txt) du système ext3 est ouvert par d'autres programmes. Mon serveur a beaucoup de connexion TCP dessus. Ce qui est étrange, c'est que l'exécution de 'sudo lsof' prend environ deux minutes et qu'il utilise 99.x% CPU pendant ces deux minutes.

La commande que j'ai utilisée est sudo lsof /tmp/incoming_data.txt. J'ai essayé " fuser " qui prend à peu près la même quantité de CPU et de temps d'exécution. Puis-je faire quelque chose pour résoudre ce problème?

James Gan
la source
Après ces deux minutes, que lsofmontre-t-on? Combien de processus et de threads ce fichier a-t-il ouvert? Quelle est la charge du processeur lorsque vous n'exécutez pas lsof?
Michael Martinez

Réponses:

7

Si vous êtes certain de pouvoir ignorer les connexions TCP ou UDP ouvertes, puisque vous en avez mentionné qu'elles sont trop nombreuses, vous pouvez utiliser l'option spécifique au dialecte de lsof -X.

lsof -X

Lisez la page de manuel de lsof et recherchez '-X' pour des informations détaillées.

Daniel t.
la source
16

Passez l' -noption pour ignorer la résolution des noms DNS des connexions IP. Ce sera certainement la partie la plus importante de tout ralentissement.

Zoredache
la source
1
Bonjour @Zoredache, merci beaucoup pour la réponse. J'ai essayé les options -n et -P et les deux ne semblent pas aider cependant. Merci tout de même!
James Gan
S'il est encore lent, je le ferais probablement avec strace et voir si je pouvais comprendre pourquoi il était lent.
Zoredache
1
Cela a fonctionné pour moi sur MacOS X El Capitan
Andrew Miner
@JamesGan J'ai le même problème. Avez-vous déjà compris le problème?
Noldorin
Génial. Cela a fonctionné pour moi sur MacOS 10.14
Ninja
0

J'ai trouvé ce petit paquet NPM qui accélère merveilleusement lsof pour les fichiers: https://www.npmjs.com/package/lsof-mac-fast .

J'ai créé un script wrapper pour l'utiliser:

node ~/tools/MacOs/lsof.js db.mv.db 1000
repeating using interval: 1000
COMMAND  PID  USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
java    7336 jumar  256u   REG    1,4 194465792 53854404 
db.mv.db

Voici mon script:

// https://www.npmjs.com/package/lsof-mac-fast
var fastLsof = require('lsof-mac-fast');

var myArgs = process.argv.slice(2);
var fileToCheck = myArgs[0];
var repeatIntervalMs = myArgs[1];
// console.log('myArgs: ', myArgs);

function lsofFile(file) {
  fastLsof.lsof([file], function(err, stdout, stderr) {process.stdout.write(stdout)});
}

if (repeatIntervalMs) {
  // repeat until killed
  // https://javascript.info/settimeout-setinterval
  console.log('repeating using interval: ' + repeatIntervalMs);
  var timerId = setInterval(() => lsofFile(fileToCheck),  repeatIntervalMs);
} else {
  // just one time
  lsofFile(fileToCheck);
}

L'intervalle de répétition peut être très faible, par exemple 10 ms semble fonctionner correctement.

Juraj Martinka
la source