V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
koebehshian
V2EX  ›  Go 编程语言

[golang]明明关闭了 udp 连接,但 netstat 显示连接越来越多,偶尔会减一个,但减小的速度远远慢于增加的速度

  •  
  •   koebehshian · 2019-12-20 10:36:40 +08:00 · 5531 次点击
    这是一个创建于 1802 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个 golang 程序,一个实现通用的功能,接口是 udp server ;

    另一个根据业务处理数据,并提供 http 接口;

    另外一个 shell 脚本,用 curl 定时调用 http 接口,间接调用了 udp 接口。

    结果 netstat 发现与 udp 的连接越来越多,偶尔会减一个,总体一直在增长;

    netstat 发现进程 id 是提供 http 接口的那个程序,我使用的是短连接,net.Dial 后,就 defer conn.Close(),按理说肯定能关闭,事实也是并非连接数量不减小,但减小速度太慢了。

    第 1 条附言  ·  2019-12-20 12:32:29 +08:00

    QOnAdP.png

    26 条回复    2019-12-20 22:10:19 +08:00
    chennqqi
        1
    chennqqi  
       2019-12-20 11:18:13 +08:00
    你 defer 是不是在循环中 或者异步的,贴代码吧
    julyclyde
        2
    julyclyde  
       2019-12-20 11:26:00 +08:00   ❤️ 1
    udp 哪儿来的连接!
    Immortal
        3
    Immortal  
       2019-12-20 11:31:08 +08:00
    你看了 netstat 后面的连接状态了么?
    Immortal
        4
    Immortal  
       2019-12-20 11:31:35 +08:00
    linux 内核有个连接回收间隔时间的设置 调整下试试
    Leigg
        5
    Leigg  
       2019-12-20 11:39:29 +08:00 via Android
    http 是基于 tcp 的,你最后一段话是说的与 http 程序的连接不断? tcp 连接即使由一端关闭也不会马上释放,udp 貌似一样的
    koebehshian
        6
    koebehshian  
    OP
       2019-12-20 11:53:23 +08:00
    @Immortal 状态是 established
    koebehshian
        7
    koebehshian  
    OP
       2019-12-20 12:00:29 +08:00
    @chennqqi 连接 udp 专门写了个函数,这个函数在 http.HandleFunc("/api/xxx", func (w http.ResponseWriter, r *http.Request){
    调用了连接 udp 的函数
    })
    index90
        8
    index90  
       2019-12-20 12:03:00 +08:00
    @Immortal #3 udp 没有状态的
    index90
        9
    index90  
       2019-12-20 12:04:09 +08:00
    @koebehshian 你还能看到状态,你确定你的情况是 udp 链接越来越多?
    koebehshian
        10
    koebehshian  
    OP
       2019-12-20 12:10:25 +08:00
    @Leigg udp 服务那边没关闭,可能就是这个原因,我怀疑过,但加了关闭连接以后,好像是关得太快,客户端那边收不到回复了
    sagaxu
        11
    sagaxu  
       2019-12-20 12:16:31 +08:00 via Android   ❤️ 3
    udp 连接和 tcp 粘包更配哦
    koebehshian
        12
    koebehshian  
    OP
       2019-12-20 12:22:35 +08:00
    @Leigg 我刚才又试了一下 go 一个线程 sleep 一下再关掉连接,发现直接客户端收不到数据了,仔细一看代码,udp 服务端只有一个句柄,调的 Readfrom 函数,所以不能关
    koebehshian
        13
    koebehshian  
    OP
       2019-12-20 12:28:12 +08:00
    koebehshian
        14
    koebehshian  
    OP
       2019-12-20 12:45:30 +08:00
    @index90 我加了图,netstat 命令输出有 udp
    koebehshian
        15
    koebehshian  
    OP
       2019-12-20 12:46:02 +08:00
    @Immortal 你说的具体怎么调整
    ipwx
        16
    ipwx  
       2019-12-20 12:47:18 +08:00 via Android
    udp 从协议设计上就只有超时没有关闭
    koebehshian
        17
    koebehshian  
    OP
       2019-12-20 12:58:27 +08:00
    @ipwx 我看了 golang UDPConn.Close 方法的源码,是 close 了一个文件描述符,对比 BSD socket 的 UDP 客户端,也有一个 fd 需要关闭
    chennqqi
        18
    chennqqi  
       2019-12-20 14:11:40 +08:00
    @koebehshian 你贴一下代码吧,怎么建立连接,怎么关闭的
    mengzhuo
        19
    mengzhuo  
       2019-12-20 14:12:50 +08:00 via iPhone
    没有回包的接口,Send 完就 close,兜底 Settimeout 就好了
    有回包的,收到就 close,然后记得发的时候加 cookie
    index90
        20
    index90  
       2019-12-20 14:22:06 +08:00   ❤️ 1
    提供 http 服务的那个程序,是不是从 udp 读取数据啊?如果没有设置超时时间,而服务端又没有返回,或者数据丢了,都会导致客户端一直等待的哦。最好把你连接 udp 的函数贴一下
    koebehshian
        21
    koebehshian  
    OP
       2019-12-20 14:45:57 +08:00
    解决了,是 Read 前没有调 SetReadDeadline
    realpg
        22
    realpg  
       2019-12-20 18:16:33 +08:00
    我比较好奇你这是什么神仙 netstat 能给一个本机 udp 出 established 的状态
    koebehshian
        24
    koebehshian  
    OP
       2019-12-20 21:35:22 +08:00
    @realpg https://github.com/ecki/net-tools/blob/master/netstat.c 第 1288 行`udp_state = _("ESTABLISHED");`
    catror
        25
    catror  
       2019-12-20 22:05:08 +08:00 via Android
    业务程序也用 ListenUDP 就行了,用 DialUDP 确实会有连接
    catror
        26
    catror  
       2019-12-20 22:10:19 +08:00 via Android
    @catror Dial 之后的连接不是 UDP 协议概念上的连接,而是代码实现上的,connected UDP socket
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5595 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.