一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

網(wǎng)絡(luò)隔離Raft是怎么解決CPU飆高問題的呢?

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-02-06 14:05 ? 次閱讀

今天下午突然 出現(xiàn) 測試環(huán)境 cpu飆高,干到了 60%,其他項目 響應(yīng)時間明顯變長。。。有點嚇人,不想背鍋

項目背景

出問題的項目是 需要連接各個不同nacos 和不同的 namespace 進行對應(yīng)操作的 一個項目,對nacos的操作都是httpClient 調(diào)用的api接口,「httpClient方法 沒有問題,不用質(zhì)疑這個」

定位問題

首先 這 cpu高了,直接top -Hp 看看

定位到 進程id,然后 執(zhí)行 jstack 進程id -> 1.txt

看到堆棧信息 ,下面提示信息有很多

"com.alibaba.nacos.client.config.security.updater"#2269daemonprio=5os_prio=0tid=0x00007fa3ec401800nid=0x8d85waitingoncondition[0x00007fa314396000]
java.lang.Thread.State:TIMED_WAITING(parking)
atsun.misc.Unsafe.park(NativeMethod)
-parkingtowaitfor<0x00000000f7f3eae0>(ajava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
atjava.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
atjava.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
atjava.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
atjava.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
atjava.lang.Thread.run(Thread.java:748)

但是上面這個提示信息 顯示 是 線程內(nèi)部的,而且是nacos client 內(nèi)部的

你這么搞,讓我很難受啊,我都是http 調(diào)用的,當時就是為了 防止開啟無用的線程,這。。。。。「怎么」

那我去 根據(jù)你的關(guān)鍵字找找 是哪里打印的,「關(guān)鍵字 com.alibaba.nacos.client.config.security.updater」

ServerHttpAgent 類的方法

//initexecutorService
this.executorService=newScheduledThreadPoolExecutor(1,newThreadFactory(){
@Override
publicThreadnewThread(Runnabler){
Threadt=newThread(r);
t.setName("com.alibaba.nacos.client.config.security.updater");
t.setDaemon(true);
returnt;
}
});

這是構(gòu)造方法啊,應(yīng)該只初始化一次的啊,往上debug,我靠,NacosConfigService 類中調(diào)用了,「debug 看什么時候調(diào)用了 不就行了嘛」

項目初始化的時候 調(diào)用了一次,業(yè)務(wù)系統(tǒng)依賴nacos嘛,ok 可以理解

再就是漫長的等待,30s后 發(fā)現(xiàn)又是一次調(diào)用,我去,怎么可能。。。

往回debug,代碼如下

scheduler.schedule("定時校對灰度nacos配置",()->loadGrayConfig(grayFileName),
1800,1800,TimeUnit.SECONDS);
/**
*灰度配置更新解決網(wǎng)絡(luò)隔離的問題
*
*@paramgrayFileName灰度文件的名稱
*/
privatevoidloadGrayConfig(StringgrayFileName){
synchronized(this){
System.err.println("loadGrayConfigdatetime:"+DateUtils.formatDate(newDate()));
//刷一次緩存重新獲取nacos內(nèi)容賦值
grayConfigManager.loadNoCache(grayFileName);
}
}
74649f22-a3be-11ed-bfe3-dac502259ad0.png

等會,難道 小丑是我。。。。

這當時是為了灰度功能,定時數(shù)據(jù)校驗用的 用了一個線程池,當時以為用了線程池 妥妥的。。。還特意調(diào)用的 Nocache 方法,讓他創(chuàng)建新的nacos Config對象,做數(shù)據(jù)校對

「但是每調(diào)用一次 NacosFactory.createConfigService(properties) ,nacos config 構(gòu)造器就會開一個線程,就導(dǎo)致了這個問題」

這里可能你要問了 你說 為了防止網(wǎng)絡(luò)隔離 才加的這個調(diào)度任務(wù),什么是網(wǎng)絡(luò)隔離啊?

7494062c-a3be-11ed-bfe3-dac502259ad0.jpg

我剛開始聽說這個概念是 當時學(xué)習(xí) Raft

假設(shè)一個Raft集群擁有三個節(jié)點,其中節(jié)點3的「網(wǎng)絡(luò)被隔離」 ,那么按照「BasicRaft」 的實現(xiàn),集群會有以下動作:

節(jié)點3由于網(wǎng)絡(luò)被隔離,收不到來自Leader的Heartbeat和AppendEntries,所以節(jié)點3會進入選舉過程,當然選舉過程也是收不到投票的,所以節(jié)點3會反復(fù)超時選舉;節(jié)點3的Term就會一直增大

節(jié)點1與節(jié)點2會正常工作,并停留在當時的Term

網(wǎng)絡(luò)恢復(fù)之后,Leader給節(jié)點3發(fā)送RPC的時候,節(jié)點3會拒絕這些RPC理由是發(fā)送方任期太小。

Leader收到節(jié)點3發(fā)送的拒絕后,會增大自己的Term,然后變成Follower。

隨后,集群開始新的選舉,大概率原本的Leader會成為新一輪的Leader。

那么網(wǎng)絡(luò)隔離 Raft是怎么解決的呢?

多輪投票的安全問題是棘手的,必須避免同一高度不同輪數(shù)分別提交兩個不同區(qū)塊的情形。在Tendermint中,這個問題可以通過鎖機制(locking mechanism)得到解決。

鎖定規(guī)則:「預(yù)投票鎖(Prevote-the-Lock)」

驗證者只能「預(yù)投票(pre-vote)」 他們被鎖定的區(qū)塊。這樣就阻止驗證者在上一輪中預(yù)提交(pre-commit)一個區(qū)塊,之后又預(yù)投票了下一輪的另一個區(qū)塊。

· 波爾卡解鎖(Unlock-on-Polka ):驗證者只有在看到更高一輪(相對于其當前被鎖定區(qū)塊的輪數(shù))的波爾卡之后才能釋放該鎖。這樣就允許驗證者解鎖,如果他們預(yù)提交了某個區(qū)塊,但是這個區(qū)塊網(wǎng)絡(luò)的剩余節(jié)點不想提交,這樣就保護了整個網(wǎng)絡(luò)的運轉(zhuǎn),并且這樣做并沒有損害網(wǎng)絡(luò)安全性。

「解決方案是把term替換成(term, nodeid),并且按照字典序比較大小(a > b === a.term > b.term || a.term == b.term && a.nodeid > b. node_id). 這是paxos里的做法, 保證不會出現(xiàn)raft里的沖突.」

原理是, raft對voting的階段有2個值來描述: term和當前投了哪個node_id, 即[term, nodeid], 由于raft不允許一個term vote2個不同的不同的node, 也就是說, vote_req.term > local.term && vote_req.nodeid == local.nodeid 才會grant這個vote請求.

把term替換成(term,nodeid)后, vote階段的大小比較變成了: vote_req.term > local.term || vote_req.term == local.term && vote_req.nodeid >= local.nodeid, 條件邊寬松了. 同一個term內(nèi), 較大nodeid的可以搶走較小nodeid 已經(jīng)建立的leader.

而日志中原本記錄的term也需要將其替換成(term, node_id), 因為這兩項加起來才能唯一確定一個leader. 之前raft里只需一個term就可以唯一確定一個leader.

vote中比較最大log id相應(yīng)的,從比較tuple (term, index) 改成比較tuple (term, node_id, index).

就這么點修改.

「總結(jié)下來就是 按照字典排序 和 預(yù)投票鎖 保證 當多個 term 相同的 candidate 相遇后,肯定會有一個 獲得多數(shù)派投票」

想法

我們?nèi)绻霈F(xiàn) 異常的網(wǎng)絡(luò)隔離情況再回來,可能導(dǎo)致 數(shù)據(jù)的不一致,但是上面的 解決辦法 因為 比較重,不適合我們,我們就單純 引入 「定時校對的調(diào)度任務(wù) 進行比較(和 對賬一樣)」

