dubbo-go icon indicating copy to clipboard operation
dubbo-go copied to clipboard

common.MergeURL占用内存一直上升

Open fubug opened this issue 3 years ago • 39 comments

pprof001 (1) image

fubug avatar Aug 25 '22 07:08 fubug

@彭笳鑫

zhaoyunxing92 avatar Sep 09 '22 13:09 zhaoyunxing92

初步怀疑像先merge了一个 url,然后在把 url 更新到event里,下次从event里面在拿出来在 merge,有更详细的复现步骤么 @fubug

Lvnszn avatar Sep 14 '22 15:09 Lvnszn

try

func MergeURL(serviceURL *URL, referenceURL *URL) *URL {
	// After Clone, it is a new URL that there is no thread safe issue.
	mergedURL := serviceURL.Clone()
	// iterator the referenceURL if serviceURL not have the key ,merge in
	// referenceURL usually will not changed. so change RangeParams to GetParams to avoid the string value copy.// Group get group
	for key, value := range referenceURL.GetParams() {
		if _, ok := mergedURL.GetNonDefaultParam(key); !ok {
			if len(value) > 0 {
				mergedURL.params[key] = value
			}
		}
	}

	// loadBalance,cluster,retries strategy config
	methodConfigMergeFcn := mergeNormalParam(mergedURL.params, referenceURL, []string{constant.LoadbalanceKey, constant.ClusterKey, constant.RetriesKey, constant.TimeoutKey})

	// remote timestamp
	if v, ok := serviceURL.GetNonDefaultParam(constant.TimestampKey); !ok {
		mergedURL.params[constant.RemoteTimestampKey] = []string{v}
		mergedURL.params[constant.TimestampKey] = []string{referenceURL.GetParam(constant.TimestampKey, "")}
	}

	// finally execute methodConfigMergeFcn
	for _, method := range referenceURL.Methods {
		for _, fcn := range methodConfigMergeFcn {
			fcn("methods." + method)
		}
	}
	// In this way, we will raise some performance.
	return mergedURL
}

baerwang avatar Oct 31 '22 10:10 baerwang

疯狂调用 MergeURL这个函数的确会内存上升,细节在定位

Lvnszn avatar Nov 04 '22 08:11 Lvnszn

目前是有内存泄露的问题吗,其实上面那个图和top其实说明不了啥问题,如果有内存泄露的情况,发个复现步骤吧

georgehao avatar Nov 04 '22 09:11 georgehao

如果可以的话,发一下内存的增长的截图。如果有条件的发下 内存 diff profile的log

curl -s http://127.0.0.1:8080/debug/pprof/heap > 1231.heap
过 一段时间 (5m, 10m, 30m, 1h)
curl -s http://127.0.0.1:8080/debug/pprof/heap > 1241.heap
go tool pprof --http :9090 --base 1231.heap  1241.heap

georgehao avatar Nov 04 '22 09:11 georgehao

截图失真比较严重,辛苦下载下来看下吧https://github.com/fubug/go/blob/main/start%20inuse_space.html

fubug avatar Nov 04 '22 11:11 fubug

目前是有内存泄露的问题吗,其实上面那个图和top其实说明不了啥问题,如果有内存泄露的情况,发个复现步骤吧

稍等,我花时间整理个最小版本的代码

fubug avatar Nov 04 '22 12:11 fubug

初步怀疑推送风暴,可以提供注册中心的推送日志么? 集群规模大概是多少?

Lvnszn avatar Nov 04 '22 14:11 Lvnszn

目前怀疑跟多 zk 有关,这边用户把注册中心切换成 nacos 之后看着正常。 有类似问题的可以先切换试试。 root cause 我在跟一下

Lvnszn avatar Nov 10 '22 12:11 Lvnszn

我们目前也遇到了同样的问题。

image

环境: dubbo-go: v3.0.1 ZooKeeper: v3.4.8

shenchao861129 avatar Nov 17 '22 11:11 shenchao861129

有一个用户使用了 zk v3.4.10,也遇到了这个问题。

AlexStocks avatar Nov 17 '22 12:11 AlexStocks

这个问题还没有修复吗??调用链,config.Load->refConfig.Refer->common.MergeURL,没有调用很多次,咋来的内存溢出

mengccmumu avatar Dec 03 '22 19:12 mengccmumu

这个问题还没有修复吗??调用链,config.Load->refConfig.Refer->common.MergeURL,没有调用很多次,咋来的内存溢出

平常状态下比较难复现,你也是 go 调用 java 么?

Lvnszn avatar Dec 04 '22 00:12 Lvnszn

go调java,我这边是可以复现的,直接用jmeter压测,内存很快就涨上来;

mengccmumu avatar Dec 04 '22 02:12 mengccmumu

这是我的配置文件

