成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

rocketMQ 很慢?引出了一個(gè)未解之謎

開(kāi)發(fā) 開(kāi)發(fā)工具
前段時(shí)間發(fā)現(xiàn),在使用rockerMQ console時(shí),查詢消息的時(shí)候出現(xiàn)很慢,查詢耗時(shí)大于10秒,少則5、6秒,多則14+秒。

本文轉(zhuǎn)載自微信公眾號(hào)「 搬運(yùn)工來(lái)架構(gòu)」,轉(zhuǎn)載本文請(qǐng)聯(lián)系 搬運(yùn)工來(lái)架構(gòu)公眾號(hào)。

[[329425]]

前段時(shí)間發(fā)現(xiàn),在使用rockerMQ console時(shí),查詢消息的時(shí)候出現(xiàn)很慢,查詢耗時(shí)大于10秒,少則5、6秒,多則14+秒。

如下圖:

 

這到底是為什么?查詢消息為啥會(huì)出現(xiàn)這么大的耗時(shí)?

當(dāng)前使用的開(kāi)發(fā)環(huán)境:操作系統(tǒng)是Windows10,JDK8,rocketMQ為4.5.2。

在其它機(jī)器上則沒(méi)有此問(wèn)題,也在本機(jī)器上的虛擬機(jī)VMware上安裝的Linux部署了rocketMQ 和 console,并且驗(yàn)證是沒(méi)問(wèn)題的。

那么到底我的機(jī)器是怎么了???

由于當(dāng)前是接口的耗時(shí)問(wèn)題,我們并不知道耗時(shí)主要在哪個(gè)地方,所以使用Arthas來(lái)跟蹤下調(diào)用鏈的耗時(shí)。

使用trace命令:

trace命令

方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)。

trace 命令能主動(dòng)搜索 class-pattern/method-pattern 對(duì)應(yīng)的方法調(diào)用路徑,渲染和統(tǒng)計(jì)整個(gè)調(diào)用鏈路上的所有性能開(kāi)銷和追蹤調(diào)用鏈路。

trace org.apache.rocketmq.console.service.impl.MessageServiceImpl queryMessageByTopic

 

從當(dāng)前調(diào)用路徑得到主要耗時(shí)在于:DefaultMQPullConsumer構(gòu)造器初始化 + DefaultMQPullConsumer啟動(dòng)耗時(shí)。那么接下來(lái)我們繼續(xù)往內(nèi)部跟進(jìn)。

此時(shí)我們關(guān)注下DefaultMQPullConsumer構(gòu)造器初始化:

  1. trace org.apache.rocketmq.client.consumer.DefaultMQPullConsumer <init> 

 

從構(gòu)造器初始化入口看,耗時(shí)并不大。

那么接下來(lái)再看下DefaultMQPullConsumer的啟動(dòng)方法:

[E] 開(kāi)啟正則表達(dá)式匹配,默認(rèn)為通配符匹配

  1. trace -E  org.apache.rocketmq.client.consumer.DefaultMQPullConsumer start 

 

trace -E org.apache.rocketmq.client.consumer.DefaultMQPullConsumer |start

 

接著發(fā)現(xiàn)耗時(shí)主要是在獲取MQClientInstance實(shí)例。

  1. trace org.apache.rocketmq.client.impl.MQClientManager getAndCreateMQClientInstance  

  1. trace org.apache.rocketmq.client.ClientConfig cloneClientConfig 

 

