WSL2 跑 Claude Code 卡顿?从资源、文件系统到网络全优化指南
2026/9/16 2:48:15 网站建设 项目流程

先说结论:WSL2 里跑 Claude Code 卡顿,八成不是 Claude Code 本身的问题,而是 WSL2 的资源配额、文件系统、网络链路这三块没调好。我把这三个方向逐个过了一遍,配合终端渲染的小坑,基本能把“输入半天反应过来、工具调用转圈、Ctrl+C 都失灵”这类症状压到可以舒服写代码的程度。

这篇文章适合两类人看:一类是刚把 Claude Code 装进 WSL2 的新手,卡得不知道从哪下手;另一类是已经在用了,但总感觉比别人的演示视频慢半拍的老手。我会把判断思路、配置文件、实测命令都直接给出来,你照着抄就行。

2. 卡顿先定级:先分清是“系统卡”还是“网络卡”

2.1 两类卡顿的表现差异

WSL2 跑开发工具的卡顿,表面上都叫“卡”,但根因完全不同,先花两分钟判断一下,能省掉后面大量瞎折腾的时间。

第一类是系统卡,特征是:输入命令有延迟、终端上下滚动一卡一卡、打开目录明显慢、CPU 或内存占用长期接近满载。这类问题主要出在 WSL2 虚拟机的资源配额、文件系统跨盘访问、终端渲染这几块。

第二类是网络卡,特征是:本地命令、ls、vim 都挺流畅,但 Claude Code 发起请求后就长时间转圈,或者提示 token 超时、连接中断,偶尔又突然恢复。这类问题主要出在 DNS 解析、代理链路、超时配置这几块。

我更建议你把两类问题分开排查,因为它们的解决手段完全不同。把资源配额和文件系统问题当成性能问题处理,把网络问题当成链路问题处理,不要混在一起调,否则很容易出现“把内存加到 32G 还是卡”这种情况。

2.2 3 个命令快速定位瓶颈

我一般直接用这三步定位:

# 第1步:看系统负载 free -h && nproc && uptime # 第2步:看磁盘IO,跨盘操作尤其明显 time ls -lR /mnt/c/你的项目 > /dev/null time ls -lR ~/你的项目 > /dev/null # 第3步:看网络链路 curl -o /dev/null -s -w "DNS: %{time_namelookup}s, 连接: %{time_connect}s, 总耗时: %{time_total}s\n" https://api.anthropic.com

第 1 步能直接看出内存是不是被吃满,Swap 是不是在疯狂读写。第 2 步对比的是 WSL2 读 Windows 盘和读 Linux 盘的耗时差距,通常情况下这个差距能被拉得很大。第 3 步看的是 Claude Code 每次请求在 DNS 解析和建连阶段花了多少时间,如果 DNS 解析就占了几秒钟,那不用怀疑,网络链路里一定有个环节出了问题。

3. 先查 WSL2 的资源配额,默认配置容易把内存吃干

3.1 WSL2 为什么会平白无故吃满内存

WSL2 本质是 Hyper-V 虚拟化平台上的一个轻量虚拟机,虚拟机会申请一块固定上限的内存作为自己的地址空间。默认配置下,WSL2 最多能占用物理内存的 50% 或 8GB 中较大的那个值,并且它拿到内存后会大量用作页面缓存,这就会造成一种假象:明明什么都没跑,free -h 一看 available 已经见底了。

Claude Code 这一类 Node.js 工具本身对内存的占用不算夸张,但你在 WSL2 里一般还会跑 Docker 后端、VS Code Server、各种语言服务,这些叠加起来,默认配额很快就不够用了。一旦内存不够,Linux 内核开始走 Swap,如果你没显式设置 swap 文件,WSL2 默认会创建一个与内存大小自动关联的 swap 虚拟磁盘,但位置在虚拟磁盘上,性能远不如原生内存。进程一换出换入,表现就是“每操作一步都要等一拍”。

3.2 一份可以直接抄的 .wslconfig

.wslconfig 是 Windows 侧控制 WSL2 核心参数的配置文件,放在你的用户目录下,即C:\Users\你的用户名\.wslconfig。没有这个文件就直接新建一个,注意文件名开头有个点。

我目前用的这份配置,在 16G 内存的机器上跑 Claude Code、Docker、VS Code 后端同时开,顺滑度还不错:

[wsl2] memory=8GB processors=6 swap=4GB swapfile=C:\\Users\\你的用户名\\wsl-swap.vhdx networkingMode=mirrored dnsTunneling=true autoProxy=true firewall=true

