Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

common.MergeURL占用内存一直上升 #2031

Open
fubug opened this issue Aug 25, 2022 · 39 comments
Open

common.MergeURL占用内存一直上升 #2031

fubug opened this issue Aug 25, 2022 · 39 comments

Comments

@fubug
Copy link

fubug commented Aug 25, 2022

pprof001 (1)
image

@zhaoyunxing92
Copy link
Contributor

@彭笳鑫

@Lvnszn
Copy link
Contributor

Lvnszn commented Sep 14, 2022

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

@baerwang
Copy link
Member

baerwang commented Oct 31, 2022

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
}

@Lvnszn
Copy link
Contributor

Lvnszn commented Nov 4, 2022

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

@georgehao
Copy link
Contributor

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

@georgehao
Copy link
Contributor

如果可以的话,发一下内存的增长的截图。如果有条件的发下 内存 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

@fubug
Copy link
Author

fubug commented Nov 4, 2022

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

@fubug
Copy link
Author

fubug commented Nov 4, 2022

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

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

@Lvnszn
Copy link
Contributor

Lvnszn commented Nov 4, 2022

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

@Lvnszn
Copy link
Contributor

Lvnszn commented Nov 10, 2022

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

@shenchao861129
Copy link
Contributor

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

image

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

@AlexStocks
Copy link
Contributor

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

@mengccmumu
Copy link

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

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 4, 2022

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

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

@mengccmumu
Copy link

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

@mengccmumu
Copy link

这是我的配置文件

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
Copy link
Contributor

Lvnszn commented Dec 4, 2022

这是我的配置文件

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 客户端对应

行,我今天测一下

@AlexStocks
Copy link
Contributor

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

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

@mengccmumu
Copy link

这是我的配置文件

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
Copy link
Contributor

Lvnszn commented Dec 4, 2022

这是我的配置文件

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 请求,内存变化不是很大。你这边有最小复现流程么?

@mengccmumu
Copy link

go.mod

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


@mengccmumu
Copy link

这是我的配置文件

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
Copy link

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

@mengccmumu
Copy link

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

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 5, 2022

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

@mengccmumu
Copy link

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

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

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 5, 2022

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

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

嗯,zk 里面打印的。

@mengccmumu
Copy link

很多Close
zk

@mengccmumu
Copy link

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

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

嗯,zk 里面打印的。

抽空给看下

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 5, 2022

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

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

嗯,zk 里面打印的。

抽空给看下

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

@mengccmumu
Copy link

感恩的心

@mengccmumu
Copy link

第一张图和第二张图对比,时间相差3-4个小时,内存涨了60MB
pprof_001 图一
pprof_002 图二

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 6, 2022

第一张图和第二张图对比,时间相差3-4个小时,内存涨了60MB pprof_001 图一 pprof_002 图二

您这边是测试的代码么?如果是的话,可以试试,在 subscribe 那边加一个return,比如 失败 2 次就 return,先不 DoSub, 看看内存情况。 可以先下一个 dubbo-go 然后 用 go mod edit 去替换掉dubbo-go。
我还在找root cause。

@mengccmumu
Copy link

directory.go 文件吗?哪一行代码?

@Lvnszn
Copy link
Contributor

Lvnszn commented Dec 6, 2022

directory.go 文件吗?哪一行代码?

image

@mengccmumu
Copy link

什么时间封版本3.0.3

@justxuewei
Copy link
Member

什么时间封版本3.0.3

Now, we are releasing v3.0.4. The patch to fix this issue might be put into v3.0.5 or others.

@mengccmumu
Copy link

have to wait so long~!,i hope it can be fixed in v 3.0.5

@chnyangzhen
Copy link

1.5.8也出现这个问题了,请问3.0解决了吗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

10 participants