记一次golang进程执行卡住的问题排查

记一次golang进程执行卡住的问题排查

  • 现象

    在linux终端执行 golang 编译的二进制文件,发现进程卡住了,日志输出和终端输出看不到任何信息

  • ps -ef | grep xxx 查看进程 pid

  • cat /proc/$pid/stack 查看进程在内核空间中的函数调用链,显示进程当前在内核中执行到哪里,发现关键字 netlink、recvfrom

bash 复制代码
[<ffffffffb3ddca90>] __skb_wait_for_more_packets+0x120/0x180
[<ffffffffb3ddce5f>] __skb_recv_datagram+0x6f/0xd0
[<ffffffffb3ddcf03>] skb_recv_datagram+0x43/0x60
[<ffffffffb3e22252>] netlink_recvmsg+0x62/0x490
[<ffffffffb3dcc4e5>] sock_recvmsg+0xc5/0x100
[<ffffffffb3dcc658>] SYSC_recvfrom+0xe8/0x160
[<ffffffffb3dce45e>] SyS_recvfrom+0xe/0x10
[<ffffffffb3f1f7d5>] system_call_fastpath+0x1c/0x21
[<ffffffffffffffff>] 0xffffffffffffffff 
  • 分析代码哪里用到了 netlink

    代码 GetLocalIP() 里调用 net.Interfaces() / Interface.Addrs() 获取网卡ip信息

    Go 的 net 包在 Linux 上拿 interface/address 信息,会走到 syscall.NetlinkRIB 这类封装,往 NETLINK_ROUTE 发请求并循环读回包

    用户态在 recvfrom 等待 netlink 的后续 multipart 消息(理论上最终应收到 NLMSG_DONE);但实际未收到更多数据,导致阻塞

  • go issue
    https://github.com/golang/go/issues/69797

相关推荐
caimouse2 小时前
reactos编码规范
c语言·开发语言
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
星辰徐哥6 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥6 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐6 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐6 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录