通过mongo go连接mongodb驱动程序消耗大量内存

通过mongo go连接mongodb驱动程序消耗大量内存,mongodb,go,Mongodb,Go,我正在使用MongoGo驱动程序,并行连接几个端口以检查端口是否被mongodb监听 go版本1.12.3 mongo go驱动程序v1.0 键入BaseServerStatus结构{ 主机字符串`bson:“主机”` 版本字符串`bson:“版本”` 进程字符串`bson:“进程”` Pid int64`bson:“Pid”` 正常运行时间int64`bson:“正常运行时间”` UptimeMillis int64`bson:“UptimeMillis”` UptimeEstimate in

我正在使用MongoGo驱动程序,并行连接几个端口以检查端口是否被mongodb监听

go版本1.12.3 mongo go驱动程序v1.0

键入BaseServerStatus结构{
主机字符串`bson:“主机”`
版本字符串`bson:“版本”`
进程字符串`bson:“进程”`
Pid int64`bson:“Pid”`
正常运行时间int64`bson:“正常运行时间”`
UptimeMillis int64`bson:“UptimeMillis”`
UptimeEstimate int64`bson:“UptimeEstimate”`
LocalTime.time`bson:“LocalTime”`
}
func GetBaseServerStatus(ip,端口字符串)(srvStatus*BaseServerStatus,错误){
opts:=options.Client()
opts.SetDirect(真)
opts.SetServerSelectionTimeout(1*时间秒)
opts.SetConnectTimeout(2*时间秒)
选择SetSocketTimeout(2*时间秒)
opts.SetMaxConnIdleTime(1*时间秒)
选项SetMaxPoolSize(1)
url:=fmt.Sprintf(“mongodb://%s:%s/admin”,ip,端口)
opts.ApplyURI(url)
ctx,:=context.WithTimeout(context.Background(),2*time.Second)
连接,错误:=mongo.Connect(ctx,opts)
如果错误!=零{
fmt.Printf(“新%s:%s mongo连接错误:%v\n”,ip,端口,错误)
返回
}
延迟连接断开(ctx)
错误=连接Ping(ctx,无)
如果错误!=零{
fmt.Printf(“ping%s:%s ping错误:%v\n”,ip,端口,错误)
返回
}
sr:=conn.Database(“admin”).RunCommand(ctx,bson.D{{“serverStatus”,1})
如果sr.Err()!=nil{
fmt.Printf(“获取%s:%s服务器状态错误:%v\n”,ip,端口,sr.Err())
返回
}
srvStatus=new(BaseServerStatus)
err=sr.Decode(srvStatus)
返回
}
func main(){
var wg sync.WaitGroup
//ips:=[]字符串{“xxx.xxx.xxx.xxx:22”}
ips:=[]字符串{“xxx.xxx.xxx.xxx.xxx.xxx:22”、“xxx.xxx.xxx.xxx:80”、“xxx.xxx.xxx.xxx.xxx:7005”、“xxx.xxx.xxx.xxx.xxx.xxx:7006”、“xxx.xxx.xxx.xxx.xxx.xxx:7018”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx:7014”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx:199”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx:8182”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx:701,“xxx.xxx.xxx.xxx.xxx:9009”、“xxx.xxx.xxx.xxx.xxx.xxx:7008”、“xxx.xxx.xxx.xxx:7002”、“xxx.xxx.xxx.xxx:7021”、“xxx.xxx.xxx.xxx.xxx.xxx:7007”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx:7024”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx:7010”、“xxx.xxx.xxx.xxx:7011”、“xxx.xxx.xxx.xxx:7002”、“xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxxxx.xxx.xxx.xxx:7023、xxx.xxx.xxx.xxx.xxx:111、xxx.xxx.xxx.xxx:7001、xxx.xxx.xxx.xxx:8002、xxx.xxx.xxx.xxx:19313、xxx.xxx.xxx.xxx.xxx:15772、xxx.xxx.xxx.xxx:19777、xxx.xxx.xxx.xxx.xxx:15778、xxx.xxx.xxx.xxx:15776“}
对于1;,ip:=范围ips{
工作组.添加(1)
//时间。睡眠(3*时间。秒)
go func(地址字符串){
fmt.Printf(“开始探测端口%s\n”,地址)
GetBaseServerStatus(strings.Split(addr,“:”)[0],strings.Split(addr,“:”)[1])
wg.Done()
}(ip)
}
wg.Wait()
fmt.Println(“扫描结束”)
时间。睡眠(20*时间。秒)
}
但是,如果运行此代码,它将消耗26GB内存 我使用pprof进行诊断,请参见下文

显示15个节点中的前10个 单位百分比总和百分比总和百分比 26.29GB 96.86%96.86%26.29GB 96.86%go.mongodb.org/mongo driver/x/network/connection.(*connection)。ReadWireMessage