lsof funziona molto lentamente sul mio server


8

Sto eseguendo lsof in uno dei miei server Linux per verificare se un file ( /tmp/incoming_data.txt) nel sistema ext3 è aperto da altri programmi. Il mio server ha molte connessioni TCP su di esso. La cosa strana è che l'esecuzione di 'sudo lsof' impiega circa due minuti per terminare e utilizza una CPU del 99.x% durante quei due minuti.

Il comando che ho usato è sudo lsof /tmp/incoming_data.txt. Ho provato " fuser " che richiede circa la stessa quantità di CPU e tempo di esecuzione. C'è qualcosa che posso fare per risolvere questo problema?


Dopo che sono trascorsi quei due minuti, cosa lsofmostra? Quanti processi e thread hanno aperto quel file? Qual è il carico della CPU quando non si esegue lsof?
Michael Martinez,

Risposte:


7

Se sei sicuro di poter saltare le connessioni TCP o UDP aperte, dato che ne hai citate troppe, puoi usare l'opzione specifica del dialetto di lsof -X.

lsof -X

Leggi la pagina man di lsof e cerca '-X' per informazioni dettagliate.


16

Passa l' -nopzione per saltare la risoluzione dei nomi DNS delle connessioni IP. Questa sarà quasi sicuramente la parte più grande di eventuali rallentamenti.


1
Ciao, @Zoredache, molte grazie per la risposta. Ho provato entrambe le opzioni -n e -P ed entrambi non sembrano essere d'aiuto. Grazie lo stesso!
James Gan,

Se è ancora lento, probabilmente lo eseguirò con uno strace e vedrei se riuscissi a capire perché fosse lento.
Zoredache,

1
Questo ha funzionato per me su MacOS X El Capitan
Andrew Miner,

@JamesGan Ho lo stesso problema. Hai mai capito il problema?
Noldorin,

Grande. Questo ha funzionato per me su MacOS 10.14
Ninja,

0

Ho trovato questo piccolo pacchetto NPM che fa un ottimo lavoro nel velocizzare lsof per i file: https://www.npmjs.com/package/lsof-mac-fast .

Ho creato uno script wrapper per usarlo:

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

Questa è la mia sceneggiatura:

// 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'intervallo di ripetizione può essere molto basso, ad esempio 10 ms sembra funzionare bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.