首页 > 其他分享 >性能分析之dubbo性能参数导致单cpu高

性能分析之dubbo性能参数导致单cpu高

时间:2023-04-03 14:33:30浏览次数:32  
标签:dubbo java netty jboss org 性能参数 com cpu

今天记录一个小问题。

问题不大,也没什么分析的逻辑可以讲的。但是想着比较典型,所以就写一写。

某年某月的某一天,就像一张破碎的脸 ...... 不对,串台了。

这一日,一个朋友发来个问题。

性能分析之dubbo性能参数导致单cpu高_配置参数

听起来是个问题。一个线程忙,这种情况应该比较好处理吧。

再看一下CPU的状态是什么样, 记住这一步是看进程中的线程。这种操作我想看过7DGroup公众号上文章的人都已经会了。

性能分析之dubbo性能参数导致单cpu高_java_02

然后印下dump信息。printf转换下pid到十六进制,查到如下进程:

"New I/O worker #8" #124 daemon prio=5 os_prio=0 tid=0x00007f4c100a2800 nid=0xd232 runnable [0x00007f4ba45c7000]
   java.lang.Thread.State: RUNNABLE
        at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2449)
        at com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectInput.readObject(Hessian2ObjectInput.java:76)
        at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:83)
        at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:109)
        at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:90)
        at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:118)
        at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:79)
        at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:46)
        at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:134)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
        at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
        at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
        at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
   Locked ownable synchronizers:
        - <0x00000007500fccf0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

这其实是一个挺明确的问题,如果理解了dubbo的话。

不止是dubbo,对其他的应用也是同样的判断逻辑。如果只有一个CPU使用率高。那就三个方向:1. 单线程;2.锁或等待;3.等待。

可是现在是什么年代了?还能有单线程的问题吗?嗯,确实是有的,不管年代。

对于dubbo这种配置参数如此之繁杂的玩意来说,配置更需要麻烦。之前我整理过dubbo和性能相关的参数,有比较直接的关联关系的大概就有四十几个(包括消耗者和生产者)。

在我们的性能分析中,其实有一个环节,至今我看到仍然做的非常差的,就是事先把性能配置参数给梳理一遍。有些问题在梳理的时候就可以看出来了,所以我在工作的时候,在做性能分析之前,都会先干一遍这样的事情。

比如说linux的参数(下图中红色为性能参数,做了标识):

性能分析之dubbo性能参数导致单cpu高_.net_03

上图只是展示了一部分,全部参数是什么样的呢?

性能分析之dubbo性能参数导致单cpu高_.net_04

这样算一屏的话,大概有三屏的参数。

可以想像,配置那么多,在出现性能问题时怎么分辨?

并且一个参数问题,导致的问题表象都会让你觉得非常不理解。

有时候我们费了几天的劲分析了一个问题,最后发现是一个参数导致的,改一下就性能大涨,会觉得特别不值得,想骂人的感觉有没有?

有的人看着写文章中一个性能问题,觉得到最后改一个IP、改一个参数、改一行代码、改一个SQL,就会觉得性能问题无非就是这样嘛。

但是你想过没有,这个过程中要分析多少数据?做多少实验?要多有耐心?要多需要功底?

感慨的差不多了,说一下上面的问题是什么原因吧,要不然,看官们该想扔手机了!


上面的问题是什么呢就是一个connections配置。这个朋友是把connections放到代码里的,写成了这样。

referenceConfig.setConnections(1);

因为限制了连接为1,并且在压测的这个环境中,一个consumer一个provider。这样一来,就完全限制住了吞吐量。

其实是实际的生产dubbo环境中,并不完全是这样。当consumer和provider多的时候,CPU也可以用得起来。但是在这个特定的环境中,就完全被限制了。怎么办呢?这时候,就简单了对不对。

referenceConfig.setConnections(10);

这样就可以用起来了。


因为这个问题比较简单,记录下来,就是为了告诉玩性能的人们,你要关心性能配置参数。

