LSof corre muito devagar no meu servidor

8

Estou executando o lsof em um dos meus servidores Linux para verificar se um arquivo ( /tmp/incoming_data.txt) no sistema ext3 está aberto por outros programas. Meu servidor possui muita conexão TCP. O estranho é que a execução do 'sudo lsof' leva cerca de dois minutos para terminar e usa 99.x% da CPU durante esses dois minutos.

O comando que eu usei é sudo lsof /tmp/incoming_data.txt. Eu tentei " fusor ", que leva aproximadamente a mesma quantidade de CPU e tempo de execução. Há algo que eu possa fazer para corrigir esse problema?

James Gan
fonte
Após esses dois minutos, o que lsofmostra? Quantos processos e threads esse arquivo está aberto? Qual é a carga da CPU quando não está executando o lsof?
Michael Martinez

Respostas:

7

Se você tiver certeza de que pode ignorar as conexões TCP ou UDP abertas, como mencionou que há muitas delas, poderá usar a opção específica de dialeto de lsof -X.

lsof -X

Leia a página de manual de lsof e procure por '-X' para obter informações detalhadas.

Daniel t.
fonte
16

Passe a -nopção para ignorar a resolução de nomes DNS de conexões IP. Esta quase certamente será a maior parte de qualquer desaceleração.

Zoredache
fonte
1
Olá, @Zoredache, muito obrigado pela resposta. Eu tentei as opções -n e -P e as duas parecem não ajudar. Agradece a todos a mesma!
James Gan
Se ainda estiver lento, provavelmente eu o correria com strace e veria se conseguia descobrir por que estava lento.
Zoredache 21/03
1
Isso funcionou para mim no MacOS X El Capitan
Andrew Miner
@ JamesGan Tenho o mesmo problema. Você já descobriu o problema?
Noldorin
Ótimo. Isso funcionou para mim no MacOS 10.14
Ninja
0

Encontrei este pequeno pacote NPM, que faz um trabalho maravilhoso em acelerar o lsof para arquivos: https://www.npmjs.com/package/lsof-mac-fast .

Eu criei um script de wrapper para usá-lo:

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

Este é o meu 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);
}

O intervalo de repetição pode ser muito baixo, por exemplo, 10 ms parece funcionar bem.

Juraj Martinka
fonte