接著看ClientConfig#cloneClientConfig方法:

  1. public ClientConfig cloneClientConfig() { 
  2.     ClientConfig cc = new ClientConfig(); 
  3.     cc.namesrvAddr = namesrvAddr; 
  4.     cc.clientIP = clientIP; 
  5.     cc.instanceName = instanceName; 
  6.     cc.clientCallbackExecutorThreads = clientCallbackExecutorThreads; 
  7.     cc.pollNameServerInterval = pollNameServerInterval; 
  8.     cc.heartbeatBrokerInterval = heartbeatBrokerInterval; 
  9.     cc.persistConsumerOffsetInterval = persistConsumerOffsetInterval; 
  10.     cc.unitMode = unitMode; 
  11.     cc.unitName = unitName; 
  12.     cc.vipChannelEnabled = vipChannelEnabled; 
  13.     cc.useTLS = useTLS; 
  14.     cc.namespace = namespace; 
  15.     cc.language = language; 
  16.     return cc; 

可以看到很多賦值操作,這些可以不關(guān)注,只要關(guān)注new ClientConfig():

  1. trace org.apache.rocketmq.client.ClientConfig <init> 

 

可以看到主要耗時(shí)在3~4秒,并且耗時(shí)主要是這個(gè)工具類方法:RemotingUtil#getLocalAddress

  1. trace org.apache.rocketmq.remoting.common.RemotingUtil getLocalAddress 

 

到現(xiàn)在,已經(jīng)跟蹤到JDK方法調(diào)用了:NetworkInterface#getNetworkInterfaces。

接著想查看JDK函數(shù)調(diào)用:

  1. trace --skipJDKMethod false java.net.NetworkInterface getNetworkInterfaces 

--skipJDKMethod skip jdk method trace, default value true.

默認(rèn)情況下,trace不會(huì)包含jdk里的函數(shù)調(diào)用,如果希望trace jdk里的函數(shù),需要顯式設(shè)置--skipJDKMethod false。

 

此時(shí)不能跟蹤,那么根據(jù)4點(diǎn)提示排查和issue:https://github.com/alibaba/arthas/issues/47

https://github.com/alibaba/arthas/issues/807

最后確定需要開(kāi)啟unsafe。

  1. options unsafe true 

 

開(kāi)啟完成。

再次執(zhí)行,即可看到j(luò)dk的調(diào)用鏈了。

 

到這里,算是把rocketMQ console查詢慢的罪魁禍?zhǔn)渍业搅耍涸讷@取本機(jī)網(wǎng)卡接口時(shí),出現(xiàn)耗時(shí)時(shí)間長(zhǎng)。這其實(shí)也算是jdk跟操作系統(tǒng)層面的意思了,與中間件rocketMQ無(wú)關(guān),一開(kāi)始我是懷疑是不是持久化存儲(chǔ)在加載時(shí)慢的可能(基本排除)。

那么為什么會(huì)調(diào)用當(dāng)前操作系統(tǒng)的網(wǎng)卡接口時(shí)會(huì)出現(xiàn)耗時(shí)嚴(yán)重呢?