应该说,什么都得关心,缺少一个环节,就是知识的盲区。

标签:dubbo,java,netty,jboss,org,性能参数,com,cpu
From: https://blog.51cto.com/u_15181572/6166351

相关文章

  • 2023 - Dubbo 谷歌编程之夏报名启动了!
    作者:Dubbo社区我们很高兴地宣布ApacheDubbo已正式参与到GSoC2023(2023谷歌编程夏令营)中,当前贡献者报名阶段也已经正式启动,如果您对Dubbo、对GSoC、对开源感兴趣,欢迎报名参与。今年的活动同时对在校大学生、社会员工开放。也就是说,只要是对开源和编码感兴趣的开发者就可以......
  • 如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?
    作者:华钟明本文我们将介绍ApacheDubbo灵活的多协议设计原则,基于这一设计,在Dubbo框架底层可灵活的选用HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2等任一RPC通信协议,同时享用统一的API与对等的服务治理能力。同时,我们还介绍了Dubbo的单端口多协议能力,也就是......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态的限......
  • 5 分钟读懂开源服务框架 Dubbo 及其最新规划
    Dubbo简介一句话定义ApacheDubbo是一款微服务开发框架,它帮助解决微服务开发中的通信问题,同时为构建企业级微服务的提供服务治理能力,Dubbo不绑定编程语言,我们的目标是为所有主流语言提供对等的微服务开发体验。基本架构Dubbo从架构图上分为数据面和控制面。在数据面,使用Dubbo......
  • 5 分钟读懂开源服务框架 Dubbo 及其最新规划
    Dubbo简介一句话定义ApacheDubbo是一款微服务开发框架,它帮助解决微服务开发中的通信问题,同时为构建企业级微服务的提供服务治理能力,Dubbo不绑定编程语言,我们的目标是为所有主流语言提供对等的微服务开发体验。基本架构Dubbo从架构图上分为数据面和控制面。在数据面,使用......
  • 提升集群吞吐量与稳定性的秘诀: Dubbo 自适应负载均衡与限流策略实现解析
    作者:刘泉禄整体介绍本文所说的“柔性服务”主要是指consumer端的负载均衡和provider端的限流两个功能。在之前的Dubbo版本中,负载均衡部分更多的考虑的是公平性原则,即consumer端尽可能平等的从provider中作出选择,在某些情况下表现并不够理想。而限流部分只提供了静态......
  • Python 多线程死循环挂服务器时CPU占用过高问题
    我的某个程序里有这样一段代码,把程序挂在服务器爬取信息,因此用到死循环,同时又需要进行三个任务,于是使用了多线程。刚开始在死循环部分并没有加time.sleep(60),于是它一直在for循环,同时会进行.is_alive()(不确定这个消耗大不大),但总之这使得CPU占用过高。而加上sleep之后,直接就降下......
  • 《程序是怎样跑起来的》读书笔记1——对程序员来说CPU是什么
    一丶什么是程序程序是指令和数组的组合体,如:print("你好世界"),其中print是指令,你好世界是数据。CPU能直接识别和执行的只有机器语言,使用C,java这种高级语言编写的程序需要编译转换后才可以运行。二丶CPU的内部结构CPU即中央处理器,相当于计算机的大脑,内部由许多晶体管构成,负责解......
  • 一个循环采集CPU的etl日志的脚本
    一个循环采集CPU的etl日志的脚本mdD:\\tempsetTargetDriveEtl=D:\\temp@echooffSET/A"index=1"SET/A"count=10":whileif%index%leq%count%(echoThevalueofindexis%index%wmicprocesswherename="wprui.exe"......
  • Windows 环境以 CPU 运行 stable diffusion
    前言 stable-diffusion-webui要求的Python版本是3.10.6,本机还是几年前装的3.10.0,为了避免处理更多幺蛾子,直接升级到3.10.6,还好之前就是3.10,可以直接升级。还有一个好处就是不用安装conda或者miniconda,Python虚拟环境直接就是3.10.6。其实3.10其他小版本的环......