先说个我的应用场景,在入口处初始化了producer,后面一直在复用这个连接,并且是一个任务脚本,一直在跑,环境centos8
问题:服务器内存不断上涨
一开始以为是协程环境没有正常退出导致资源不能释放,后来使用pprof也没有发现游有用的信息,但是看到newProducer的时候有一段代码没看懂
总觉得是在这里出的问题,后来继续往下追
在看到这里的时候,我觉得差不多应该是发现问题了,然后我全局搜索这个chan是否有被消费,事实证明并没有,OK,试一下,把这个chan关掉,由于上面的if判断了一个fwDr,找到这个值,设置为false
这里就是,传参的时候设置为false,等待验证
最终确实是我想的那样,设置为false后内存一直是正常了
当然问题是解决了,但是原理呢,其实在启动生产者的时候就初始化了一个goroutine,然后一直在监听各种事件,在没有任何动作消费的时候,内存不会变化,但是当有动作时,一旦匹配到对应的类型后,就会执行相应的动作,这里就是有消息要进行消费时,就会往这个chan里放数据
为什么会是这样呢,后来查看produce的描述,看到这里是异步的,需要用户自己从event事件中取结果,默认这个缓冲区是1000000,挺大的是吧,如果不取那么就会一直往里写,直到服务器内存撑爆,或者缓冲区的达到限定值,直接阻塞,当然它还提供了其他的生产方式,可以参考他的producer_test.go文件
吐槽一下:虽然问题很简单,但是排查的过程很难受,去了他的github上,根本找不到这个参数的说明跟配置(也可能是我没找到,有找到的同学,记得评论一下,或者私信我一下),没办法,官网不说,只能自己搞
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)