amd64 微架构级别对 Go 程序性能提升多少?

在 Go 1.17 之前,Go 编译器总是生成可由任何 64 位 x86 处理器执行的 x86 二进制文件。
Go 1.18 为 AMD64 引入了 4 个架构级别 。每个级别在编译器可以包含在生成的二进制文件中的 x86 指令集上有所不同:

  • GOAMD64=v1(默认值):基准模式。仅生成所有 64 位 x86 处理器都能执行的指令。
  • GOAMD64=v2:所有 v1 指令,加上 CMPXCHG16B、LAHF、SAHF、POPCNT、SSE3、SSE4.1、SSE4.2、SSSE3。
  • GOAMD64=v3:所有 v2 指令,加上 AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE、OSXSAVE。
  • GOAMD64=v4:所有 v3 指令,加上 AVX512F、AVX512BW、AVX512CD、AVX512DQ、AVX512VL。

例如,设置 GOAMD64=v3 将允许 Go 编译器在生成的二进制文件中使用 AVX2 指令(这在某些情况下可能会提高性能);但是这些二进制文件将无法在不支持 AVX2 的旧 x86 处理器上运行。
Go 工具链也可能生成更新的指令,但会通过动态检查来确保它们只在支持的处理器上执行。例如,如果设置了 GOAMD64=v1,并且 CPUID 报告 POPCNT 指令可用,那么 math/bits.OnesCount 仍然会使用该指令。否则,它会回退到通用实现。
Go 工具链目前不生成任何 AVX512 指令。
不支持 SSE3 的平台不支持种族检测器。

64 位 Intel 和 AMD 处理器已经演进了几十年。当你为 64 位 Intel 或 AMD 处理器编译 Go 程序时,编译器默认面向的是一个将近 20 年前的指令集。生成的二进制文件几乎能在任何 x64 芯片上运行,但同时也放弃了自 2003 年以来添加的所有指令。

我们通常用微架构级别(microarchitecture levels)来描述这一分层。每个级别捆绑了一组可以假定存在的指令集扩展:

级别 新增内容(大致)
v1 原始 AMD64 基线(SSE2)
v2 popcnt、SSE4.2
v3 AVX2
v4 AVX-512(F/BW/DQ/VL)

阅读全文

Loop Engineering 实践:一次批量实现 8 个 issue,完成夔牛工具的开发

I don't talk to an agent anymore, I talk to a loop or a routine.
——Boris Cherny

先讲一个真实的 case。

6 月 10 日下午,我把一个新工具 kuiniu(夔牛) 的 PRD 丢给 Claude Code,让它生成 8 个 issue 卡到 GitHub 仓库。然后我敲了一句 /loop-it,然后离开了。

一个小时后打开仓库一看,8 个 issue 全 closed,对应的 PR 全 merge 了。main 分支上多出了 client、server、codec、bitflip 检测、丢包统计、命令行入口、Makefile/goreleaser 集成,还顺手抽出了一个 util/rotate_writer.go

阅读全文

Loop Engineering 实践:我把 RDMA 开发库移植到 Go 语言,花费 239 块钱

一次几乎全自动的库开发实验:从一份 PRD 出发,15 个 issue 串成流水线,让 Agent 一路 实现 → 审查 → 记录 → 发布,最后我只在真机上验证。本文复盘整个过程,验证了Loop Engineering和实际的花费。

0. 缘起

我想要一个 Go 语言的 RDMA 库。

从去年我们做高性能网络的黑盒监控起,就开始尝试用 RDMA 做探测。但我们的技术栈是 Go,找了几个库,实现得不好也不稳定;换成 C 语言技术栈对团队同学来说成本太高;自己实现当时觉得挺有挑战,于是这件事就搁下了,最后还是退回到用普通 UDP 协议探测。

阅读全文

傻瓜式RDMA高性能网络开发:从零跑到 400 Gb每秒

用 Go 写 RDMA,到底能有多简单?又能有多快?这篇带你从零跑到 400 Gb/s。

开篇:一个让人又爱又怕的技术

如果你做过高性能网络,一定听过 RDMA 这个词。它是 AI 训练集群里 GPU 之间狂飙数据的底层、是分布式存储压榨延迟的杀手锏、是金融交易系统微秒必争的武器。

两种传输 & 两种操作

  • RC(可靠连接,类比 TCP):有序可靠,支持双边和单边操作

  • UD(不可靠数据报,类比 UDP):无连接,一对多

  • 双边操作(Send/Recv):接收方要先挂好接收请求,双方 CPU 都参与

  • 单边操作(RDMA Write/Read):发起方直接读写对端内存,对端 CPU 完全不参与——这是 RDMA 最"魔法"的地方

阅读全文

百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形

5000 包/秒高频探测 + 无需时钟同步的单向丢包检测 + 全路径覆盖。内部跑了多年,现在开源了。


先讲一个实际case。

