记一次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

相关推荐
她说..18 小时前
Java 对象相关高频面试题
java·开发语言·spring·java-ee
watson_pillow19 小时前
c++ 协程的初步理解
开发语言·c++
庞轩px19 小时前
深入理解 sleep() 与 wait():从基础到监视器队列
java·开发语言·线程··wait·sleep·监视器
故事和你9119 小时前
洛谷-算法1-2-排序2
开发语言·数据结构·c++·算法·动态规划·图论
小码哥_常19 小时前
Spring Boot 中JWT登录授权+无感刷新,看这篇就够了!
后端
yangyanping2010819 小时前
Go语言学习之对象关系映射GORM
jvm·学习·golang
白毛大侠20 小时前
理解 Go 接口:eface 与 iface 的区别及动态性解析
开发语言·网络·golang
李昊哲小课20 小时前
Python办公自动化教程 - 第7章 综合实战案例 - 企业销售管理系统
开发语言·python·数据分析·excel·数据可视化·openpyxl
Hou'20 小时前
从0到1的C语言传奇之路
c语言·开发语言
码农BookSea21 小时前
深度解析Skills:从Prompt到能力复用的技术革命
后端·ai编程