逐条解释一下:

  • memory=8GB:直接限制 WSL2 能拿到的内存上限。如果你的物理内存是 16G,给 WSL2 分 8G 是够用的;如果是 32G 的机器,可以放宽到 12G 或 16G。分太多反而会让 Windows 侧资源紧张,直接影响到 IDE 的流畅度。
  • processors=6:给虚拟机分配逻辑 CPU 数量。给少了编译和工具调用慢,给多了会挤占 Windows 主机的响应能力,6 个逻辑核在绝大多数开发场景下都是甜点值。
  • swap=4GBswapfile=:显式指定 swap 大小和位置。我建议无论物理内存多大都保留 4G 左右 swap,能有效防止极端场景下的 OOM 进程被直接杀掉。这个文件是一次性生成的,改大小后建议执行wsl --shutdown让它重新分配。
  • networkingMode=mirrored:这是新版 WSL2 的网络镜像模式,让 WSL2 直接共享 Windows 的网络接口,最直观的好处就是 WSL2 里访问localhost可以直接访问 Windows 上的服务,反向也一样,能省掉大量网络代理和端口转发上的麻烦。
  • dnsTunneling=trueautoProxy=true:配合镜像模式使用,分别解决 DNS 解析和系统代理同步的问题,后面网络部分会细说。

注意:networkingMode=mirrored需要 WSL2 版本较新才行。可以先执行wsl --version看一下版本号,如果是 2.0 以下,先跑一次wsl --update升级到最新版。

改完配置后,在 PowerShell 或 CMD 里执行:

wsl --shutdown

然后重新进入 WSL2,再执行free -hnproc,确认内存和 CPU 数量已经按配置生效。

3.3 如何确认新配置已经生效

常有朋友改了 .wslconfig 却感觉没生效,其实是因为没有完全重启 WSL2。在 WSL2 里执行exit退出所有发行版会话还不够,必须在 Windows 侧执行wsl --shutdown才能把整个虚拟机停掉。如果没有这一步,旧的配置会一直保留在老进程里。

重启后再进 WSL2,用几个命令确认:

free -h nproc cat /proc/sys/vm/swappiness

swappiness默认一般是 60,如果你的 swap 使用非常频繁,可以降到 10 左右,让系统优先把内存留在物理内存里而不是急着换出。这个值可以在 .wslconfig 里面写[wsl2]下的kernelCommandLine或直接在启动脚本里设置,简单点的话可以在~/.bashrc里加一行sysctl -w vm.swappiness=10

4. 文件系统是隐藏杀手:项目别放 Windows 盘

4.1 /mnt/c 的 9P 协议瓶颈

这是我最想强调的一点。很多朋友装完 WSL2,习惯性地在cd /mnt/c/Users/你的用户名/Desktop/项目里直接跑开发工具,然后发现慢得怀疑人生。

WSL2 访问 Windows 文件系统(也就是/mnt/c/mnt/d这些挂载点)走的是 9P 协议,这是一个远程文件系统协议,设计目标是跨主机共享文件,而不是本地高性能读写。再加上 Windows Defender 实时扫描等机制,你在/mnt/c下面做大量小文件操作时,性能损耗非常肉眼可见。

Claude Code 这类 AI 编程工具恰恰是个重度文件系统消费者:它要扫描项目目录、读取代码文件、跟踪文件变更、批量执行 shell 命令,这些操作在 9P 协议上会被无限放大。实测在同一个项目上,位于/mnt/c时工具调用前后切换可能多出数秒延迟,而在 Linux 原生文件系统里几乎无感。

4.2 推荐的项目布局与迁移方式

所以我的建议非常明确:所有开发项目必须放在 WSL2 自己的 Linux 文件系统里,默认的用户目录~/下面,路径类似~/projects/xxx

迁移方式也很简单,直接把项目拷贝过去:

mkdir -p ~/projects cp -r /mnt/c/Users/你的用户名/Desktop/项目 ~/projects/

如果你想保持 Windows 侧也能编辑文件,两个方向都行。一个是通过 VS Code 的 Remote-WSL 插件,在 WSL2 里直接打开项目,编辑体验完全在 Linux 侧完成;另一个是通过资源管理器里输入\\wsl$\Ubuntu\home\你的用户名\projects直接访问 WSL2 的文件系统,这个方式适合偶尔看一下文件,但不建议作为日常主力编辑路径。

4.3 VS Code 远程开发的体验优化

如果你用 VS Code 连接 WSL2,有几个细节值得注意:一是务必安装官方 Remote - WSL 扩展,它会自动在 WSL2 里启动 VS Code Server,不要用 Windows 侧直接打开网络路径这种老办法。二是在 VS Code 设置里把files.watcherExclude加一些排除项,比如node_modules.gitdist,减轻文件监控的负担。三是如果有条件,把扩展安装在 WSL2 侧,尤其是格式化工具、linter 这类频繁读文件的扩展,运行在 Linux 侧更强。

