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

相关推荐
whale fall1 小时前
如何在同一台电脑里安装32 位 Python 和 64 位 Python
开发语言·笔记·python·学习
.清和.2 小时前
【js】Javascript事件循环机制
开发语言·javascript·ecmascript
码农小卡拉2 小时前
Prometheus 监控 SpringBoot 应用完整教程
spring boot·后端·grafana·prometheus
瑞雪兆丰年兮2 小时前
[从0开始学Java|第十一天]ArrayList
java·开发语言
黄筱筱筱筱筱筱筱2 小时前
第三次Python练习题
开发语言·python
夜郎king2 小时前
基于 Java 实现数九天精准计算:从节气算法到工程化落地
java·开发语言
心柠2 小时前
原型和原型链
开发语言·javascript·ecmascript
悟能不能悟2 小时前
java.sql.SQLSyntaxErrorException: ORA-01031: insufficient privileges
java·开发语言
代码游侠2 小时前
C语言核心概念复习(三)
开发语言·数据结构·c++·笔记·学习·算法