范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

高并发服务优化篇从RPC预热转发看服务端性能调优

  本篇带大家来看下RPC的一些高级特性和其背后的原因。(还是以开源的dubbo和sofa为例来说明)。  Part1RPC为了性能做了哪些努力1.1Provider分组和直连
  路由寻址,负载均衡是很好,可以保证流量均匀从而保护服务节点稳定。
  但是,我们有的时候其实不希望我们的请求乱跑,最好能打到指定的机器上。比如联调和测试的时候,直连功能就显得很重要了。
  只有经历过多方合作联调时请求到处乱跑的痛,才知道分组和直连的功能对开发是多么的友好。  //以sofa为例 @Extension(value = "directUrl", order = -20000) @AutoActive(consumerSide = true) public class DirectUrlRouter extends Router {   //... }
  我们可以看到直连路由策略的order属性,被赋予了一个极小的值,变成了优先级最高的路由策略,所以只要配置的直连列表,则会优先走配置中的列表地址。
  摘自:www.sofastack.tech  1.2异步调用
  Future异步调用
  异步调用对服务性能和并发的支持起到很大的作用。
  一般异步调用有Futurn和callback等方式,这里我们说下Future的原理:
  调用下游之后,先返回一个Future,上游通过Future.get()方法对结果进行获取,如果结果未返回则会让出CPU资源进入等待,直到结果到达或超时后触发回调方法才被唤醒。由于篇幅问题,Future的核心逻辑的相关注释就不放了,之前的消息消费顺序保障的文章中也有叙述,有兴趣的同学可以看下~  1.3本地优先、远程优先
  很多时候,我们会遇到消费端和服务端可能都是自己的情况。这个时候,在常规的路由寻址之外,又提供给我们一种调用的可能性,就是直接调用当前服务器上的程序,这样做的好处比较明显,省去了网络传输等时间损耗,效率更高。  List localProviderInfo = new ArrayList(); // 解析IP,看是否和本地一致 for (ProviderInfo providerInfo : providerInfos) {      if (localhost.equals(providerInfo.getHost())) {         localProviderInfo.add(providerInfo);     } } // 命中本机的服务端 if (CommonUtils.isNotEmpty(localProviderInfo)) {      return super.doSelect(invocation, localProviderInfo); } else {    // 没有命中本机上的服务端    return super.doSelect(invocation, providerInfos); }
  当然,也需要看业务和内部服务路由的实际情况,比如在阿里的单元化部署下,需要根据用户ID路由到对应的zone进行处理,如果还是优先本机,那就可能在操作数据库的时候涉及到跨zone调用,比走远程rpc更加耗时。因此这种情况下就需要禁用本机优先策略。  1.4延迟暴露
  很多时候,我们的服务需要依赖一些其他内容才可以正常提供服务,比如缓存预热、线程池预热等等,所以,在服务真正就绪之后再注册到配置中心是很有必要的。  //服务注册之前,先延迟 public void export() {     // 根据配置延迟加载     if (providerConfig.getDelay() > 0) {          Thread thread = factory.newThread(new Runnable() {          @Override          public void run() {              try {                   Thread.sleep(providerConfig.getDelay());              } catch (Throwable ignore) {               }               //真正的服务注册逻辑               doExport();          }       });       thread.start();    } else {        doExport();    } } 1.5粘滞连接
  问:   我们需要每次都进行路由寻址和负载均衡来确定服务地址么?
  答:   大部分情况是有利的,不过有些特殊的场景,更希望多次请求连接到同一台服务器。
  比如,有状态的服务(很多带数据功能的服务都是有状态的,比如很久之前的带登陆session的Tomcat服务、存储集群服务等),其实希望每次请求都连接到相同的服务器。
  这就用到了粘滞连接功能。  protected ProviderInfo select(...)throws SofaRpcException {     // 判断isSticky 粘滞连接配置     if (consumerConfig.isSticky()) {         //如果最后一次使用的provider不为空,则使用         if (lastProviderInfo != null) {             ProviderInfo providerInfo = lastProviderInfo;                     //获取对应连接             ClientTransport lastTransport = connectionHolder.getAvailableClientTransport(providerInfo);             if (lastTransport != null && lastTransport.isAvailable()) {                checkAlias(providerInfo, message);                return providerInfo;             }         }     }     ... } 1.6预热转发
  前面扯了那么多,其实,这个才是我们今天想说的重点。
  预热转发是针对服务节点的负载均衡来说的。因为在服务刚启动的时候,如果请求过多可能会影响机器性能和正常业务,如果将处于预热期的机器的请求转发到集群内其它机器,过了预热期之后再恢复正常,则可以保证服务节点的性能和服务整体的可用性。
  那么这个功能是怎么实现的呢?--带权重的随机负载均衡。
  摘自sofastack:权重随机的原理   //累加总权重totalWeight,代码忽略…    //在总权重内随机得到一个值  int offset = random.nextInt(totalWeight);    //确定随机值落在哪个片断上  for (int i = 0; i < size; i++) {      offset -= getWeight(providerInfos.get(i));      if (offset < 0) {         providerInfo = providerInfos.get(i);         break;      } }
  配置示例:  core_proxy_url=weightStarting:0.2,during:60,weightStarted:0.2,address:x.x.x.x,uniqueId:core_unique
  如上,预热权重20%,预热持续时长60s。这样,按照上述计算方式,权重小的服务节点被选到的几率就相对小,以此达到权重随机的效果。
  那么,为什么刚发布的服务需要预热呢?预热可以起到什么作用呢?  Part2什么是JIT优化
  都说C++快,Java慢,都是高级语言,是什么导致了运行速度的差别呢?
  这个涉及到了两种执行方式:  解释执行   和  编译执行  。
  相对于C++直接将代码编译成机器码运行的方式,Java为了实现跨平台、高度抽象等特性,增加了虚拟机层来实现Java代码到机器码的转换,Java程序先是被编译成符合虚拟机规范的.class字节码逐条将字节码翻译成机器码然后执行,所以,速度上就慢一些。
  虽然,JVM的加入,给Java的运行速度增加了不少损耗,但是好处也很多,除了跨平台,还为我们实现了诸如内存管理、垃圾回收等容器级通用功能,让研发人员可以更加聚焦业务。
  不过,Java也是要面子的,我允许自己慢,但我不允许自己慢那么多!
  怎么办呢?遵循二八原则,是不是可以找寻程序当中的贡献了大部分调用量的核心代码,把这部分编译成机器码,提升其速度,不就把整体的速度提上去了么,JVM也是这么做的~
  所以,JVM兼容了解释执行和编译执行两种方式,也就是我们常说的  即时编译  。
  前面的问题到这里其实就可以回答了。为什么需要预热转发呢?是为了用小流量对程序进行预热,目的是为了让核心代码进行及时编译,提高峰值运行速率,提升服务响应~
  下面让我们详细看下JIT。  2.1即时编译器
  为了权衡编译时间和执行效率,JVM设置了多种即时编译器:  C1(Client 编译器):基于字节码完成部分优化,如方法内联、常量传递,相对于C2,速度快,但性能稍差。  C2(Server 编译器):耗时较长的全局优化,如无用代码消除、重排序、循环展开、公共子表达式替代、常量传播等等。  Graal(新的JIT编译器):侧重于性能和语言操作性。在一些负载上提供比传统编译器更好的峰值性能;用 Graal 执行的语言可以互相调用,可以使用来自其他语言的库。  2.2JIT优化触发条件
  前面我们说过,JVM其实是希望找到承担更多调用请求的代码块进行优化,那,怎么来确认哪些代码是优化目标呢?--  热点探测
  基于采样的热点探测 :
  周期采样,检测各线程栈顶方法,经常出现的方法即为热点方法。好处是简单高效,缺点是不精确,容易受线程运行状态的影响。
  基于计数的热点探测 :
  (包括方法调用计数器和回边计数器)每个方法建立计数器,用来统计调用次数。如果该方法执行次数超过阈值,则该方法被认定为热点方法。好处是足够精确。缺点是空间损耗大,且实现较难。
  另外,可以通过如XX:CompileThreshold等参数来修改阈值,不过,没有绝对把握,还是不要动为好。  Part3JIT指导代码优化3.1方法内联
  为什么我们在刚写代码的时候,总是被建议不要写很大的方法体?方法内联的JIT优化策略就是其中一个重要的原因。(还有GC友好等原因)
  JVM内的每一次方法调用,都是栈帧在内存中出栈入栈的过程,方法多了性能损耗自然大,所以要进行方法内联,即把方法执行逻辑直接复制到调用方内部,避免方法调用。
  但是,方法内联是有方法大小限制的,超过了一定大小的方法,没法做内联优化。所以,平常应该注意,尽量避免写很大很冗长的方法。
  让我们来举个栗子实际感受一下~
  两种书写风格的大数相加
  如上图所示,两个字符串型整数相加,都能实现功能,前一种写法,把中间过程全都拆开,罗列在的方法内,整个方法虽然理解起来稍微方便些,但整体显得冗长;第二种方法,把各个条件都囊括在了for循环条件内,三行代码完成整体操作。
  如果要去评价,我觉得大部分人都会说第二种写的好,但是,第二种的好难道真的局限于优雅么?  //添加JVM启动参数,用于打印代码执行过程中的编译详情 //-XX:+PrintCompilation String num1 = "12345"; String num2 = "23456"; //循环15000次,因为1.8分层编译下,各层阈值不一样,我们取最大阈值 for (int i=0;i<15001;i++) {     rejectionLB1.stringAdd(num1, num2);     //rejectionLB1.stringAdd2(num1, num2);  }
  执行15000次写法1
  (图中编译层次这一列中,3代表C1编译,4代表C2编译)
  我们看到,随着代码的执行次数的增加,一些方法,进行了C1编译,如我们的主方法  stringAdd  ,而少数方法,从C1编译提升到了C2编译,如AbstractStringBuilder::append方法。
  执行15000次写法2
  我们看到了什么,  stringAdd2   居然在进行到运行后期执行了C2编译,而且很明显,方法二的C2编译的方法,比方法一要多不少。所以,平常写代码该注意些什么,是不是显而易见了… 3.2其他优化
  方法内联虽然只是一种简单优化,但是,是后续其他优化的基石。
  而JVM的分层优化涉及的点非常多 [1] :
  局部优化 :关注局部数据流分析,数组越界检查消除;寄存器优化,优化跳转、循环、异常处理等;代码简化,如公共表达式提取等等等。
  控制流优化 :专注于代码重排序、循环缩减、循环展开、异常定位优化等等等。
  全局优化 :主要关注冗余消除,如方法调用、锁;逃逸分析;GC和内存分配优化等等等。 Part4总结
  本篇从RPC的预热转发功能,引出了其背后的理论依据--JIT优化。阐述了JIT的基本概念,并用一个实例说明了代码编写风格对JIT优化的实际影响。
  JIT相关的优化实现起来非常难,不过其原理和作用对我们普通研发也不是特别难理解,学习JIT优化的目的,在于了解JVM底层的运行逻辑和实现,让我们可以更加信任托管,聚焦业务逻辑,同时在编写代码时,尽量用JVM友好的方式进行,从而达到更好看、更高效的目的。
  来源:https://mp.weixin.qq.com/s/pktzfRuXc3PEb172zw4qNQ

一款腾讯的游戏都没有?盘点最良心的网游,零氪玩家可以吊打土豪大家好,这里是正惊游戏,我是正惊小弟。在国内网游的大环境越来越倾向于骗氪的当下,那些年被玩家们口口相传的良心网游已经越来越少了,取而代之的,则是各种抄袭加上充充充送送送活动相结合的游戏光明大陆2年更新18个职业,这次又一口气再出3个新职业,你怎么看?所以,如果多职业可以代替游戏性的话。我建议任天堂多出几个林克孪生兄弟,R星赶紧给大表哥2出个复制人系统。光明大陆大概是网易最可惜的游戏我首次接触光明大陆时,这游戏还处在研发阶段。曾大概这就是我的世界最顶级画质!GTA5根本比不上?游戏现在已经进入了画质时代,越来越多的大作画质极其精致与细腻,可是有一些玩家并不满足于此,开始寻找各种各样的高清材质包,让自己的游戏更加的高清接近于真实,在现在的硬件水平条件下,出刺激战场楼梯底下有一个密室?当初没发现,进去后视野还不错!大家好,我是南美小猴子!在刺激战场里每隔一段时间就会有玩家新发现一个游戏里的小秘密,比如说哪个地方又出了一个新bug,哪个地方又来了一个小技巧。每张地图中都有数十种建筑,每种建筑都抖音红人明面表示,LOL抄袭王者荣耀,是全LOL玩家的爸爸,如何看待此事?不请自来,我是英雄联盟OG,专注于游戏领域问答,关注我一起探讨游戏乐趣。作为一名英雄联盟的老玩家,看到这个问题忍不住就点了进来,说实话不知道这个抖音红人哪里来的自信,也完全不懂他的荣耀战令60级奖励永久皮肤曝光,免费6选1,挑这三款才最值王者荣耀在11号就要上线s15赛季了,s15赛季中荣耀战令也会进行更新,新的战令奖励还是很不错的,60级的时候会奖励一个永久皮肤宝箱,玩家可以6选1获得一款永久皮肤,这次永久皮肤也斗罗大陆最强8块魂骨被唐三独占,泰坦巨猿倒数,第一进化多次斗罗大陆中除了魂环和武魂之外,最珍贵的东西非魂骨莫属了。魂骨是一种非常特殊的存在,一般魂兽里出现魂骨的概率不到千分之一,十万年以上的魂兽必出魂骨,所以魂骨是所有魂师梦寐以求的宝物,玩刺激战场时怎么训练三指呢?怎样玩好这款游戏?三指操作怎么训练呢?嗯,这个问题,算是问对人了,作为一个从两指成功过度三指的玩家,还是有点小心得的,不急,且听我慢慢道来一工欲善其事必先利其器,先把键位调整好。至于键位怎么调,关键第一次参加炉边聚会,这排面谁顶得住啊?之前在国外举行的炉边聚会活动,受到了无数玩家们的称赞而国内玩家也是各种嚎叫,也表示非常期待,可以说炉边聚会对我们来说意义重大这一次国内炉石玩家等来国内举行的炉边聚会,只能眼巴巴看着吃鸡中为什么有那么多人喜欢用M416?很厉害吗?并不是这个枪很厉害,而是满配的m416稳定性好,压枪比较容易。那么我们来看看这把枪需要哪些配件?1枪头又分为从补偿器(降低枪口抖动)消焰器(消除枪口火焰,并轻微降低枪口抖动)消音器kpl目前五个位置,各个位置的第一怎么排?上路不死战神六点六中路八朝元老猫神Cat打野天花板级别的镜暖阳射手号称联盟最强射手一诺辅助刘禅是他的本命英雄阿豆这一套阵容谁能对抗?不服你能随便写阵容对位一下?可以说是联盟最强了。
遮天斩诸神魔塔玩法介绍传奇复古三职业手游遮天斩诸神魔塔怎么打大家好,我是小可乐,今天小可乐为大家分享的是传奇复古三职业手游遮天斩诸神魔塔怎么打,我们一起来看看吧!诸天魔塔会在相对等级后,才会开放这个副本。诸天魔塔是个全天候开放的单人副本,这怒火一刀打金攻略一小资打金1每天开区第一时间进区,直接3050100充值直接领钻石会员(秒升到四转)灵符直接买幻武。区内如果大佬比较多推荐直接起星耀(钻石之后3W灵符直接送六转)2上面搞完了先去把闪烁之光冬日庆典来袭,星之塔玩法限时回归一年一度的冬日庆典,冒险大陆的人们除了筹备庆典活动之外,还将星之塔玩法重新搬到庆典之中,让冒险者们能够体现公平竞技的乐趣。接下来,就让闪妹带大家一起看看本周与游戏玩法相关的更新内容传世手游传世群英版进阶攻略鬼器装备篇大家好,之前一直给大家介绍传世群英版这款游戏,也跟大家讲了一些基础的玩法,这款游戏是三职业微变带元神的版本,基础的玩法都是相对比较简单的,基本上跟着任务走就可以了。升级方面不多讲了征途年终决战全新地图九天星宫剧情揭密征途2021年终决战新版本12月24日上线,将为大家带来全新的270新世界。新世界中较为重磅的一环是全新地图九天星宫,参考二十八星宿的传说故事,为大家打造跌宕起伏的精彩剧情任务,以作为王者为数不多能传送的英雄之一今天给大家介绍一下坦克类中刘邦这个英雄!刘邦这个英雄的我还是玩过几次的,它的缺点是可能就只有一个一技能可以近身,准确来说就是手比较短!容易被放风筝因为他本身就是定位是坦克和辅助!但二次元捏脸开始火起来了?这款游戏的捏脸系统太顶了一说起捏脸,相信大家第一时间想到的就是玩家晒出的各种明星脸刘亦菲王俊凯甚至周杰伦等等,不得不说,这届玩家真的非常有才,不过小编不能李姐,捏光头强的朋友你是认真的吗?在好玩的同时也不海贼王链游OnePiece怎么注册加入?海贼王区块链游戏元宇宙下载NFTOnePiece是一款基于Solidity语言的链上元宇宙游戏。它是由一个资深的日本游戏团队开发的。这是一款NFT纸牌游戏,源于文化IP的一部分。游戏以大海盗时代的故事为背景凡人在游戏中也能创造奇迹守望先锋最不可思议操作瞬间守望先锋已经诞生有五年之久,作为4年的资深老玩家,少说也经历过万场对战。虽然没有职业选手那样无敌的对战表现和操作意识,但是四年里自己有过的光辉时刻和亮眼表现,让我一度怀疑自己也可以你的直播间枯燥留不住观众?来试试这些小游戏很多新人主播在直播的时候,很容易找不到话题来活跃直播间,常常播着播着就不知道干嘛了。而直播间又非常忌讳冷场,这会让观众急速地流失,所以本文就来好好说说你的直播间枯燥留不住观众?来试暗黑破坏神迪卡凯恩才是幕后黑手,一手促成三代迪亚波罗复活暗黑破坏神系列活得最久的NPC是谁呢?应该就是赫拉迪姆的后裔迪卡凯恩吧!在暗黑破坏神的世界观中,赫拉迪姆成员已经被杀绝了,只剩下他一人。是唯一一个知道永恒之战烈焰地狱高阶天堂,以及