smallnest / gitalk

gitalk for colobu
19 stars 0 forks source link

百万 Go TCP 连接的思考: epoll方式减少资源占用 #92

Open smallnest opened 5 years ago

smallnest commented 5 years ago

https://colobu.com/2019/02/23/1m-go-tcp-connection/

rfyiamcool commented 5 years ago

evio是tidwall封装epoll实现的事件池,注册方法的逻辑不能有阻塞的,当然这也可以理解,作者已经做了mulit event loop,可以跑多核了。

rfyiamcool commented 5 years ago

一般Go语言的TCP(和HTTP)的处理都是每一个连接启动一个goroutine去处理...

大佬,貌似这个说法有待斟酌。 一般咱们常见的golang的服务端, 一个连接通常会有两个协程的 (读写协程), 有些低质量的client lib可能每个连接都会独立一个心跳协程。

smallnest commented 5 years ago

https://github.com/golang/go/blob/master/src/net/http/server.go#L2884

如果你读写分离,启动两个goroutine per conn也没问题,启动100个goroutine per commands in conn也没问题, 模式都是一样的, mutilple goroutine per connection

@rfyiamcool

一般Go语言的TCP(和HTTP)的处理都是每一个连接启动一个goroutine去处理...

大佬,貌似这个说法有待斟酌。 一般咱们常见的golang的服务端, 一个连接通常会有两个协程的 (读写协程), 有些低质量的client lib可能每个连接都会独立一个心跳协程。

rfyiamcool commented 5 years ago

@smallnest 是的 😁

niumoo commented 5 years ago

好喜欢博主的博客页面,不知道使用的是hexo 哪个主题呢?可否分享下。

jkgeekJack commented 5 years ago

在linux上跑epoll跑错这个

fdVal %+v &{{0 0 0} 7 10 1 true false tcp 0xc4200e0150 0xc4200e0180 <nil> {139624608312816}}
pfdVal %+v <invalid reflect.Value>
panic: reflect: call of reflect.Value.FieldByName on zero Value
motecshine commented 5 years ago

不要轻易开启tcp.recycle 如果客户端是nat 会影响tcp握手, 短连接很明显

yunyouhai commented 5 years ago

"50个docker容器做客户端,每个建立2万个连接,总共建立一百万的连接" 我看用docker的bridge模式,而bridge模式的NAT方式IP+端口做转发。IP不变,只用端口,也不可能超过65535连接。也没找到相关文章的实现原理,还是端口复用导致的提升连接数?

ldeng7 commented 5 years ago

应该可以完全使用系统调用,不使用conn之类的封装,来避免每次通过反射来获取conn的fd

szl-926929 commented 5 years ago

为什么例1要起一个http server呀?

qiuhoude commented 5 years ago

@szl-926929 为什么例1要起一个http server呀?

使用了pprof吧

jackru88888 commented 5 years ago

服务端worker poll模式,同一个conn有可能被分配到了不同的gorutine,同一时间可能有多个gorutine对同一个conn进行数据读取,这样是比较危险的,很有可能读到一些数据错乱的数据,需要应用层自己重新拼接数据

sugtex commented 4 years ago

@ldeng7 应该可以完全使用系统调用,不使用conn之类的封装,来避免每次通过反射来获取conn的fd

有吗有吗,这个好

xlemon96 commented 4 years ago

@jackru88888 服务端worker poll模式,同一个conn有可能被分配到了不同的gorutine,同一时间可能有多个gorutine对同一个conn进行数据读取,这样是比较危险的,很有可能读到一些数据错乱的数据,需要应用层自己重新拼接数据

不会吧,你再解析http或者tcp的时候肯定是按照协议读取到一个请求后再处理,不会读取出错呀

yueshouhu commented 3 years ago

@szl-926929 为什么例1要起一个http server呀?

为了用pprof做性能分析

wangjian138 commented 3 years ago

easygo 的作者为什么用eventfd实现epoll,有什么好处或者不同吗

NiceroEins commented 3 years ago

大佬 unix包是哪来的?

ccrzzu commented 2 years ago

同问,这个unix包哪儿来的呢?