有2个关于协程方面的疑问
- go语言可以轻松创建大量的协程,那么这个协程数量应该有个上限吧,一般是多少呢?是十万,还是一百万,还是更多?
- 假如系统最多能创建100万个协程,而且每个协程里面的代码都是死循环,就是这些协程不会退出,那么当创建第1000001个协程时,程序的行为会怎样?是程序直接崩溃,还是让第1000001个协程阻塞等待,等调度器重新调度?
有疑问加站长微信联系(非本文作者)

有2个关于协程方面的疑问
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
数量依赖系统资源,比如内存啊之类的,没有其他的限制。
比如8G的内存,可以创建多少个协程?
这个也是不确定的,一个 goroutine 占用 2k 内存,但一个系统其他地方会使用内存、资源。一般写代码时,不太需要可以注意 goroutine 的数量
我考虑的是高并发的服务器场景,比如同时有几千万的客户端连接上来,每个连接使用1个协程进行处理,这是就需要创建大量的协程了
这样的场景一点问题都没有啊,你担心什么?
假设有一千万个客户端同时连接服务端,这时服务端需要创建一千万个协程来处理请求,而且每个协程都是一个for循环不断的读取网络数据,这个for循环是个死循环,这种情况下程序性能怎么样?会不会很差?我是golang初学者,望指点。
这涉及到可能 IO 是瓶颈,而不是说 goroutine 是瓶颈。一般没必要特意限制 goroutine 的数量,更多的可能会是系统资源限制,这时可能需要优化程序(比如 gc 之类的),或者需要更多的服务器支持。
你的意思是说这种高并发的场景,需要服务器集群来支持,比如单台服务器只处理1万请求,然后1000台服务器组成集群,这样就可以处理1000万个请求了,是吗?
你的量很大,单机肯定不行啊,而且单机会有单点故障,这是不能容忍的
嗯。说的是,这个确实需要服务器集群了,还需要做负载均衡,没接触过这些东西,但是对它很感兴趣,想学习下。就是不知道从何入手,有这方面的书可以推荐下吗?
目前 go 语言这方面的书好像没见过有
嗯。那么就先考虑单台服务器,先做到单台服务器上的go服务器程序性能尽量优越,这方面的编程示例或者书籍有吗?
一般来说也没有必要创造这么多goroutine呢。 用一个goroutine池可以减少goroutine数量。
嗯。具体如何实现呢?能否贴下代码?
M:machine 默认值10000
sched.maxmcount = 10000
P:processor 默认值256_MaxGomaxprocs = 1 << 8
G:goroutine 通过gfree、runq,队列形式被调用,无直接数量限制。具体参见runtime2.go
嗯。长见识了
@linkerlin protoactor的#162 issue是你提交的吗?
这个问题确实挺业余。。要知道系统最大瓶颈是io 那种并发量不等你创建那么多协程,第一io先挂了,第二内存满了,程序溢出崩溃。。。
理论: 执行一个goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。 实际情况:现实任何一个server除了goroutine还有很多其他占用CPU和MEM的部分。 如果你有此需求, 无论采用什么语言都会有此问题, 那么只能通过集群 负载均衡等一系列措施去执行了
我没接触过这块,但是很感兴趣,所以想了解下。
如果服务器程序的网络模型采用select模型,这种模型只能支持1000个左右的并发量,再多就报错了。在这种情况下,如果有100台这样的服务器在跑的话,就能达到10万的并发量了,是这样吗?
理论上是这样, 但是中间还有网络传输压力等 其实你个人不必去纠结这个并发量问题, 其一:这个并发量你可以去完成12306了; 其二: 真有这个并发量的时候, 不是这么简单可以搞定的。 我想你只是想了解集群和负载均衡之类的。 你先看看nignx之类的容器
嗯。就是想了解高并发的服务器是如何做到的,很想学习这块。搞了很多年的客户端,一直想了解服务端的东西,很感兴趣。
go中的一些最大限制: sched.maxmcount = 10000 // maximum number of m's allowed (or die)
// 最大线程数 const ( // The max value of GOMAXPROCS. // There are no fundamental restrictions on the value. _MaxGomaxprocs = 1 << 10 )
新增goroutine 的限制条件是能不能获取到足够大小的stack size。
基于go1.9
这个sched.maxmcount = 10000指的是什么?是最大协程数,还是什么?
G: 表示goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。 P: 表示逻辑processor,P的数量决定了系统内最大可并行的G的数量(前提:系统的物理cpu核数>=P的数量);P的最大作用还是其拥有的各种G对象队列、链表、一些cache和状态。 M: M代表着真正的执行计算资源。在绑定有效的p后,进入schedule循环;而schedule循环的机制大致是从各种队列、p的本地队列中获取G,切换到G的执行栈上并执行G的函数,调用goexit做清理工作并回到m,如此反复。M并不保留G状态,这是G可以跨M调度的基础。
多谢指点。这些理论以后在实践中慢慢领悟
是的
Great! balance bike