线上服务突然超时,用户投诉电话打爆了。打开监控大盘,一切正常——没有任何告警。折腾两小时,最后发现是某条链路间歇性轻微丢包,丢包率 0.3‰,传统监控压根抓不到。

百度内部,baize 跑了多年:

  • 集群间高频探测:机房内跨集群链路fullmesh监控
  • 机房间fullmesh探测:机房间,LCC机房链路fullmesh监控()
  • 混合云高频探测:A区和C区之间的混合云链路监控,5000 pps,秒级发现异常
  • 专线 SLA 监控:运营商专线质量持续监测,为 SLA 考核提供数据支撑
  • 网络改造保障:设备割接、链路升级期间持续监控,改造前后对比一目了然
  • 故障回切验证:从灾备切回主链路后,确认回切路径无丢包、无 bitflip后再切流

06 开源与社区

baize 是百度 nettools 工具集的第二个开源工具,MIT 协议。

内部版还支持从数据库拉配置、推数据到 Kafka 聚合,开源版做了简化,但留了可插拔的 Sender 接口——你可以自己实现,把数据发到 ClickHouse、Prometheus 或者任意后端。


网络监控这件事,不是能不能做的问题,是做得够不够细的问题。

每一条链路、每一个端口、每一个比特,都值得被监控。 这是我们在百度内部坚持的标准,今天开源出来,希望对你有用。

被间歇性轻微丢包折磨过的话,去 GitHub 点个 Star,试试 baize。

大厂的内部工具居然开源了! 一窥百度物理网络秒级监控定位的秘密

目前顶尖的云服务商都包含百万台服务器、数十甚至上百个机房、上万台网络设备、百万级网络链路。单单一个GPU集群,就有上万卡的级别。对这些网络和服务器的监控,一个分钟级别的故障,可能就是上百万资产的损失。

这不是一个ping能解决的问题。

今天,我们将百度物理网络黑盒监控方向的工具集 nettools 开源了(https://github.com/baidu/nettools),第一批放出的是 bitflip 和 bitflip6,用于检测网络丢包和比特翻转,在百度内部跑了很长时间了。

阅读全文

百度网络监控工具开源第三弹:lidar — 不只是 pingmesh

上一个工具 bitflip/baize 解决的是丢包和改包持续检测,在百度baize常常用在点到点之间的常态检测中,比如机房内集群间的监控,专线的检测, 新网络方案测试和灰度观察、核心网络设备的切回前检测等场景。

今天介绍的lidar工具,区别于传统的pingmesh探测方案,是我来百度后创造的第一个特殊的底层网络方案,我将其称之为lidar(激光扫描)方案,是一个很形象的比喻,我会话专门一节详细介绍它的优缺点,在这之前,我们介绍传统的赫赫有名的机房大规模的网络监控方案 pingmesh。

https://nettools.rpcx.io

pingmesh 探测以及为什么我们不用它?

PingMesh("Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis")是微软在SIGCOMM 2015上发表的论文。作者团队来自微软研究院和Azure网络部门。

阅读全文

别只盯着gopacket了,看看这个强大的网络库

Go 网络编程,大家第一反应就是 gopacket。但如果你用过 Scapy,你会发现 gopacket 的 API 繁琐得让人抓狂。goscapy 把 Scapy 的优雅搬到了 Go 里——流式构建、自动校验和、协议自动推断、一行代码搞定数据包,还能嗅探、发送、收响应。


最早接触到python生态圈的scapy是两年前,在和交换机的同学搞交换机探针的时候,他写了几行python代码就实现了一个发包探测程序,我立马就被scapy吸引了,居然写网络测试程序可以这么简单?

03 数据包解析:自动协议推断

构造包只是故事的一半,解析包是另一半。

goscapy 的 Dissect 能从原始字节自动推断出完整的协议栈:

1
2
3
4
5
6
7
raw := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xbb, ...}
pkt, _ := packet.DissectByProto(raw, "Ethernet")
fmt.Println(pkt.String()) // "Ethernet / IP / ICMP"

// 访问具体层
ipLayer := pkt.GetLayer("IP")
srcIP, _ := ipLayer.Get("src") // net.IP{192, 168, 1, 1}

解析引擎靠注册表驱动。每一层解析完后,查 keyField 找到下一层——Ethernet 看看 type 字段(0x0800 → IP),IP 看看 proto 字段(6 → TCP),TCP 看看 dport(80 → HTTP)。VXLAN 这种隧道协议还能递归解析内层包,最多支持 8 层嵌套。

启发式规则也注册了一大堆:UDP 53 端口 → DNS,TCP 80 → HTTP,UDP 4789 → VXLAN,IP proto 47 → GRE……抓到的包基本都能自动识别到应用层。

04 嗅探和收发包:Scapy 的 sr/srp 到 Go

写过 Scapy 的人一定对 sr()sr1() 不陌生——发一个包,自动等响应,还能做协议级匹配。goscapy 把这套逻辑完整搬过来了。

发包

