答案1
CPU 使用率不足以确定你的性能瓶颈是什么。
平均负载是一个部分指标,但仍然不是那么有用。
最近的 Linux 内核包含一种称为“失速压力信息”的东西,它可以识别进程正在等待什么资源(CPU、I/O、内存)。Ubuntu 22.04 包含一个足够新的内核来包含它。这可以是一个很好的诊断,但它太新了,目前几乎没有工具可以监控它。
想要真正原始的外观,你可以尝试
(cd /proc/pressure && grep . *)
并寻找非零平均值。深入研究这一切意味着什么可能要花很长时间,可能值得再问一个问题。
话虽如此,vscode 可能会占用一些资源。查看您的 top 中的内容,我可以看到几个迹象表明这可能是您的问题。
vscode 默认会尝试递归扫描部分或全部文件系统以及所有代码目录。具体来说:
- rg(“ripgrep”)将递归读取每个文件并查找内容
- 默认情况下,vscode 会
git status
在每个代码目录中重复运行,即使你没有 git repo。如果你有深层数据目录,这可能会对性能造成重大影响。我见过它git status
在前一次运行尚未完成时就开始多次运行。 - vscode 本身(我假设
code
在您的热门列表中)也会进行一些递归扫描以创建文件名完成缓存。它不仅限于您的主目录,我见过它扫描其他用户的主目录也是如此。 - 更糟糕的是,vscode 默认会遍历符号链接,如果你有一个循环的符号链接,它会一直扫描它。
- 我看到有人声称这些行为中的一些是由(第三方?)vscode 插件引起的。然而,虽然有些插件可能会使情况变得更糟,但默认的 vscode 安装会执行上述所有操作。
我可以在您的热门列表中看到前三名的证据。如果您从 NFS 中提取目录,这可能会对 nfs 客户端和服务器造成极大的性能影响。
作为对此的部分缓解,您可以将.gitignore
文件放在战略位置以告诉 vscode 不扫描哪些内容。这很有效,git status
但 vscode 本身即使配置为不扫描,也会随机忽略它们。
也可以编辑 vscode 设置并为其提供不扫描的通配符目录列表。但是,有多个这样的选项(您必须设置所有选项才能停止此操作),有时它会忽略这些选项并无论如何扫描它们,并且将您不想扫描的每个目录添加到两个或三个不同的列表中是很繁琐的。
我认为无法控制或关闭此行为是 vscode 的一个错误,但 vscode 作者并不这么认为,尽管收到多次投诉,但他们多年来一直未能修复此问题。他们添加了关闭部分行为的选项,但正如我所说,其中一些选项无法始终正常工作。