lsof läuft auf meinem Server sehr langsam

8

Ich führe lsof auf einem meiner Linux-Server aus, um zu überprüfen, ob eine Datei ( /tmp/incoming_data.txt) im ext3-System von anderen Programmen geöffnet wird. Mein Server hat viele TCP-Verbindungen. Das Seltsame ist, dass die Ausführung von 'sudo lsof' ungefähr zwei Minuten dauert und in diesen zwei Minuten 99x% CPU verbraucht.

Der Befehl, den ich verwendet habe, ist sudo lsof /tmp/incoming_data.txt. Ich habe " Fixiereinheit " ausprobiert, die ungefähr die gleiche Menge an CPU und Ausführungszeit benötigt. Kann ich dieses Problem beheben?

James Gan
quelle
Was zeigt sich nach Ablauf dieser zwei Minuten lsof? Wie viele Prozesse und Threads haben diese Datei geöffnet? Was ist die CPU-Auslastung, wenn lsof nicht ausgeführt wird?
Michael Martinez

Antworten:

7

Wenn Sie sicher sind, dass Sie die offenen TCP- oder UDP-Verbindungen überspringen können, können Sie die dialektspezifische Option von lsof verwenden, da Sie erwähnt haben, dass es zu viele davon gibt -X.

lsof -X

Lesen Sie die Manpage von lsof und suchen Sie nach '-X', um detaillierte Informationen zu erhalten.

Daniel t.
quelle
16

Übergeben Sie die -nOption zum Überspringen der Auflösung von DNS-Namen von IP-Verbindungen. Dies wird mit ziemlicher Sicherheit der größte Teil aller Verlangsamungen sein.

Zoredache
quelle
1
Hallo, @Zoredache, vielen Dank für die Antwort. Ich habe sowohl die Option -n als auch die Option -P ausprobiert und beide scheinen jedoch nicht zu helfen. Trotzdem danke!
James Gan
Wenn es immer noch langsam ist, würde ich es wahrscheinlich mit Strace laufen lassen und sehen, ob ich herausfinden könnte, warum es langsam ist.
Zoredache
1
Dies funktionierte für mich unter MacOS X El Capitan
Andrew Miner
@ JamesGan Ich habe das gleiche Problem. Haben Sie jemals das Problem herausgefunden?
Noldorin
Großartig. Dies funktionierte für mich unter MacOS 10.14
Ninja
0

Ich habe dieses kleine NPM-Paket gefunden, das lsof für Dateien wunderbar beschleunigt: https://www.npmjs.com/package/lsof-mac-fast .

Ich habe ein Wrapper-Skript erstellt, um es zu verwenden:

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

Das ist mein Skript:

// 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);
}

Das Wiederholungsintervall kann sehr niedrig sein, zB scheinen 10 ms gut zu funktionieren.

Juraj Martinka
quelle