修復(fù)

我對nacos config 連接進行 遍歷查找 是否存活,不存活 我就shutdown,然后生成一個新的,而不是這種全部生成一邊,畢竟人家 構(gòu)造器開了線程。。。。

說回來還是因為 我當時自信了,沒往這個調(diào)用下面看,在子類中 寫的開線程 哈哈,行吧,改改 ,跑到測試環(huán)境 看看效果(CPU)

74a4b346-a3be-11ed-bfe3-dac502259ad0.png





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11013

    瀏覽量

    215295
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    11747
  • cache技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    1170

原文標題:記一次 Nacos 導(dǎo)致的 CPU 飆高問題 !

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    如何實現(xiàn)網(wǎng)絡(luò)隔離

    如何實現(xiàn)網(wǎng)絡(luò)隔離
    發(fā)表于 10-31 08:10

    什么是網(wǎng)絡(luò)隔離技術(shù)

    什么是網(wǎng)絡(luò)隔離技術(shù)網(wǎng)絡(luò)隔離,是指兩個或兩個以上的計算機或網(wǎng)絡(luò),不相連、不相通、相互斷開。不需要信息交換同的
    發(fā)表于 08-19 09:11 ?5954次閱讀

    網(wǎng)絡(luò)攝像機的CPU

    網(wǎng)絡(luò)攝像機的CPU              CPU即中央處理器
    發(fā)表于 01-07 09:59 ?2004次閱讀

    高性能CPU時鐘網(wǎng)絡(luò)設(shè)計

    討論了物理設(shè)計中時鐘網(wǎng)絡(luò)的設(shè)計技術(shù),并以現(xiàn)有的CPU時鐘網(wǎng)絡(luò)的為例,介紹了高性能CPU的時鐘網(wǎng)絡(luò)設(shè)計技術(shù)。
    發(fā)表于 12-27 15:28 ?46次下載
    高性能<b class='flag-5'>CPU</b>時鐘<b class='flag-5'>網(wǎng)絡(luò)</b>設(shè)計

    高性能CPU的時鐘網(wǎng)絡(luò)設(shè)計

    高性能CPU的時鐘網(wǎng)絡(luò)設(shè)計
    發(fā)表于 10-30 15:28 ?23次下載
    高性能<b class='flag-5'>CPU</b>的時鐘<b class='flag-5'>網(wǎng)絡(luò)</b>設(shè)計

    物理隔離與邏輯隔離網(wǎng)絡(luò)光端機和光纖收發(fā)器到底有什么區(qū)別

    物理隔離網(wǎng)絡(luò)的需求近期,電力、銀行、公安、部隊、鐵路、大型企事業(yè)單位專網(wǎng)有廣泛物理隔離的以太網(wǎng)接入需求,但究竟什么是物理隔離以太網(wǎng)?很多廠
    發(fā)表于 04-02 08:00 ?0次下載
    物理<b class='flag-5'>隔離</b>與邏輯<b class='flag-5'>隔離</b><b class='flag-5'>網(wǎng)絡(luò)</b>光端機和光纖收發(fā)器到底有什么區(qū)別

    CPU為什么不做成圓形

    當然也有長方形的版本。上表面平整光滑,下表面則有著金屬觸點或針腳。雖然我們默認CPU的形狀為矩形,但是不知道有沒有小伙伴想過CPU為什么不做成圓形?
    的頭像 發(fā)表于 11-10 17:30 ?2081次閱讀

    JVM CPU使用率問題的排查分析過程

    問題現(xiàn)象 排查過程 問題現(xiàn)象 首先,我們一起看看通過 VisualVM 監(jiān)控到的機器 CPU 使用率圖: 如上圖所示,在 下午3:45 分之前,CPU 的使用率明顯,最高
    的頭像 發(fā)表于 10-10 16:31 ?2587次閱讀

    網(wǎng)絡(luò)隔離變壓器的選型

    Hqst華強盛導(dǎo)讀:網(wǎng)絡(luò)隔離變壓器的選型需要考慮以下幾個因素: 輸入和輸出電壓:網(wǎng)絡(luò)隔離變壓器的輸入和輸出電壓應(yīng)與應(yīng)用場景的要求相匹配。 額定電流:
    發(fā)表于 05-04 08:41 ?1468次閱讀

    持續(xù)在榜的RAFT-Stereo,你確定不來了解嗎?

    給定一對矯正后的圖像(IL, IR),目標是估計一個視差場d,使每個IL中的像素都有水平的位移。與RAFT類似,RAFT-Stereo的方法由三個主要組件組成:特征提取器、相關(guān)金字塔和基于GRU的更新運算符,如圖1所示。更新運算符迭代地從相關(guān)金字塔中檢索特征并對視差場進行
    的頭像 發(fā)表于 05-19 09:24 ?1154次閱讀
    持續(xù)在榜的<b class='flag-5'>RAFT</b>-Stereo,你確定不來了解嗎?

    將Paxos和Raft統(tǒng)一為一個協(xié)議:Abstract-paxos

    之前寫了一篇 Paxos 的直觀解釋,用簡單的語言描述了 paxos 的工作原理,看過的朋友說是看過的最易懂的 paxos 介紹,同時也問我是否也寫一篇 raft 的。但 raft 介紹文章已經(jīng)很多很優(yōu)質(zhì)了,感覺沒什么可寫的,就一直拖著。
    的頭像 發(fā)表于 06-08 14:36 ?631次閱讀
    將Paxos和<b class='flag-5'>Raft</b>統(tǒng)一為一個協(xié)議:Abstract-paxos

    使用 RAPIDS RAFT 進行機器學(xué)習(xí)和數(shù)據(jù)分析的可重用計算模式

    使用 RAPIDS RAFT 進行機器學(xué)習(xí)和數(shù)據(jù)分析的可重用計算模式
    的頭像 發(fā)表于 07-05 16:30 ?747次閱讀
    使用 RAPIDS <b class='flag-5'>RAFT</b> 進行機器學(xué)習(xí)和數(shù)據(jù)分析的可重用計算模式

    cpu溫度太高怎么解決?cpu溫度的原因?

    cpu溫度太高怎么解決?cpu溫度的原因? CPU (中央處理器) 溫度過高可能會導(dǎo)致系統(tǒng)崩潰、性能下降甚至損壞硬件,因此是一個需要嚴肅對待的問題。在本文中,我們將探討
    的頭像 發(fā)表于 12-09 16:15 ?5140次閱讀

    請問一下docker是怎么實現(xiàn)cpu隔離的?

    Docker 使用 cgroups(控制組)來實現(xiàn) CPU 隔離
    的頭像 發(fā)表于 01-15 10:06 ?667次閱讀