日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

性能指標 | CPU飆高排查實戰

來源: 責編: 時間:2024-06-28 17:11:16 139觀看
導讀問題發現前段時間我們新上線了一個應用,由于流量一直不大,集群的每秒查詢率(QPS)大約只有 5。接口的響應時間大約在 30 毫秒左右。最近我們接入了新的業務,業務方提供的數據顯示,日常的 QPS 預計可以達到 2000,而在大促期間

問題發現

前段時間我們新上線了一個應用,由于流量一直不大,集群的每秒查詢率(QPS)大約只有 5。接口的響應時間大約在 30 毫秒左右。xzV28資訊網——每日最新資訊28at.com

最近我們接入了新的業務,業務方提供的數據顯示,日常的 QPS 預計可以達到 2000,而在大促期間峰值 QPS 可能會達到 1 萬。xzV28資訊網——每日最新資訊28at.com

為了評估系統的性能水平,我們進行了一次壓力測試。測試在預發布環境進行。在壓力測試過程中,我們觀察到當單臺服務器的 QPS 達到約 200 時,接口的響應時間沒有明顯變化,但是 CPU 利用率迅速上升,直到達到極限。xzV28資訊網——每日最新資訊28at.com

圖片圖片xzV28資訊網——每日最新資訊28at.com

壓力測試結束后,CPU 利用率立即下降。xzV28資訊網——每日最新資訊28at.com

隨后我們開始排查是什么原因導致了 CPU 的突然飆升。xzV28資訊網——每日最新資訊28at.com

排查與解決

在壓力測試期間,登錄到機器后,我們開始排查問題。xzV28資訊網——每日最新資訊28at.com

本案例的排查過程使用了阿里開源的 Arthas 工具。如果沒有 Arthas,也可以使用 JDK 自帶的命令進行排查。xzV28資訊網——每日最新資訊28at.com

在開始具體排查之前,可以先查看 CPU 的使用情況。最簡單的方法是使用top命令直接查看:xzV28資訊網——每日最新資訊28at.com

top - 10:32:38 up 11 days, 17:56,  0 users,  load average: 0.84, 0.33, 0.18Tasks:  23 total,   1 running,  21 sleeping,   0 stopped,   1 zombie%Cpu(s): 95.5 us,  2.2 sy,  0.0 ni, 76.3 id,  0.0 wa,  0.0 hi,  0.0 si,  6.1 stKiB Mem :  8388608 total,  4378768 free,  3605932 used,   403908 buff/cacheKiB Swap:        0 total,        0 free,        0 used.  4378768 avail Mem   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   3480 admin     20   0 7565624   2.9g   8976 S  241.2 35.8 649:07.23 java   1502 root      20   0  401768  40228   9084 S   1.0  0.5  39:21.65 ilogtail   181964 root      20   0 3756408 104392   8464 S   0.7  1.2   0:39.38 java   496 root      20   0 2344224  14108   4396 S   0.3  0.2  52:22.25 staragentd   1400 admin     20   0 2176952 229156   5940 S   0.3  2.7  31:13.13 java   235514 root      39  19 2204632  15704   6844 S   0.3  0.2  55:34.43 argusagent   236226 root      20   0   55836   9304   6888 S   0.3  0.1  12:01.91 systemd-journ

可以清楚的看到,進程 ID 為 3480 的 Java 進程占用了較高的 CPU,可以初步推斷是應用代碼執行過程中消耗了大量的 CPU 資源。接下來,我們需要進一步排查是哪個線程、哪段代碼導致了這種情況。xzV28資訊網——每日最新資訊28at.com

首先,我們需要下載 Arthas 工具:xzV28資訊網——每日最新資訊28at.com

curl -L https://arthas.aliyun.com/install.sh | sh

啟動:xzV28資訊網——每日最新資訊28at.com

./as.sh

使用 Arthas 命令 "thread -n 3 -i 1000"查看當前"最忙"(耗 CPU)的三個線程:xzV28資訊網——每日最新資訊28at.com

圖片圖片xzV28資訊網——每日最新資訊28at.com

通過上述堆棧信息可以看出,占用 CPU 資源的線程主要是在 JDBC 底層的 TCP 套接字讀取上阻塞。經過連續執行多次分析,發現很多線程都在這個地方卡住。xzV28資訊網——每日最新資訊28at.com

進一步分析調用鏈后發現,這個問題源自于我代碼中的數據庫 insert 操作,其中使用了 TDDL 來創建 sequence。在 sequence 的創建過程中,需要與數據庫進行交互。xzV28資訊網——每日最新資訊28at.com

根據對 TDDL 的了解,它每次從數據庫查詢 sequence 序列時,默認會獲取 1000 條,并在本地進行緩存,直到使用完這 1000 條序列之后才會再次從數據庫獲取下一個 1000 條序列。xzV28資訊網——每日最新資訊28at.com

考慮到我們的壓測 QPS 僅約為 300 左右,不應該導致如此頻繁的數據庫交互。然而,通過多次使用 Arthas 進行查看,發現大部分的 CPU 資源都耗費在這里。xzV28資訊網——每日最新資訊28at.com

因此,我們開始排查代碼問題。最終,發現了一個非常簡單的問題,即我們的 sequence 創建和使用存在著明顯的缺陷:xzV28資訊網——每日最新資訊28at.com

public Long insert(T dataObject) {    if (dataObject.getId() == null) {        Long id = next();        dataObject.setId(id);    }    if (sqlSession.insert(getNamespace() + ".insert", dataObject) > 0) {        return dataObject.getId();    } else {        return null;    }}public Sequence sequence() {    return SequenceBuilder.create()        .name(getTableName())        .sequenceDao(sequenceDao)        .build();}/** * 獲取下一個主鍵ID * * @return */protected Long next() {    try {        return sequence().nextValue();    } catch (SequenceException e) {        throw new RuntimeException(e);    }}

因此,我們每次執行 insert 語句時都重新構建了一個新的 sequence 對象,這導致本地緩存被清空。因此,每次都需要從數據庫重新獲取 1000 條 sequence,但實際上只使用了一條,下次又會重復這個過程。xzV28資訊網——每日最新資訊28at.com

為了解決這個問題,我們調整了代碼,在應用啟動時初始化了一個 Sequence 實例。這樣,在后續獲取 sequence 時,不會每次都與數據庫交互。而是首先檢查本地緩存,只有在本地緩存用盡時才會再次與數據庫交互,獲取新的 sequence。xzV28資訊網——每日最新資訊28at.com

public abstract class BaseMybatisDAO implements InitializingBean {        @Override        public void afterPropertiesSet() throws Exception {            sequence = SequenceBuilder.create().name(getTableName()).sequenceDao(sequenceDao).build();        }    }

通過實現 InitializingBean 接口,并重寫其中的 afterPropertiesSet()方法,在該方法中進行 Sequence 的初始化。xzV28資訊網——每日最新資訊28at.com

完成以上代碼修改后,提交并進行驗證。根據監控數據顯示,優化后數據庫的讀取響應時間(RT)明顯下降。xzV28資訊網——每日最新資訊28at.com

圖片圖片xzV28資訊網——每日最新資訊28at.com

sequence 的寫操作 QPS 也有明顯下降:xzV28資訊網——每日最新資訊28at.com

圖片圖片xzV28資訊網——每日最新資訊28at.com

于是我們開始了新的一輪壓測,但是發現 CPU 的使用率仍然很高,壓測的 QPS 還是無法達到預期。因此,我們決定重新使用 Arthas 工具查看線程的情況。xzV28資訊網——每日最新資訊28at.com

圖片圖片xzV28資訊網——每日最新資訊28at.com

發現了一個 CPU 消耗較高的線程堆棧,主要是因為我們在使用一個聯調工具時,該工具預發布狀態下默認開啟了 TDDL 的日志采集(盡管官方文檔中描述預發布狀態下默認不會開啟 TDDL 采集,但實際上確實會進行采集)。xzV28資訊網——每日最新資訊28at.com

在該工具打印日志時,會進行數據脫敏操作,脫敏框架使用了 Google 的 re2j 進行正則表達式匹配。xzV28資訊網——每日最新資訊28at.com

由于我的操作涉及到大量的 TDDL 操作,而默認情況下會采集大量 TDDL 日志并進行脫敏處理,這導致了較高的 CPU 消耗。xzV28資訊網——每日最新資訊28at.com

因此,通過在預發布環境中關閉對 TDDL 的日志采集,可以有效解決這個問題。xzV28資訊網——每日最新資訊28at.com

總結

這篇總結回顧了一次線上 CPU 飆高問題的排查過程,雖然問題最終解決起來并不復雜,但排查過程中卻有其獨特的教育意義。xzV28資訊網——每日最新資訊28at.com

之前經驗豐富的我按照慣例進行了排查,初始階段并未發現明顯問題,錯誤地將數據庫操作增加歸因于流量上升所致的正常情況。xzV28資訊網——每日最新資訊28at.com

通過多方查證(例如使用 arthas 查看序列獲取情況,以及通過數據庫查詢最新插入數據的主鍵 ID 等方法),最終確認問題出在 TDDL 的序列初始化機制上。xzV28資訊網——每日最新資訊28at.com

解決了這個問題后,本以為問題徹底解決,卻又遭遇到 DP 采集 TDDL 日志導致 CPU 飆高的情況,最終再次解決問題后系統性能有了顯著提升。xzV28資訊網——每日最新資訊28at.com

因此,這個經歷再次驗證了“事出反常必有妖”,排查問題確實需要有耐心和系統性。xzV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-97280-0.html性能指標 | CPU飆高排查實戰

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 為什么會 Js 但是依然不會寫 Node?原因竟是這三點...

下一篇: 如何獲取請求的進度,并展示給用戶看?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 乌兰县| 朝阳市| 伊宁县| 云梦县| 青浦区| 吉林省| 汪清县| 永清县| 青河县| 美姑县| 民县| 安溪县| 曲麻莱县| 郓城县| 永福县| 绥中县| 砀山县| 城口县| 富川| 栖霞市| 什邡市| 社会| 开鲁县| 公主岭市| 沂南县| 吉首市| 宜昌市| 磐安县| 淅川县| 远安县| 封开县| 嘉善县| 绍兴县| 漾濞| 韩城市| 德江县| 洞头县| 元江| 宁德市| 怀安县| 临澧县|