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

8

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

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

Джеймс Ган
источник
После того, как эти две минуты прошли, что lsofпоказывает? На скольких процессах и потоках этот файл открыт? Какова нагрузка на процессор, когда не работает lsof?
Майкл Мартинес

Ответы:

7

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

lsof -X

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

Даниил Т.
источник
17

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

Zoredache
источник
1
Привет @Zoredache, большое спасибо за ответ. Я пробовал оба варианта -n и -P, и оба они, похоже, не помогают. Спасибо все равно!
Джеймс Ган
Если он все еще медленный, то я, вероятно, запустил бы его с помощью strace и посмотрел, смогу ли я выяснить, почему он медленный.
Зоредаче
1
Это сработало для меня на MacOS X El Capitan
Эндрю Майнер
@JamesGan У меня та же проблема. Вы когда-нибудь выясняли проблему?
Нолдорин
Отлично. Это работало для меня на MacOS 10.14
Ninja
0

Я нашел этот маленький пакет 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 мс работает нормально.

Юрай Мартинка
источник