精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

網絡隔離Raft是怎么解決CPU飆高問題的呢?

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

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

項目背景

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

定位問題

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

定位到 進程id,然后 執行 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)

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

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

那我去 根據你的關鍵字找找 是哪里打印的,「關鍵字 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;
}
});

這是構造方法啊,應該只初始化一次的啊,往上debug,我靠,NacosConfigService 類中調用了,「debug 看什么時候調用了 不就行了嘛」

項目初始化的時候 調用了一次,業務系統依賴nacos嘛,ok 可以理解

再就是漫長的等待,30s后 發現又是一次調用,我去,怎么可能。。。

往回debug,代碼如下

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

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

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

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

這里可能你要問了 你說 為了防止網絡隔離 才加的這個調度任務,什么是網絡隔離啊?

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

我剛開始聽說這個概念是 當時學習 Raft

假設一個Raft集群擁有三個節點,其中節點3的「網絡被隔離」 ,那么按照「BasicRaft」 的實現,集群會有以下動作:

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

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

網絡恢復之后,Leader給節點3發送RPC的時候,節點3會拒絕這些RPC理由是發送方任期太小。

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

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

那么網絡隔離 Raft是怎么解決的呢?

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

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

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

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

「解決方案是把term替換成(term, nodeid),并且按照字典序比較大小(a > b === a.term > b.term || a.term == b.term && a.nodeid > b. node_id). 這是paxos里的做法, 保證不會出現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內, 較大nodeid的可以搶走較小nodeid 已經建立的leader.

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

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

就這么點修改.

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

想法

我們如果出現 異常的網絡隔離情況再回來,可能導致 數據的不一致,但是上面的 解決辦法 因為 比較重,不適合我們,我們就單純 引入 「定時校對的調度任務 進行比較(和 對賬一樣)」

修復

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

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

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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10825

    瀏覽量

    211142
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11512
  • cache技術
    +關注

    關注

    0

    文章

    41

    瀏覽量

    1047

原文標題:記一次 Nacos 導致的 CPU 飆高問題 !

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

收藏 人收藏

    評論

    相關推薦

    第3集|醫院網絡(三)網絡隔離設計#網絡工程師#網絡隔離?#硬聲創作季

    網絡技術隔離
    Hello,World!
    發布于 :2022年10月23日 12:36:16

    如何實現網絡隔離

    如何實現網絡隔離
    發表于 10-31 08:10

    什么是網絡隔離技術

    什么是網絡隔離技術網絡隔離,是指兩個或兩個以上的計算機或網絡,不相連、不相通、相互斷開。不需要信息交換同的
    發表于 08-19 09:11 ?5840次閱讀

    高性能CPU時鐘網絡設計

    討論了物理設計中時鐘網絡的設計技術,并以現有的CPU時鐘網絡的為例,介紹了高性能CPU的時鐘網絡設計技術。
    發表于 12-27 15:28 ?46次下載
    高性能<b class='flag-5'>CPU</b>時鐘<b class='flag-5'>網絡</b>設計

    高性能CPU的時鐘網絡設計

    高性能CPU的時鐘網絡設計
    發表于 10-30 15:28 ?23次下載
    高性能<b class='flag-5'>CPU</b>的時鐘<b class='flag-5'>網絡</b>設計

    物理隔離與邏輯隔離網絡光端機和光纖收發器到底有什么區別

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

    CPU為什么不做成圓形

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

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

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

    網絡隔離變壓器的選型

    Hqst華強盛導讀:網絡隔離變壓器的選型需要考慮以下幾個因素: 輸入和輸出電壓:網絡隔離變壓器的輸入和輸出電壓應與應用場景的要求相匹配。 額定電流:
    發表于 05-04 08:41 ?1227次閱讀

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

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

    將Paxos和Raft統一為一個協議:Abstract-paxos

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

    使用 RAPIDS RAFT 進行機器學習和數據分析的可重用計算模式

    使用 RAPIDS RAFT 進行機器學習和數據分析的可重用計算模式
    的頭像 發表于 07-05 16:30 ?560次閱讀
    使用 RAPIDS <b class='flag-5'>RAFT</b> 進行機器學習和數據分析的可重用計算模式

    功率電源應用中需要怎樣的隔離驅動?為什么需要隔離驅動?

    功率電源應用中需要怎樣的隔離驅動?為什么需要隔離驅動?為什么有的電機不需要隔離驅動? 在功率電源應用中,
    的頭像 發表于 10-23 09:30 ?1070次閱讀

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

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

    請問一下docker是怎么實現cpu隔離的?

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