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

2019-12-20 10:36:40 +08:00
 koebehshian

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

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

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

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

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

5527 次点击
所在节点    Go 编程语言
26 条回复
chennqqi
2019-12-20 11:18:13 +08:00
你 defer 是不是在循环中 或者异步的,贴代码吧
julyclyde
2019-12-20 11:26:00 +08:00
udp 哪儿来的连接!
Immortal
2019-12-20 11:31:08 +08:00
你看了 netstat 后面的连接状态了么?
Immortal
2019-12-20 11:31:35 +08:00
linux 内核有个连接回收间隔时间的设置 调整下试试
Leigg
2019-12-20 11:39:29 +08:00
http 是基于 tcp 的,你最后一段话是说的与 http 程序的连接不断? tcp 连接即使由一端关闭也不会马上释放,udp 貌似一样的
koebehshian
2019-12-20 11:53:23 +08:00
@Immortal 状态是 established
koebehshian
2019-12-20 12:00:29 +08:00
@chennqqi 连接 udp 专门写了个函数,这个函数在 http.HandleFunc("/api/xxx", func (w http.ResponseWriter, r *http.Request){
调用了连接 udp 的函数
})
index90
2019-12-20 12:03:00 +08:00
@Immortal #3 udp 没有状态的
index90
2019-12-20 12:04:09 +08:00
@koebehshian 你还能看到状态,你确定你的情况是 udp 链接越来越多?
koebehshian
2019-12-20 12:10:25 +08:00
@Leigg udp 服务那边没关闭,可能就是这个原因,我怀疑过,但加了关闭连接以后,好像是关得太快,客户端那边收不到回复了
sagaxu
2019-12-20 12:16:31 +08:00
udp 连接和 tcp 粘包更配哦
koebehshian
2019-12-20 12:22:35 +08:00
@Leigg 我刚才又试了一下 go 一个线程 sleep 一下再关掉连接,发现直接客户端收不到数据了,仔细一看代码,udp 服务端只有一个句柄,调的 Readfrom 函数,所以不能关
koebehshian
2019-12-20 12:28:12 +08:00
koebehshian
2019-12-20 12:45:30 +08:00
@index90 我加了图,netstat 命令输出有 udp
koebehshian
2019-12-20 12:46:02 +08:00
@Immortal 你说的具体怎么调整
ipwx
2019-12-20 12:47:18 +08:00
udp 从协议设计上就只有超时没有关闭
koebehshian
2019-12-20 12:58:27 +08:00
@ipwx 我看了 golang UDPConn.Close 方法的源码,是 close 了一个文件描述符,对比 BSD socket 的 UDP 客户端,也有一个 fd 需要关闭
chennqqi
2019-12-20 14:11:40 +08:00
@koebehshian 你贴一下代码吧,怎么建立连接,怎么关闭的
mengzhuo
2019-12-20 14:12:50 +08:00
没有回包的接口,Send 完就 close,兜底 Settimeout 就好了
有回包的,收到就 close,然后记得发的时候加 cookie
index90
2019-12-20 14:22:06 +08:00
提供 http 服务的那个程序,是不是从 udp 读取数据啊?如果没有设置超时时间,而服务端又没有返回,或者数据丢了,都会导致客户端一直等待的哦。最好把你连接 udp 的函数贴一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/630756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX