云上業務一鍵性能調優,應用程序性能診斷工具 Btune 上線

圖片

- 01 -

終于等來了預算,這就把服務遷移到最新的 CPU 平臺上去,這樣前端的同事立馬就能感受我們帶來的速度提升了。可是…… 這些性能指標怎么回事?不僅沒有全面提升,有些反而下降了。不應該這樣啊,這可怎么辦?

花費了幾個月時間終于搞定了業務模塊的重構,立刻部署升級讓業務煥然一新。可是……長尾延遲居然還增加了一倍,說好的業務效果提升呢,到底是哪里出了問題?

上面的這些問題,對于開發運維工程師來說一定不陌生,經常被這類出乎意料的狀況打個措手不及。但是,性能優化是一項高技術門檻的工作,這通常需要運維人員有豐富的系統知識和經驗,對業務反復進行分析、定位、測試、驗證。遇到麻煩的 case,有時候可能需要花費數周時間。如果團隊中缺乏這類運維人員,那就只能盯著性能指標下降卻沒有有效的方法,最后影響了業務上線效果。

在將業務遷移至不同計算平臺,或者進行新業務上線的過程中,為了能夠完全發揮計算平臺的能力,及時找出性能瓶頸,對系統進行全面優化,百度智能云推出了「應用程序性能診斷工具 Btune」。

就像電腦管家可以快速對 PC 進行性能優化,Btune 能夠對云上業務進行一鍵性能調優,短時間內完成性能瓶頸的定位并提供優化建議,使得初級運維人員可以勝任高技術門檻的性能調優工作。

源自百度智能云多年在各種服務器 CPU(Intel、AMD、ARM) 和多類業務(推薦、搜索、廣告、大數據、數據庫、視頻編解碼等)上的性能調優經驗,Btune 支持多維度應用性能分析,可以自動生成優化建議提高應用性能,并提供可視化分析數據展示。

- 02 -

Btune 內置了百度自研的瓶頸分析樹模塊,通過自頂向下的方式,從 CPU、內存、磁盤、網絡、并發等 5 個維度對業務應用進行性能剖析和瓶頸定位,并從應用、runtime、系統、硬件等多個層次對每個瓶頸給出可操作的優化建議。

借助 Btune 的專業能力,用戶不僅能知道性能問題的根因,還能獲得問題優化的方法。只需在 Btune 的前端界面進行一鍵操作,幾分鐘后就可以得到一份完整的性能瓶頸和優化建議報告。

圖片

在 Btune 提供的性能瓶頸和優化建議報告中包含兩部分:分析摘要和分析詳情。其中,「分析摘要」清晰地展示了業務性能瓶頸點和相應的優化建議,可以滿足絕大部分的場景的需求。「分析詳情」提供了更詳細的性能分析數據,從系統配置、系統性能、進程線程模型、函數指令熱點等多個維度呈現負載的資源分布、耗時分布、線程關系等運行特性,滿足用戶更細粒度性能優化。

- 03 -

接下來,我們通過一個測試用例介紹如何使用 「應用程序性能診斷工具 Btune」。(此測試用例僅用于展示 Btune 基本功能和使用方法,實際生產環境業務負載比較復雜,但 Btune 使用方法和分析原理相同。)

在這個例子中,首先我們編寫一個測試程序作為分析對象。在這個程序中主要是調用 glibc 庫的 memset 和 memcpy 函數對內存進行操作。然后通過 numactl 命令模擬程序跨 NUMA 訪問內存的情況。我們通過 Btune 對這個程序進行分析給出性能瓶頸和優化建議。在 Btune 輸出的報告中,給出了兩類建議:

  • 在計算方面,給出了內存操作熱點函數和對應的熱點庫升級建議。

  • 在內存方面,給出了跨 NUMA 訪存優化建議。

最后我們根據 Btune 給出的建議對程序進行優化,可以看到優化后程序性能提高了 36.8%,優化效果顯著。

測試程序代碼如下,程序會無限循環執行簡單的內存拷貝操作,可通過編譯命令:gcc -o test test.c 和啟動命令:nohup numactl -N 0 -m 1 ./test & 來運行此程序。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"#define ARRAY_SIZE 1000000000void main()
{int i=0;int *a = malloc(sizeof(int)*ARRAY_SIZE);int *b = malloc(sizeof(int)*ARRAY_SIZE);while(1){memset(a, 0, sizeof(int)*ARRAY_SIZE);memset(b, 0, sizeof(int)*ARRAY_SIZE);memcpy(b, a, sizeof(int)*ARRAY_SIZE);};}

具體操作步驟如下:

1. 登錄云服務器控制臺

創建一個云服務器實例,登陸實例并拷貝、啟動測試程序 test。然后在百度智能云控制臺側邊欄選擇云服務器并選擇「運維與監控」下面的「自助診斷工具」進入性能分析界面。

圖片

2. 啟動性能檢測

在自助診斷工具頁面選擇「性能檢測」選項,然后選擇剛才創建的云服務器實例作為診斷實例,以及選擇 test 進程作為診斷進程,Btune 需要一定周期的采集時間分析該進展。參數配置完可開始檢測。

圖片

3. 查看分析摘要報告

幾分鐘后,診斷完畢。Btune 輸出分析摘要報告:

(1)待優化項

列出了程序的幾個瓶頸點,并給出了優化建議。在此例中,有 3 條優化建議:前 2 條給出了熱點函數 memset 和 memcpy 的熱點占比,并推薦升級 glibc2.33 進行優化(當前 CentOS 7.9 默認 glibc 是 2.17,版本較低,性能差)。第 3 條給出了當前程序跨 NUMA 內存使用率是 100%,建議減少跨 NUMA 訪問。

圖片

(2)診斷詳情

診斷詳情可查看 CPU、內存、網絡、磁盤、并發等 5 個維度的監控數據。我們以 CPU、內存和并發 3 個診斷項說明如下:

  • CPU 診斷項:內核的網絡、存儲和調度正常,主要風險是 glibc 熱點函數和庫版本。

圖片

  • 內存診斷項:無內存泄漏,采用匿名大頁,整機內存使用量較少,主要風險是跨 NUMA 使用內存。

圖片

  • 并發診斷項(mpi):線程數是 1,由于內存默認對齊所以沒有出現 split lock 情況,線程上下文切換和線程等待時間均正常,無風險。

圖片

4. 查看分析詳情報告

點擊檢測報告右下角的「查看詳細報告」,可以查看詳細的性能性能分析數據。

詳細報告界面分為三部分:概要、進程和系統。「概要」從程序運行時間維度給出了初步分析;「進程」給出了進程粒度的分析數據(CPU、內存、磁盤、網絡、熱點、多線程并發);「系統」給出了整機粒度的分析數據(CPU、內存、磁盤、網絡)。

圖片

此案例中,通過進程「熱點」可以查看熱點函數 list,跨路的熱點函數 list,火焰圖,跨路火焰圖等,具體如下:

  • 熱點函數:此例中主要熱點是內存操作函數__memset_sse2 和__memcpy_sse3_back,分別占比 63.09% 和 36.91%。

圖片

  • 跨 NUMA 熱點函數:此例中主要跨路熱點函數是__memcpy_sse3_back,占比 100%。

圖片

  • 火焰圖:此例中,glibc 中的__memset_sse2 和__memcpy_sse3_back 占比最大。

圖片

  • 跨 NUMA 火焰圖:此例中,glibc 中的__memcpy_sse3_back 占比最大。

圖片

5. 程序優化效果

根據 Btune 給出的優化建議,我們需要做兩項優化措施:一個是升級 glibc 到 2.33,一個是減少跨 NUMA 訪存。

為了方便對比優化前后性能差異,我們統計核心代碼段的耗時,修改程序如下:

clock_gettime(CLOCK_REALTIME, &start);memset(a, 0, sizeof(int)*ARRAY_SIZE);
memset(b, 0, sizeof(int)*ARRAY_SIZE);memcpy(b, a, sizeof(int)*ARRAY_SIZE);clock_gettime(CLOCK_REALTIME, &end);elapsed = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9;printf("Elapsed time: %f seconds\n", elapsed);

首先,優化前的默認程序執行單次耗時 2.576349 秒。

