Назад | Перейти на главную страницу

lsof работает очень медленно на моем сервере

Я запускаю lsof на одном из моих серверов Linux, чтобы проверить, есть ли один файл (/tmp/incoming_data.txt) в системе ext3 открывается другими программами. На моем сервере много TCP-соединений. Странно то, что выполнение sudo lsof занимает около двух минут, и в течение этих двух минут он использует 99.x% ЦП.

Я использовал команду sudo lsof /tmp/incoming_data.txt. Я пробовал "термоэлемент", который требует примерно столько же ресурсов процессора и времени выполнения. Что я могу сделать, чтобы решить эту проблему?

Пройти -n возможность пропустить разрешение DNS-имен IP-соединений. Это почти наверняка будет самой большой частью любого замедления.

Если вы уверены, что можете пропустить открытые соединения TCP или UDP, поскольку вы упомянули, что их слишком много, вы можете использовать зависящую от диалекта опцию lsof -X.

lsof -X

Прочтите страницу руководства lsof и выполните поиск по запросу '-X' для получения подробной информации.

Я нашел этот небольшой пакет NPM, который замечательно ускоряет lsof для файлов: https://www.npmjs.com/package/lsof-mac-fast.

Я создал сценарий-оболочку, чтобы использовать его:

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

Это мой сценарий:

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

Интервал повтора может быть очень низким, например 10 мс вроде нормально работает.