上一句我們從源代碼分析了go net庫DNS在UNIX平臺上的分析邏輯原理。這篇文章我們主要從實(shí)戰(zhàn)角度解決go程序,但沒有DNS緩存,因此解決了發(fā)生的io阻塞。

確認(rèn)Cgo和go的分析性能

Go Resolver和Cgo Resolver代碼funcresolverbaidu () ([] string,error) {

resolver :=net . resolver { prefergo : false }

Ctx :=con()

Return re(ctx,“www.baidu.com”)

}

func benchmarkresolverbaidu(b *){

for I :=0;I b . N;I {

_,err :=ResolverBaidu()

If err==nil {

Continue

}

}

}

用于基準(zhǔn)測試的兩個場景[root @ test-go-build-87 netresolvertest]# export go debug=net DNS=go;Go test - bench=。

GOOS : Linux

Goarch: amd64

Pkg: netResolverTest

benchmarkresolverbaidu-8 453 2725275 ns/op

帕斯

Ok netResolverTest 1.514s

[root @ test-go-build-87 netresolvertest]# export go debug=net DNS=CGO;Go test - bench=。

GOOS : Linux

Goarch: amd64

Pkg: netResolverTest

benchmarkresolverbaidu-8 458 3810726 ns/op

帕斯

Ok netResolverTest 2.030s

可以看出,沒有緩存,C和go的分析基本差不多。

為Cgo提供緩存

Nscd為CGO提供了名稱解析緩存#安裝和啟動

Yum/apt安裝nscd

Service nscd start

#請重新測試一下

[root @ test-go-build-87 netresolvertest]# export go debug=net DNS=CGO;Go test - bench=。

GOOS : Linux

Goarch: amd64

Pkg: netResolverTest

benchmarkresolverbaidu-8 57067 20947 ns/op

帕斯

Ok netResolverTest 1.429s

沒看錯。這才是真正的結(jié)果。帶緩存的CGO分析性能是GO分析性能的100倍以上。那你最好直接使用CGO來分析nscd。但是不要忘記CGO not go。事實(shí)上,有了上面的測試結(jié)果,我們就能想到。沒有解決,與CGO

為Go實(shí)施分析緩存

Go解析緩存package resolverCache實(shí)現(xiàn)

Import(

" Context "

數(shù)學(xué)/rand '

" Net "

“反射”

“同步”

“時間”

)。

Varstore=make(地圖[string] [] string)

Type resolverCache struct {

Context con

Resolver *net。Resolver

時間(小時)

洛克

}

Func New() *resolverCache {

Ctx :=con()

R :=resolverCache{

Context: CTX、

}

If r.Time==0 {

R.Time=* 30

}

Go func() {

For {

For k、v :=范圍存儲{

Ips,err :=r.lookup(k)

If err!=nil {

Continue

}

If re(v,ips) {

Continue

}

R.store(k、ips)

}

)。

}

}()

Return r

}

func(r * resolver cache)lookup hosts(域字符串)([] string,error) {

Return R. lookup(域)

}

func(r * resolver cache)lookuponehost(域字符串)字符串{

Ips、err:=r.lookup(域)

If err!=nil {

Return ' '

}

Rands :=rand。New()。UnixNano())

Index :=rands。Intn(len(ips))

Return IPS [索引]

}

Func (r * resolver cache) lookup(域字符串)([] string,error) {

Var(

值接口{}

Ok bool

)。

R.Lock.RLock()

值,ok=store [域];

R.Lock.RUnlock()

If!Ok {

Return R. lookuphost(域)

}

Return value。([]string),nil

}

func(r * resolver cache)lookup host(域字符串)([] string,error) {

Ips、err :=r.re、域)

If err==nil {

R.存儲(域、IPS)

}

Return ips、err

}

Func (r * resolver cache) store(域字符串,IPS []字符串){

R.Lock.Lock()

Store [域]=IPS

R.Lock.Unlock()

}

啟用緩存的var resolve=re()

func resolverbaidusecache(hoststring)([]string,error) {

Ips、err:=re(主機(jī))

Return ips、err

}

func benchmarknameresolverbaidusecache(b *){

for I :=0;I b . N;I {

_,err:=resolverbaidusecache(主機(jī))

If err==nil {

Continue

}

}

}

基準(zhǔn)測試,每基準(zhǔn)測試3次,每次3秒[root @ test-go-build-87 netresolvertest]# export go debug=net DNS=CGO;Gotest-bench=.-benchtime=3s-count=3

GOOS : Linux

Goarch: amd64

Pkg: netResolverTest

benchmarkresolverbaidu-8 169261 21918 ns/op

benchmarkresolverbaidu-8 162778 21683 ns/op

benchmarkresolverbaidu-8 175989 21429 ns/op

benchmarknameresolverbaidusecache-8 35489584 110 ns/op

benchmarknameresolverbaidusecache-8 31780479 116 ns/op

benchmarknameresolverbaidusecache-8 29593422 105 ns/op

帕斯

Ok netResolverTest 22.758s

由于Nscd實(shí)施的高速緩存,CGO分析性能領(lǐng)先于未高速緩存的GO分析,但我們可以看到,我們實(shí)施的這個高速緩存將遠(yuǎn)遠(yuǎn)落后于nscd高速緩存。(威廉莎士比亞,《北方司法》前情提要)。

最后

通過上面源碼閱讀分析和代碼實(shí)戰(zhàn),你應(yīng)該已經(jīng)很清楚go語言在域名解析這塊的機(jī)制,上面dnscache代碼已經(jīng)開源地址gi

1.《go分析結(jié)果怎么?終于找到答案了從net庫源碼窺探Go程序linux平臺Dns解析原理(二)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《go分析結(jié)果怎么?終于找到答案了從net庫源碼窺探Go程序linux平臺Dns解析原理(二)》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/3186476.html