圖片

然后,執行 Btune 的建議優化項其一,關閉跨 NUMA 啟動并保持 2.17 版本 glibc,此時程序耗時 1.821380 秒,優化 29.3%。

圖片

最后,執行 Btune 的全部優化建議,升級到 2.33 版本 glibc,并關閉跨 NUMA 啟動,耗時 1.625940 秒,共優化 36.8%。

圖片
- - - - - - - - - - END - - - - - - - - - -

推薦閱讀

一文詳解靜態圖和動態圖中的自動求導機制

千萬級高性能長連接Go服務架構實踐

百度搜索Push個性化:新的突破

數據交付變革:研發到產運自助化的轉型之路

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用單一ASM-HEMT模型實現從X波段到Ka波段精確的GaN HEMT非線性仿真

來源:Accurate Nonlinear GaN HEMT Simulations from X- to Ka-Band using a Single ASM-HEMT Model 摘要:本文首次研究了ASM-HEMT模型在寬頻帶范圍內的大信號準確性。在10、20和30 GHz的頻率下,通過測量和模擬功率掃描進行了比較。在相同的頻…

day05-進程通信

1> 將互斥機制的代碼實現重新敲一遍 代碼&#xff1a; #include<myhead.h>int num520;//臨界資源//1.創建互斥鎖 pthread_mutex_t fastmutex;//定義任務函數 void *task1(void *arg){printf("1111111\n");//3.臨界區上面獲取鎖資源&#xff08;上鎖&#…

LeetCode每日刷題:101. 對稱二叉樹

題目&#xff1a; 解題思路&#xff1a;可以新寫一個函數&#xff0c;從root開始&#xff0c;root的left的頭結點將記為lefttree&#xff08;左子樹&#xff09;,root的lright的頭結點將記為righttree&#xff08;右子樹&#xff09;&#xff0c; 然后遞歸左子樹的root.left與右…

【鴻蒙 HarmonyOS 4.0】TypeScript開發語言

一、背景 HarmonyOS 應用的主要開發語言是 ArkTS&#xff0c;它由 TypeScript&#xff08;簡稱TS&#xff09;擴展而來&#xff0c;在繼承TypeScript語法的基礎上進行了一系列優化&#xff0c;使開發者能夠以更簡潔、更自然的方式開發應用。值得注意的是&#xff0c;TypeScrip…

Python:Keyboard Interrupt - 當代碼遇到“Ctrl+C“時發生了什么?

Python&#xff1a;Keyboard Interrupt - 當代碼遇到"CtrlC"時發生了什么&#xff1f; &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;【Matplotlib之旅&#xff1a;零基礎精通數據可視化】 &#x1f4a1; 創作高質量博文&#x…

Web服務器集群: kylin 部署 Halo博客系統

目錄 一、實驗 1.環境 2. kylin 部署mysql數據庫 3. kylin 構建Java運行環境 4. 創建博客使用的數據庫 5. kylin 部署 halo博客系統 6. kylin 部署nginx 7. kylin 使用 SSL證書基于https訪問部署的博客系統 二、問題 1.mysql安裝報錯 2.查看mysql數據庫報錯 3.syste…

【k近鄰】 K-Nearest Neighbors算法k值的選擇

【k近鄰】 K-Nearest Neighbors算法原理及流程 【k近鄰】 K-Nearest Neighbors算法距離度量選擇與數據維度歸一化 【k近鄰】 K-Nearest Neighbors算法k值的選擇 【k近鄰】 Kd樹的構造與最近鄰搜索算法 【k近鄰】 Kd樹構造與最近鄰搜索示例 k近鄰算法&#xff08;K-Nearest Neig…

jdk動態代理與CGLib動態代理

