上一句我們從源代碼分析了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