百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
返回工具页/返回 Issues 列表
#41622·WSL

在镜像网络中热插入 VPN 适配器时,hv_netvsc 子通道环分配失败后出现 rtnl 死锁(ENOMEM) - 后续问题 #41474

作者: zakna创建于 2026年9月16日更新于 2026年9月17日
标签kernel

logs.etl.txt logs.etl.txt ### Windows 版本 10.0.26200.9168 ### WSL 版本 2.7.13.0 ### 您是否使用 WSL 1 或 WSL 2? - [x] WSL 2 - [ ] WSL 1 ### 内核版本 6.18.33.2-2 (uname -r: 6.18.33.2-microsoft-standard-WSL2) ### 发行版本 Ubuntu 24.04.4 LTS ### 其他软件 - Cisco AnyConnect / Secure Client VPN (适配器"Cisco AnyConnect Virtual Miniport Adapter for Windows x64") - .wslconfig: memory=10GB, swap=4GB, processors=11, networkingMode=mirrored, dnsTunneling=true, autoProxy=false, [experimental] autoMemoryReclaim=gradual, sparseVhd=true。 - VM 内的正常开发者负载(Node.js 工具、多个 SSH 会话)。 ### 重现步骤 与 #41474 相同的内核故障,该问题已关闭,因为只附加了恢复后的日志。此报告是在 VM 仍处于死锁状态时捕获的,它有一个不同的常见触发器:没有小内存限制,只是在 Windows 主机上连接 VPN。 1. WSL2 已运行约 1.5 天,网络模式为 mirroring,自动内存回收为 gradual,内存限制为 10 GB。 2. 在 Windows 上连接 Cisco AnyConnect。 mirroring 网络热添加 VPN 适配器到 VM,并将其命名为 eth1。 3. 在 hv_sub_chan 工作队列上的 vmbus_add_channel_work 尝试分配子通道环形缓冲区(顺序 8,大约 1 MiB 连续,GFP_KERNEL|__GFP_ZERO)并失败,尽管大约 6.5 GB 可用:内存被碎片化(请参阅 buddyinfo)。 4. netvsc_sc_open 在日志中记录了七次 "sub channel open failed: -12"。 5. 从该时刻开始,每个 rtnetlink 打印都永久地在 rtnl_dumpit 中挂起,状态为 D。任何调用 getifaddrs() 或列出接口的程序都会卡死,无法杀死:ip addr、ss、sshd 连接子进程(在 SSH 横幅之前)、npm/Node.js、sudo。负载平均值随着每个新卡住的进程而上升(捕获时 41 个,D 状态中的进程数为 36 个)。 ### 预期行为 失败的子通道打开应解除锁定并释放 rtnl,以便接口继续工作,但通道数减少,或者接口被清理干净。 netlink 查询永远不应永久阻塞。 ### 实际行为 rtnl 永久地保持阻塞。唯一的恢复方法是 wsl --shutdown。分发中的所有与网络相关的进程创建都卡住了(SSH 服务不可用,Node.js 工具在启动时卡住,sudo 卡住)。分配失败(经过优化;dmesg -T 的壁时钟时间在 WSL 中会偏移,事件的顺序是可靠的): kworker/0:1: page allocation failure: order:8, …

内容来源: microsoft/WSL

查看 GitHub 原文在 GitHub 查看讨论