注意:Windows 侧的杀毒软件可能会导致 WSL2 内 Node.js 工具首次启动时变慢,因为虚拟磁盘文件会被实时扫描。如果条件允许,可以把 WSL2 的发行版目录从实时扫描里排除。这个不做强制要求,但实测对首次启动速度和大量小文件操作有明显帮助。

5. 网络问题才是 Claude Code 卡顿的重灾区

5.1 DNS 解析慢:表现为“转圈”和“超时”

资源配额和文件系统都调完之后,如果 Claude Code 还是时不时卡住,那就要把目光放到网络上了。

WSL2 之前的 NAT 网络模式下,DNS 配置默认来自 Windows 下发,但你可能会遇到解析超时的问题。一个很常见的现象是:请求发出后,终端卡在连接阶段十几秒才报错。我用curl -w看过具体耗时,发现time_namelookup占了绝大部分时间,说明 DNS 解析环节出了问题。

最简单的修复办法是手动指定一个稳定的公共 DNS 服务器。修改 WSL2 里的/etc/resolv.conf

sudo sh -c 'echo "nameserver 223.5.5.5" > /etc/resolv.conf'

但问题是,WSL2 重启后这个文件可能被重新生成覆盖掉。所以需要改一下/etc/wsl.conf

[network] generateResolvConf = false

生效再重启一次 WSL2:

wsl --shutdown

然后进入 WSL2 手动写/etc/resolv.conf,或者在启动脚本里执行。把解析地址换成公共 DNS 后,Claude Code 请求前的 DNS 等待时间会显著缩短。

5.2 本地代理与镜像模式:一个小配置带走所有端口转发烦恼

WSL2 默认 NAT 模式下,WSL2 里的程序无法直接通过localhost访问 Windows 上运行的代理服务,必须拿 Windows 宿主机的 IP 才能访问。这就带来几个问题:一是 IP 会变,二是设置起来绕,三是容易因为 IP 配错导致各种“连接被拒”和“超时”。

新版 WSL2 的解决方案就是前面 .wslconfig 里写到的networkingMode=mirrored。开启镜像模式后,WSL2 直接共享 Windows 的网络接口,localhost就是同一个localhost,你在 Windows 上启动一个监听127.0.0.1的本地 HTTP 服务,WSL2 里的程序通过http://127.0.0.1:端口就能直接访问,端口转发和 IP 获取的问题直接消失。

如果你使用的 WSL2 版本不支持镜像模式,可以用传统办法:先从 WSL2 里拿到 Windows 宿主机 IP,命令是cat /etc/resolv.conf里的 nameserver 地址,或者ip route show default里的网关地址,手动把它作为代理地址写入环境变量。

5.3 Claude Code 的代理环境变量设置

Claude Code 底层走的是 Node.js 的 HTTP/HTTPS 请求,它会读取系统环境变量里的代理配置。所以不管哪种网络模式,最终要在 WSL2 的 shell 里把这些变量配上:

export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 export NO_PROXY=localhost,127.0.0.1,::1

这里把端口换成你 Windows 侧实际代理服务监听的端口即可,127.0.0.1 在镜像模式下直接可用。

如果你把这段配置写在~/.bashrc~/.zshrc里,记得改完执行source ~/.bashrc或重新打开终端窗口。Claude Code 启动时会继承这些环境变量,不需要额外配置。

注意:如果设置代理后发现请求更慢了,多半是NO_PROXY漏掉了127.0.0.1localhost,导致本机回环流量也走了代理,白白增加一跳路径。

5.4 慢请求与超时观察

代理配置好之后,再回头跑一次这个命令确认链路质量:

curl -o /dev/null -s -w "DNS: %{time_namelookup}s, 连接: %{time_connect}s, 首字节: %{time_starttransfer}s, 总耗时: %{time_total}s\n" https://api.anthropic.com

正常情况下 DNS 解析应该在几十毫秒级别,连接也应该很快。如果首字节时间很长,说明数据链路本身有问题,跟 WSL2 配置无关,需要检查 Windows 侧的代理服务是否正常工作。如果连接直接失败,先检查127.0.0.1端口在 Windows 侧是否真的在监听:netstat -ano | findstr 7890

6. Claude Code 自身和终端侧的优化实测

6.1 输出量大时终端渲染差异

Claude Code 是流式输出工具,每生成一段内容,终端就要跟着渲染一段。而且它会频繁插入代码块、语法高亮、特殊字符,这就对终端渲染能力提出了很高的要求。

