我之前写过一个做 dns 查询的 goroutine pool,用固定数量的 goroutine 来做 dns 查询,从而限制由 dns 查询阻塞而可能创建的线程数量。
如果程序不用 cgo 的话可以禁用 cgo,这样 net package 做 dns 解析的时候会使用 go 自己实现的 dns client,所以不会出现创建过多线程的问题,也不会出现整个程序 block 的问题。
>
> On Sunday, January 20, 2013 7:28:10 PM UTC+8, Wendal Chen wrote:
> > 这个已经解决了
> >
> > 问题在于每次proxy一个请求, golang都会查dns, DialTimeout执行超时后并不会终止dns查询.
> >
> > 在我使用的环境中, 3G网络不稳定,导致dns经常挂住不返回结果, 累计到一定数量后, 就报这种异常然后崩溃了
> >
> >
> > 解决方法就是加个dns cache,在proxy之前,先自行将域名从cache中查出来. 上线跑了一周, 没有再发现类似崩溃的情况.
> >
> > 在 2012年10月25日上午9:54,Wendal Chen <
wenda...@gmail.com (javascript:)>写道:
> > > runtime/cgo: pthread_create failed: Resource temporarily unavailable
> > > SIGABRT: abort
> > > PC=0xffffe424
> > >
> > > //然后是很长一堆的goroutine
> > >
> > > 程序是一个http服务,类似与代理服务器,所以goroutine的数量不少
> > >
> > > 编译环境 Ferda 14 x86
> > > 运行环境 OpenSUSE 11.4 x86 4核CPU
> > >
> > > 程序启动时会调用
> > > runtime.GOMAXPROCS(runtime.NumCPU())
> > >
> > > 这个异常是运行一段时间之后才出现的, 就出现过一次,暂没能重现. dmesg没看到error输出
> > >
> > > 请问一下这个异常是我代码的问题呢,还是golang的某些限制或者bug吗? 谢谢
> > >
> > >
> > > --
> > > Wendal Chen
> > > GuangDong China
> >
> >
> >
> >
> > --
> > Wendal Chen
> > GuangDong China
>
>