在 macos 中可通过命令行用 dnctl 和 pfctl 搭建本地压力测试网络异常环境:启用 pf 后,用 dnctl 创建带延迟、丢包、抖动的管道,再通过 pfctl 端口规则或 dnctl link 进程绑定定向流量,最后验证并清理。
在 macos 中搭建本地压力测试所需的网络异常环境,核心是用系统级工具精准控制出站/入站流量——不依赖第三方 gui,全部通过命令行完成,且不影响其他应用联网。
启用系统内置的网络整形服务
macOS 10.10+ 使用 dummynet 作为底层流量控制引擎,需先加载内核模块并确认服务就绪:
- 执行
sudo dummynet -v查看是否返回版本信息;若提示 command not found,说明未启用 PF(Packet Filter)支持,需先运行sudo pfctl -e - 检查当前是否有活动规则:
sudo pfctl -s rules,空输出表示干净状态,可安全配置 - 注意:dummynet 不直接暴露命令,所有操作统一通过
dnctl管理
创建带丢包与延迟的虚拟链路
用 dnctl 定义一条自定义管道(pipe),模拟真实弱网特征:
- 添加一条编号为 1 的管道:
sudo dnctl pipe 1 config delay 80ms loss 5%(80ms 延迟 + 5% 随机丢包) - 若还需加入抖动(jitter),可写成:
sudo dnctl pipe 1 config delay 80ms delay 20ms loss 5%,第二个 delay 表示 ±20ms 抖动范围 - 验证配置是否生效:
sudo dnctl show,应看到 pipe 1 的详细参数和当前统计
将目标流量导向该链路
仅对特定程序或端口生效,避免全局干扰。常用两种方式:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
-
按端口拦截:比如你的本地压力测试服务跑在 8080 端口,执行
sudo pfctl -f /etc/pf.conf(确保默认规则文件存在)
然后追加规则:echo "dummynet out on en0 proto tcp from any to any port 8080 pipe 1" | sudo pfctl -ef - -
按进程拦截(macOS 12+ 支持):若测试程序名为
myloadtest,可用:sudo dnctl link 1 pid $(pgrep -f myloadtest)(注意:此功能需 SIP 部分关闭或使用开发者签名)
验证与清理
配置不是一劳永逸,每次测试前后都要确认状态并及时释放资源:
- 用
ping -c 5 127.0.0.1测试本机环回不受影响(应无延迟/丢包) - 用
ping -c 10 example.com观察实际外网请求是否出现预期延迟与丢包 - 测试结束,清除所有规则:
sudo pfctl -F all;清空 dummynet 管道:sudo dnctl flush - 如需重复使用,建议把常用命令写成 shell 脚本,例如
start-weaknet.sh和stop-weaknet.sh
这套方法绕开了 Network Link Conditioner 的图形限制,适合集成进 CI/CD 或自动化压测流程,也能精确复现音视频、实时信令等场景下的典型网络故障模式。










