程序是调个 c 库实现文件收发,并将传输中的状态通过 http 发送给另外的监控服务。 发现测试过一段时候以后,会有很多的线程,但是用 dlv 调试看没多少 goroutines,而且日志也显示为传输开的 goutine 都退出了。昨天测试一下,竟然开了 1000 多个线程。
以下是其中一个 thread 的 stack:
(dlv) bt
0 0x000000000046df03 in runtime.futex
at /home/vagrant/resource/go/src/runtime/sys_linux_amd64.s:388
1 0x0000000000437e92 in runtime.futexsleep
at /home/vagrant/resource/go/src/runtime/os_linux.go:45
2 0x000000000041e042 in runtime.notesleep
at /home/vagrant/resource/go/src/runtime/lock_futex.go:145
3 0x000000000044036d in runtime.stopm
at /home/vagrant/resource/go/src/runtime/proc.go:1594
4 0x0000000000441178 in runtime.findrunnable
at /home/vagrant/resource/go/src/runtime/proc.go:2021
5 0x0000000000441cec in runtime.schedule
at /home/vagrant/resource/go/src/runtime/proc.go:2120
6 0x0000000000442063 in runtime.park_m
at /home/vagrant/resource/go/src/runtime/proc.go:2183
7 0x0000000000469f1b in runtime.mcall
at /home/vagrant/resource/go/src/runtime/asm_amd64.s:240
通过网络了解了一些 go 的调度器的知识,也看了上述相关的代码,没发现有什么异常,就是 thread(即所谓的 m)本身退出过程是正确的,应该会 futex_wait,等待下一次调度。 但貌似之后有 goroutine 都不会再使用这个 m 来调度,需要新开线程来执行,所以造成线程越来越多。
go 版本是 1.7.1, 有没有大侠能够指点一下迷津,谢谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.