此時(shí)關(guān)注到了java.net.NetworkInterface#getNetworkInterfaces

  1. public static Enumeration<NetworkInterface> getNetworkInterfaces() 
  2.     throws SocketException { 
  3.     final NetworkInterface[] netifs = getAll(); 
  4.     // specified to return null if no network interfaces 
  5.     if (netifs == null
  6.         return null
  7.     return new Enumeration<NetworkInterface>() { 
  8.         private int i = 0; 
  9.         public NetworkInterface nextElement() { 
  10.             if (netifs != null && i < netifs.length) { 
  11.                 NetworkInterface netif = netifs[i++]; 
  12.                 return netif; 
  13.             } else { 
  14.                 throw new NoSuchElementException(); 
  15.             } 
  16.         } 
  17.         public boolean hasMoreElements() { 
  18.             return (netifs != null && i < netifs.length); 
  19.         } 
  20.     }; 
  21. private native static NetworkInterface[] getAll() throws SocketException; 

可以看到j(luò)dk函數(shù)已經(jīng)調(diào)用到了native方法,也就是jdk底層的實(shí)現(xiàn)(c/c++)了,跟操作系統(tǒng)非常緊密。

接著debug進(jìn)getNetworkInterfaces方法查看到底有哪些網(wǎng)卡接口:

 

一查發(fā)現(xiàn)竟然有81個(gè)!接著查看本機(jī)的網(wǎng)絡(luò)適配器:

 

本機(jī)Windows上有Wlan、vpn、VMware等網(wǎng)絡(luò)適配器。

最后事實(shí)就是跟他們有關(guān),我把相應(yīng)的適配器禁用之后,重新調(diào)用NetworkInterface#getNetworkInterfaces,此時(shí)耗時(shí)從3+秒降到幾百毫秒。

最后,很遺憾還是沒(méi)能剖析出為什么Windows下調(diào)用網(wǎng)卡接口native方法會(huì)出現(xiàn)那么大耗時(shí)。并且肯定跟我的機(jī)器有關(guān),因?yàn)槠渌麢C(jī)器驗(yàn)證沒(méi)有問(wèn)題。

如果要剖析原因,就得需要有c/c++更加底層的功底才能搞定吧?

如果你有遇過(guò)知道怎么解決、或熟悉底層實(shí)現(xiàn)或者有更好的思路麻煩留言指導(dǎo)下。(抱拳)

總結(jié)

 

  • Windows下可能容易出現(xiàn)一些非正常問(wèn)題,竟然也能給我遇到這個(gè)^@^。幸好一般使用Windows還是比較少,除非是開(kāi)發(fā)機(jī)器較多,Linux(unix)部署rocketMQ等中間件還是很穩(wěn)的。
  • 使用Arthas trace可以跟蹤方法的調(diào)用路徑,并且追蹤每一步的耗時(shí),可以方便的排查瓶頸問(wèn)題。
  • -E參數(shù)支持正則表達(dá)式匹配;--skipJDKMethod false支持包含JDK的函數(shù)調(diào)用;跟蹤jdk函數(shù)等,如果找不到對(duì)應(yīng)類或者方法,可能需要開(kāi)啟unsafe。

 

責(zé)任編輯:武曉燕 來(lái)源: 搬運(yùn)工來(lái)架構(gòu)
相關(guān)推薦

2022-11-13 10:07:22

SpringSpringBoot

2021-09-01 08:58:15

項(xiàng)目 UTFailed

2020-06-19 15:49:52

Windows微軟關(guān)機(jī)

2019-05-13 09:45:41

生成式對(duì)抗網(wǎng)絡(luò)GANs深度學(xué)習(xí)

2025-02-11 09:17:57

2017-12-22 10:23:14

2017-06-29 14:47:57

2024-02-04 16:14:38

線程開(kāi)發(fā)

2018-02-02 15:13:42

2019-07-01 09:58:05

鴻蒙系統(tǒng)華為

2021-07-26 17:18:03

Linux進(jìn)程通信

2024-05-07 09:02:47

2022-12-20 08:32:02

2023-03-28 16:37:38

論文視頻

2010-08-06 14:05:56

WPF

2021-05-27 07:54:21

JavaStateAQS

2024-08-14 08:35:38

sql數(shù)據(jù)庫(kù)OOM 異常

2017-02-10 09:51:23

2017-06-22 09:45:58

阿里云GN5實(shí)例深度學(xué)習(xí)

2022-12-15 16:28:10

訓(xùn)練模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人免费一区二区三区视频网站 | 中文在线亚洲 | 精品无码久久久久久国产 | 日韩一级精品视频在线观看 | 在线午夜| 久久99久久 | 亚洲人成在线播放 | 二区国产| 久久久久久久综合色一本 | 国产亚洲精品久久久久久豆腐 | 黄色毛片在线播放 | 欧美日韩专区 | 日本一道本 | 久久久成人免费一区二区 | 欧美精品啪啪 | 国产1区2区3区 | 97超碰人人| 日韩欧美手机在线 | a免费在线 | 色一情一乱一伦一区二区三区 | 久久伊人精品一区二区三区 | 国产成人高清视频 | 91精品国产综合久久久久久漫画 | 日韩有码一区 | 免费看片在线播放 | 欧美精品久久久久久久久久 | 亚洲人成人一区二区在线观看 | 在线一区观看 | 日韩精品一区二区三区视频播放 | 久久国产精品精品国产色婷婷 | 久久免费精品 | 一区精品视频在线观看 | 欧美午夜视频 | 日韩视频 中文字幕 | 中文字幕国产精品 | 亚洲一区二区av | 国产精品日韩欧美一区二区三区 | 91精品国产综合久久久密闭 | 日韩电影一区 | 毛片一区二区三区 | 国产永久免费 |