dubbo:
  registries:
    demoZK: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2181
    demoZK2: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2182
    demoZK3: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2183
  consumer:
    references:
      AbcService: # 存根类名
        registry: demoZK,demoZK2,demoZK3
        protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
        interface: com.xx.xx.xx.AbcService # 接口需要与 go/java 客户端对应

mengccmumu avatar Dec 04 '22 02:12 mengccmumu

这是我的配置文件

dubbo:
  registries:
    demoZK: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2181
    demoZK2: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2182
    demoZK3: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2183
  consumer:
    references:
      AbcService: # 存根类名
        registry: demoZK,demoZK2,demoZK3
        protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
        interface: com.xx.xx.xx.AbcService # 接口需要与 go/java 客户端对应

行,我今天测一下

Lvnszn avatar Dec 04 '22 03:12 Lvnszn

go调java,我这边是可以复现的,直接用jmeter压测,内存很快就涨上来;

能否在钉钉群 23331795 一块聊下?

AlexStocks avatar Dec 04 '22 03:12 AlexStocks

这是我的配置文件

dubbo:
  registries:
    demoZK: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2181
    demoZK2: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2182
    demoZK3: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2183
  consumer:
    references:
      AbcService: # 存根类名
        registry: demoZK,demoZK2,demoZK3
        protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
        interface: com.xx.xx.xx.AbcService # 接口需要与 go/java 客户端对应

行,我今天测一下

有没有结果

mengccmumu avatar Dec 04 '22 07:12 mengccmumu

这是我的配置文件

dubbo:
  registries:
    demoZK: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2181
    demoZK2: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2182
    demoZK3: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2183
  consumer:
    references:
      AbcService: # 存根类名
        registry: demoZK,demoZK2,demoZK3
        protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
        interface: com.xx.xx.xx.AbcService # 接口需要与 go/java 客户端对应

行,我今天测一下

有没有结果 我这启动了一个 java 的 provider, 3 个 zk 做注册中心, go client 用 100w 次 loop 请求,内存变化不是很大。你这边有最小复现流程么?

Lvnszn avatar Dec 04 '22 07:12 Lvnszn

go.mod

	dubbo.apache.org/dubbo-go/v3 v3.0.2
	github.com/apache/dubbo-go-hessian2 v1.11.1 // indirect


mengccmumu avatar Dec 04 '22 09:12 mengccmumu

这是我的配置文件

dubbo:
  registries:
    demoZK: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2181
    demoZK2: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2182
    demoZK3: # 定义服务注册发现中心
      protocol: zookeeper
      address: x.x.x.x:2183
  consumer:
    references:
      AbcService: # 存根类名
        registry: demoZK,demoZK2,demoZK3
        protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
        interface: com.xx.xx.xx.AbcService # 接口需要与 go/java 客户端对应

行,我今天测一下

有没有结果 我这启动了一个 java 的 provider, 3 个 zk 做注册中心, go client 用 100w 次 loop 请求,内存变化不是很大。你这边有最小复现流程么?

j_test

mengccmumu avatar Dec 04 '22 09:12 mengccmumu

Hello,你那边复现出来了吗?

mengccmumu avatar Dec 04 '22 13:12 mengccmumu

go 1.16, web gin, dubbo-go v3,zk 3.4.8 逻辑:gin api路由直接转dubbo-go client 调用java dubbo 压测:请求gin api,qps=500+,8个小时,内存涨了120MB

mengccmumu avatar Dec 05 '22 02:12 mengccmumu

嗯嗯,你这边方便帮忙看看 zk 里面 image 这种日志多么

Lvnszn avatar Dec 05 '22 03:12 Lvnszn

嗯嗯,你这边方便帮忙看看 zk 里面 image 这种日志多么

这个日志是dubbo-go zk打印的吗?

mengccmumu avatar Dec 05 '22 05:12 mengccmumu

嗯嗯,你这边方便帮忙看看 zk 里面 image 这种日志多么

这个日志是dubbo-go zk打印的吗?

嗯,zk 里面打印的。

Lvnszn avatar Dec 05 '22 06:12 Lvnszn

很多Close zk

mengccmumu avatar Dec 05 '22 06:12 mengccmumu

嗯嗯,你这边方便帮忙看看 zk 里面 image 这种日志多么

这个日志是dubbo-go zk打印的吗?

嗯,zk 里面打印的。

抽空给看下

mengccmumu avatar Dec 05 '22 12:12 mengccmumu

嗯嗯,你这边方便帮忙看看 zk 里面 image 这种日志多么

这个日志是dubbo-go zk打印的吗?

嗯,zk 里面打印的。

抽空给看下

嗯嗯,我这边大概知道了,这两天会提个 PR 在测一下

Lvnszn avatar Dec 05 '22 12:12 Lvnszn