我正在我的一台 Linux 服务器中运行 lsof,以检查/tmp/incoming_data.txt
ext3 系统中的某个文件 ( ) 是否被其他程序打开。我的服务器上有很多 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 毫秒似乎就可以了。