两个 golang 程序,一个实现通用的功能,接口是 udp server ;
另一个根据业务处理数据,并提供 http 接口;
另外一个 shell 脚本,用 curl 定时调用 http 接口,间接调用了 udp 接口。
结果 netstat 发现与 udp 的连接越来越多,偶尔会减一个,总体一直在增长;
netstat 发现进程 id 是提供 http 接口的那个程序,我使用的是短连接,net.Dial 后,就 defer conn.Close(),按理说肯定能关闭,事实也是并非连接数量不减小,但减小速度太慢了。
1
chennqqi 2019-12-20 11:18:13 +08:00
你 defer 是不是在循环中 或者异步的,贴代码吧
|
2
julyclyde 2019-12-20 11:26:00 +08:00 1
udp 哪儿来的连接!
|
3
Immortal 2019-12-20 11:31:08 +08:00
你看了 netstat 后面的连接状态了么?
|
4
Immortal 2019-12-20 11:31:35 +08:00
linux 内核有个连接回收间隔时间的设置 调整下试试
|
5
Leigg 2019-12-20 11:39:29 +08:00 via Android
http 是基于 tcp 的,你最后一段话是说的与 http 程序的连接不断? tcp 连接即使由一端关闭也不会马上释放,udp 貌似一样的
|
6
koebehshian OP @Immortal 状态是 established
|
7
koebehshian OP @chennqqi 连接 udp 专门写了个函数,这个函数在 http.HandleFunc("/api/xxx", func (w http.ResponseWriter, r *http.Request){
调用了连接 udp 的函数 }) |
9
index90 2019-12-20 12:04:09 +08:00
@koebehshian 你还能看到状态,你确定你的情况是 udp 链接越来越多?
|
10
koebehshian OP @Leigg udp 服务那边没关闭,可能就是这个原因,我怀疑过,但加了关闭连接以后,好像是关得太快,客户端那边收不到回复了
|
11
sagaxu 2019-12-20 12:16:31 +08:00 via Android 3
udp 连接和 tcp 粘包更配哦
|
12
koebehshian OP @Leigg 我刚才又试了一下 go 一个线程 sleep 一下再关掉连接,发现直接客户端收不到数据了,仔细一看代码,udp 服务端只有一个句柄,调的 Readfrom 函数,所以不能关
|
13
koebehshian OP ![QOnAdP.png]( https://s2.ax1x.com/2019/12/20/QOnAdP.png)
|
14
koebehshian OP @index90 我加了图,netstat 命令输出有 udp
|
15
koebehshian OP @Immortal 你说的具体怎么调整
|
16
ipwx 2019-12-20 12:47:18 +08:00 via Android
udp 从协议设计上就只有超时没有关闭
|
17
koebehshian OP @ipwx 我看了 golang UDPConn.Close 方法的源码,是 close 了一个文件描述符,对比 BSD socket 的 UDP 客户端,也有一个 fd 需要关闭
|
18
chennqqi 2019-12-20 14:11:40 +08:00
@koebehshian 你贴一下代码吧,怎么建立连接,怎么关闭的
|
19
mengzhuo 2019-12-20 14:12:50 +08:00 via iPhone
没有回包的接口,Send 完就 close,兜底 Settimeout 就好了
有回包的,收到就 close,然后记得发的时候加 cookie |
20
index90 2019-12-20 14:22:06 +08:00 1
提供 http 服务的那个程序,是不是从 udp 读取数据啊?如果没有设置超时时间,而服务端又没有返回,或者数据丢了,都会导致客户端一直等待的哦。最好把你连接 udp 的函数贴一下
|
21
koebehshian OP 解决了,是 Read 前没有调 SetReadDeadline
|
22
realpg 2019-12-20 18:16:33 +08:00
我比较好奇你这是什么神仙 netstat 能给一个本机 udp 出 established 的状态
|
23
koebehshian OP |
24
koebehshian OP @realpg https://github.com/ecki/net-tools/blob/master/netstat.c 第 1288 行`udp_state = _("ESTABLISHED");`
|
25
catror 2019-12-20 22:05:08 +08:00 via Android
业务程序也用 ListenUDP 就行了,用 DialUDP 确实会有连接
|