jdk動態代理 目標對象 package com.study;/*** 目標對象&#xff08;被代理的對象&#xff09;**/ public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name name;}public String buyCola (String name){Sys…

【SQL注入】靶場SQLI DUMB SERIES-24通過二次注入重置用戶密碼

先使用已知信息admin/admin登錄進去查下題&#xff0c;發現可以修改密碼 猜測可能存在的SQL語句&#xff1a;UPDATE user SET password新密碼 WHERE user用戶名 and password舊密碼 假設我們知道有個admin用戶&#xff0c;但是不知道其密碼&#xff0c;如何可以將其密碼重置&…

雜題——1097: 蛇行矩陣

題目描述 蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。 輸入格式 本題有多組數據&#xff0c;每組數據由一個正整數N組成。&#xff08;N不大于100&#xff09; 輸出格式 對于每一組數據&#xff0c;輸出一個N行的蛇形矩陣。兩組輸出之間不要額外的空行。矩陣三角…

如何在群輝7.2中使用Docker搭建容器魔方服務并遠程訪問【內網穿透】

文章目錄 1. 拉取容器魔方鏡像2. 運行容器魔方3. 本地訪問容器魔方4. 群輝安裝Cpolar5. 配置容器魔方遠程地址6. 遠程訪問測試7. 固定公網地址 本文主要介紹如何在群輝7.2版本中使用Docker安裝容器魔方&#xff0c;并結合Cpolar內網穿透工具實現遠程訪問本地網心云容器魔方界面…

shell中字符串的操作,和shell中數組的操作

獲取長度 rootubuntu:/home/test/Desktop# a"hello world" rootubuntu:/home/test/Desktop# echo ${#a} 11字符串切片 ${parameter:offset} 偏移量 $(parameter:offset:length} 偏移量&#xff1a;長度rootubuntu:/home/test/Desktop# echo ${a:1:2} el截取最后一個…

C#知識點-17(正則表達式)

正則表達式 概念&#xff1a;正則表達式是用來進行文本處理的技術&#xff0c;是語言無關的&#xff0c;在幾乎所有語言中都有實現 元字符&#xff1a; 1、.&#xff1a;匹配除\n之外的任何單個字符。例如正則表達式“b.g”能匹配如下字符串&#xff1a;“big”、“bug”、“…

MySQL 窗口函數溫故知新

本文用于復習數據庫窗口函數&#xff0c;希望能夠溫故知新&#xff0c;也希望讀到這篇文章的有所收獲。 本文以&#xff1a;MySQL為例 參考文檔&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的樣例數據&#xff1a;https://www.begtut.com/m…

對象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/ 原文中可下載高清SVG矢量類圖 引言 對象池模式(Object Pool Pattern)是一種創建一組可重用對象的設計模式。它通過維護一個預分配的對象集合,避免了頻繁地創建和銷毀對象所帶來的性能開銷。在需要使用…

力扣_字符串11—實現前綴樹(字典樹、Trie樹)

題目 方法 對于每一個節點&#xff0c;初始化一個長度為26的數組&#xff0c;用來存儲對應字母子節點的地址對于每一個節點&#xff0c;初始化一個 b o o l bool bool 變量用來表示是否為葉子節點 代碼 class Trie { private:vector<Trie*> children vector<Trie…

LeetCode //C - 901. Online Stock Span

901. Online Stock Span Design an algorithm that collects daily price quotes for some stock and returns the span of that stock’s price for the current day. The span of the stock’s price in one day is the maximum number of consecutive days (starting from…

ESP8266智能家居(1)——開發環境的搭建

1.前期介紹 本次打算使用esp8266的開發板——NodeMCU&#xff0c;進行物聯網相關項目的學習。開發環境使用Arduino軟件。 NodeMCU實物圖為&#xff1a; 開發環境截圖為&#xff1a; 2.軟件下載 我使用的arduino版本為1.8.5&#xff0c;其安裝包如下&#xff1a; 【免費】ar…

vue3 #跨組件通信

//爺爺組件中 import { provide , ref } from vue const money ref (100) //定義數據 provide( money , money ) //提供數據給孫子組件 const changeMoney ( m:number ) > { //定義函數 if (money) { money.value money.value - m } } provide(&quo…

Python系列(19)—— 條件語句

一、條件語句的基本概念 條件語句&#xff0c;也稱為選擇語句&#xff0c;允許程序根據條件的結果來執行不同的代碼塊。Python中最常用的條件語句是if語句&#xff0c;其基本語法如下&#xff1a; if condition:# 當條件為真時執行的代碼塊如果條件為真&#xff08;即非零或非…