lsof 在我的服务器中运行非常慢

lsof 在我的服务器中运行非常慢

我正在我的一台 Linux 服务器中运行 lsof,以检查/tmp/incoming_data.txtext3 系统中的某个文件 ( ) 是否被其他程序打开。我的服务器上有很多 TCP 连接。奇怪的是,“sudo lsof”的执行大约需要两分钟才能完成,并且在这两分钟内占用了 99.x% 的 CPU。

我使用的命令是sudo lsof /tmp/incoming_data.txt。 我试过了 ”定影器“这占用了大约相同数量的 CPU 和执行时间。我能做些什么来解决这个问题吗?

答案1

如果您确定可以跳过打开的 TCP 或 UDP 连接(因为您提到它们太多),那么您可以使用 lsof 的方言特定选项-X

lsof -X

阅读 lsof 的手册页并搜索“-X”以获取详细信息。

答案2

传递-n跳过解析 IP 连接的 DNS 名称的选项。这几乎肯定是任何减速的最大部分。

答案3

我发现这个小型 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 毫秒似乎就可以了。

相关内容