如果你还在用老的 Windows 控制台窗口,或者用 Windows Terminal 但配置文件比较老旧,输出过程中很容易出现“打字机一样一个字符一个字符蹦出来”的卡顿感。我实测换了 Windows Terminal 后,输出流畅度改善非常明显。Windows Terminal 的 GPU 加速渲染在处理长输出和 ANSI 转义序列时远好于老控制台。

另外字体也值得注意。Claude Code 的输出里大量使用代码块,需要支持连字和等宽效果更好的字体,推荐 Nerd Font 系列的等宽字体。如果终端里用的是中文字体优先级最高的方案,一旦代码块里混入全角字符,渲染性能会断崖式下降。我在 Windows Terminal 的配置文件里把字体改成 Nerd Font 之后,这种卡顿基本消失。

6.2 降低工具调用占用

Claude Code 默认会加载你项目目录下的大量文件上下文,如果项目很大、文件很多,它每次工具调用前都要做文件读取和路径分析,这部分会消耗不少时间和内存。

我的经验是给 Claude Code 创建一个精简的智能体上下文目录,只放当前任务相关的代码文件,而不是整个仓库一股脑塞进去。做法是启动时用一个干净的子目录作为工作目录,内容用符号链接把涉及到的源码文件链进来,或者直接用CLAUDE.md文件说明项目结构和重点文件位置,让它少做很多无谓的全目录扫描。

另外一个容易被忽视的点是:Claude Code 的历史会话会积累大量消息记录,会话越长,每次请求携带的上下文就越大,响应自然就越慢。如果你发现同一个会话用久了开始明显变慢,不用怀疑,开一个新会话通常能立刻恢复速度。你可以把关键进度写在CLAUDE.md里,新会话启动时让它读一下就能接上进度。

6.3 日志与静默启动

排查卡顿的时候,我建议用日志模式启动一次 Claude Code,看它每次请求实际消耗的时间:

claude --debug --log-level debug

日志会输出请求的数量、耗时、token 使用情况。如果一次请求的耗时主要是 network 字段,那还是网络链路的问题;如果主要是 tool call 的内部处理时间,那就是文件系统和上下文的问题。两种问题的优化方向完全不同。

Claude Code 的版本迭代非常快,尽量保持最新版本。命令行工具更新通常就是执行安装命令本身,或者根据你使用的安装方式来重新安装一次,新版本往往会包含请求优化和 bug 修复,对卡顿的改善比较直接。

7. 常见问题速查表

这里把我在实际操作中踩过的坑整理成一张速查表,方便以后遇到问题时直接对号入座:

现象可能原因解决方案
WSL2 启动报“未启用虚拟化”BIOS 中虚拟化未开启重启进入 BIOS,开启 Intel VT-x 或 AMD SVM
改了 .wslconfig 没效果没执行 wsl --shutdown在 PowerShell 执行 wsl --shutdown 后重进
终端里打字都卡内存被占满、Swap 狂读调整 memory 配额,看 free -h 确认
项目在 /mnt/c 下运行时工具调用慢9P 协议跨盘访问把项目剪切到 ~/projects 目录
Claude Code 请求前长时间转圈DNS 解析慢修改 /etc/resolv.conf 或开启 dnsTunneling
请求失败但 Windows 浏览器访问正常代理地址指向错误端口确认 Windows 侧监听端口,重设 HTTPS_PROXY
输出像打字机一样一个字一个字蹦终端渲染性能不足换 Windows Terminal + Nerd Font 字体
长会话后越来越慢上下文过多开新会话,把进度写到 CLAUDE.md
WSL2 里访问 localhost 失败NAT 模式下端口隔离开启 mirrored 模式或改用宿主机 IP

还有一些细节,比如 Windows 自动更新可能导致 WSL2 发行版在后台升级,升级期间会短暂卡顿;又比如 Windows 上开了多个 Hyper-V 虚拟机时,CPU 配额会互相挤占。这些不常见但确实存在,如果以上排查都没发现问题,可以往这个方向再想想。

我个人的习惯是,每月定期检查一次 WSL2 版本,wsl --update保持最新;每次 Windows 大版本更新后,重新确认一下wsl --versionwsl --status的输出,防止某些配置被重置掉。

排查到最后你会发现,WSL2 跑 Claude Code 的卡顿很少是单一原因,基本都是内存、文件系统、网络、终端渲染叠加出来的综合体验。把这四块按顺序调一遍,剩下那点延迟和你的宽带质量、API 服务端响应速度直接相关,就不是本地配置能解决的了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询