1
2
3
4
5
6
7
8
9
// 构造结构化的 Packet 对象(不是 Build 出 []byte)
pkt := goscapy.NewEthernet().
DstMAC("ff:ff:ff:ff:ff:ff").
Over(goscapy.NewIP().SrcIP("192.168.1.1").DstIP("8.8.8.8")).
Over(goscapy.NewICMP().Type(8).Code(0)).
Packet()

sendrecv.Send(pkt, "eth0") // L3 发送(IP 层,OS 补 Ethernet)
sendrecv.Sendp(pkt, "eth0") // L2 发送(完整以太网帧)

发包收响应

1
2
3
4
5
6
// 类似 Scapy 的 sr1():发 ICMP Echo,等第一个响应
sent, reply, err := sendrecv.Sr1(pkt, "eth0", 3*time.Second, nil)
if reply != nil {
ipLayer := reply.GetLayer("IP")
srcIP, _ := ipLayer.Get("src") // 8.8.8.8 的回复
}

DefaultMatch 自动匹配响应包——ICMP Echo Request 配 Echo Reply(ID 匹配),TCP SYN 配 SYN-ACK(端口翻转 + ack = seq+1),UDP 配端口翻转,DNS 匹 transaction ID,ARP 配 IP 交换。不用写一行匹配逻辑。

gopacket 更适合:需要解析冷门协议、对 pcap 文件读写有强需求、已经重度依赖 libpcap 生态的项目。

goscapy 更适合:网络工具开发、安全扫描、协议测试、网络监控探测——任何需要快速构造和收发数据包的场景。纯 Go 部署简单,API 用起来舒服。

10 性能:零拷贝序列化

goscapy 在序列化上做了不少优化:

  • SerializeInto:直接写入目标 buffer,无额外堆分配
  • BuildInto:用户提供 buffer,整个包一次序列化完成
  • RecvInto:收包直接读入用户 buffer,减少一次拷贝
  • 校验和零拷贝checksumIPv4Pseudo 直接折叠多个内存区域,不拼接
  • WireSize:预计算序列化大小,一次分配精确大小的 buffer
1
2
3
// 零拷贝发送
buf := make([]byte, 1500) // MTU 大小的 buffer
result, err := pkt.BuildInto(buf) // 直接写入,无额外分配

还有 Linux 特有的高性能接收模式——AF_PACKET mmap、零拷贝 (PACKET_QDISC_BYPASS)、io_uring 原始套接字——适合高频探测场景。这些在 examples 目录里有完整示例(23-packet-mmap、21-zerocopy、22-uring-raw-socket)。

11 丰富的示例库

goscapy 自带了 50+ 个示例,覆盖从基础到高级的几乎所有场景:

  • 基础:ping、traceroute、TCP SYN 扫描、ARP 扫描
  • 协议:DNS 客户端、DHCP 客户端、NTP 客户端
  • 隧道:VXLAN 封装、GRE 隧道、ERSPAN
  • 高级:PCAP 读写、TCP 流重组、BPF 过滤
  • 性能:零拷贝收包、io_uring、packet mmap、批量发送
  • 无线:802.11 WiFi 帧、蓝牙 HCI/L2CAP、Zigbee、LoRaWAN
  • 安全:p0f 指纹、端口扫描、ARP 扫描

每个示例都是可编译运行的小程序,直接 go run 就能跑。


项目地址:github.com/smallnest/goscapy

纯 Go,MIT 协议,零 C 依赖。go get github.com/smallnest/goscapy 就能用。

如果你在做网络工具、安全扫描、协议测试、监控探测——试试 goscapy,可能会让你重新爱上 Go 网络编程。

如何构建你自己的 Agent 运行时

2026年5月28日 · Mike Piccolo, iii 创始人兼 CEO


大多数 agent 团队不构建运行时。他们采用一个。LangChain、LangGraph、OpenAI Agents SDK、Anthropic SDK、CrewAI、AutoGen——循环、工具、记忆、编排,都是作为一个单一决策从货架上挑选的。运行时是一个你 import 的框架。如果里面的什么东西不合适,你就 fork 它、跟它斗争、或者绕过它。

阅读全文

寻找你代码中的臭味:一个让 AI 帮你嗅出架构腐化的开源 Skill

你有没有过这样的经历:接手一个"跑了三年没人敢动"的项目,打开代码仓库一看——

src/ 下面 200 多个文件平铺在一个目录里,没有分层,没有模块边界。一个叫 UserService 的类 1800 行,发邮件、对接支付、状态管理全塞在里面,还挂着三个 TODO 标着"后面要重构"。业务逻辑全堆在 Service 层,Model 类只剩 getter 和 setter,贫血得像张纸。数据库查询藏在 for 循环里,每循环一次发一条 SQL。你问老员工这模块谁负责,得到一句:"这个……已经没人记得了。"

Martin Fowler 把这类问题叫做"代码坏味道"(Code Smell)。Brian Foote 和 Joseph Yoder 在 1997 年的论文里给了一个更直白的名字:Big Ball of Mud(大泥球)。

阅读全文