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

以一次 Data Catalog 架構升級為例聊業務系統的性能優化

原創 精選
開發
本文以 Data Catalog 系統升級過程為例,與大家討論業務系統性能優化方面的思考,也會介紹我們關于 Apache Atlas 相關的性能優化。

?作者 | 開發套件團隊

摘要

字節的 DataCatalog 系統,在 2021 年進行過大規模重構,新版本的存儲層基于 Apache Atlas 實現。遷移過程中,我們遇到了比較多的性能問題。本文以 Data Catalog 系統升級過程為例,與大家討論業務系統性能優化方面的思考,也會介紹我們關于 Apache Atlas 相關的性能優化。

背景

字節跳動 Data Catalog 產品早期,是基于 LinkedIn Wherehows 進行二次改造,產品早期只支持 Hive 一種數據源。后續為了支持業務發展,做了很多修修補補的工作,系統的可維護性和擴展性變得不可忍受。比如為了支持數據血緣能力,引入了字節內部的圖數據庫 veGraph,寫入時,需要業務層處理 MySQL、ElasticSearch 和 veGraph 三種存儲,模型也需要同時理解關系型和圖兩種。更多的背景可以參照之前的文章。

新版本保留了原有版本全量的產品能力,將存儲層替換成了 Apache Atlas。然而,當我們把存量數據導入到新系統時,許多接口的讀寫性能都有嚴重下降,服務器資源的使用也被拉伸到夸張的地步,比如:

  • 寫入一張超過 3000 列的 Hive 表元數據時,會持續將服務節點的 CPU 占用率提升到 100%,十幾分鐘后觸發超時
  • 一張幾十列的埋點表,上下游很多,打開詳情展示時需要等 1 分鐘以上

為此,我們進行了一系列的性能調優,結合 Data Catlog 產品的特點,調整了 Apache Atlas 以及底層 Janusgraph 的實現或配置,并對優化性能的方法論做了一些總結。

業務系統優化的整體思路

在開始討論更多細節之前,先概要介紹下我們做業務類系統優化的思路。本文中的業務系統,是相對于引擎系統的概念,特指解決某些業務場景,給用戶直接暴露前端使用的 Web 類系統。

優化之前,首先應明確優化目標。與引擎類系統不同,業務類系統不會追求極致的性能體驗,更多是以解決實際的業務場景和問題出發,做針對性的調優,需要格外注意避免過早優化與過度優化。

準確定位到瓶頸,才能事半功倍。一套業務系統中,可以優化的點通常有很多,從業務流程梳理到底層組件的性能提升,但是對瓶頸處優化,才是 ROI 最高的。

根據問題類型,挑性價比最高的解決方案。解決一個問題,通常會有很多種不同的方案,就像條條大路通羅馬,但在實際工作中,我們通常不會追求最完美的方案,而是選用性價比最高的。

優化的效果得能快速得到驗證。性能調優具有一定的不確定性,當我們做了某種優化策略后,通常不能上線觀察效果,需要一種更敏捷的驗證方式,才能確保及時發現策略的有效性,并及時做相應的調整。

業務系統優化的細節

優化目標的確定

在業務系統中做優化時,比較忌諱兩件事情:

  • 過早優化:在一些功能、實現、依賴系統、部署環境還沒有穩定時,過早的投入優化代碼或者設計,在后續系統發生變更時,可能會造成精力浪費。
  • 過度優化:與引擎類系統不同,業務系統通常不需要跑分或者與其他系統產出性能對比報表,實際工作中更多的是貼合業務場景做優化。比如用戶直接訪問前端界面的系統,通常不需要將響應時間優化到 ms 以下,幾十毫秒和幾百毫秒,已經是滿足要求的了。

優化范圍選擇

對于一個業務類 Web 服務來說,特別是重構階段,優化范圍比較容易圈定,主要是找出與之前系統相比,明顯變慢的那部分 API,比如可以通過以下方式收集需要優化的部分:

  • 通過前端的慢查詢捕捉工具或者后端的監控系統,篩選出 P90 大于 2s 的 API
  • 頁面測試過程中,研發和測試同學陸續反饋的 API
  • 數據導入過程中,研發發現的寫入慢的 API 等

優化目標確立

針對不同的業務功能和場景,定義盡可能細致的優化目標,以 Data Catalog 系統為例:

定位性能瓶頸手段

系統復雜到一定程度時,一次簡單的接口調用,都可能牽扯出底層廣泛的調用,在優化某個具體的 API 時,如何準確找出造成性能問題的瓶頸,是后續其他步驟的關鍵。下面的表格是我們總結的常用瓶頸排查手段。

優化策略

在找到某個接口的性能瓶頸后,下一步是著手處理。同一個問題,修復的手段可能有多種,實際工作中,我們優先考慮性價比高的,也就是實現簡單且有明確效果。

快速驗證

優化的過程通常需要不斷的嘗試,所以快速驗證特別關鍵,直接影響優化的效率。

Data Catalog 系統優化舉例

在我們升級字節 Data Catalog 系統的過程中,廣泛使用了上文中介紹的各種技巧。本章節,我們挑選一些較典型的案例,詳細介紹優化的過程。

調節 JanusGraph 配置

實踐中,我們發現以下兩個參數對于 JanusGraph 的查詢性能有比較大的影響:

  • query.batch = ture
  • query.batch-property-prefetch=true

其中,關于第二個配置項的細節,可以參照我們之前發布的文章。這里重點講一下第一個配置。

JanusGraph 做查詢的行為,有兩種方式:

針對字節內部的應用場景,元數據間的關系較多,且元數據結構復雜,大部分查詢都會觸發較多的節點訪問,我們將 query.batch 設置成 true 時,整體的效果更好。

調整 Gremlin 語句減少計算和 IO

一個比較典型的應用場景,是對通過關系拉取的其他節點,根據某種屬性做 Count。在我們的系統中,有一個叫“BusinessDomain”的標簽類型,產品上,需要獲取與某個此類標簽相關聯的元數據類型,以及每種類型的數量,返回類似下面的結構體:

{
"guid": "XXXXXX",
"typeName": "BusinessDomain",
"attributes": {
"nameCN": "直播",
"nameEN": null,
"creator": "XXXX",
"department": "XXXX",
"description": "直播業務標簽"
},
"statistics": [
{
"typeName": "ClickhouseTable",
"count": 68
},
{
"typeName": "HiveTable",
"count": 601
}
]
}

我們的初始實現轉化為 Gremlin 語句后,如下所示,耗時 2~3s:

g.V().has('__typeName', 'BusinessDomain')
.has('__qualifiedName', eq('XXXX'))
.out('r:DataStoreBusinessDomainRelationship')
.groupCount().by('__typeName')
.profile();

優化后的 Gremlin 如下,耗時~50ms:

g.V().has('__typeName', 'BusinessDomain')
.has('__qualifiedName', eq('XXXX'))
.out('r:DataStoreBusinessDomainRelationship')
.values('__typeName').groupCount().by()
.profile();

Atlas 中根據 Guid 拉取數據計算邏輯調整

對于詳情展示等場景,會根據 Guid 拉取與實體相關的數據。我們優化了部分 EntityGraphRetriever 中的實現,比如:

  • mapVertexToAtlasEntity 中,修改邊遍歷的讀數據方式,調整為以點以及點上的屬性過濾拉取,觸發 multiPreFetch 優化。
  • 支持根據邊類型拉取數據,在應用層根據不同的場景,指定不同的邊類型集合,做數據的裁剪。最典型的應用是,在詳情展示頁面,去掉對血緣關系的拉取。
  • 限制關系拉取的深度,在我們的業務中,大部分關系只需要拉取一層,個別的需要一次性拉取兩層,所以我們接口實現上,支持傳入拉取關系的深度,默認一層。

配合其他的修改,對于被廣泛引用的埋點表,讀取的耗時從~1min 下降為 1s 以內。

對大量節點依次獲取信息加并行處理

在血緣相關接口中,有個場景是需要根據血緣關系,拉取某個元數據的上下游 N 層元數據,新拉取出的元數據,需要額外再查詢一次,做屬性的擴充。

我們采用增加并行的方式優化,簡單來說:

  • 設置一個 Core 線程較少,但 Max 線程數較多的線程池:需要拉取全量上下游的情況是少數,大部分情況下幾個 Core 線程就夠用,對于少數情況,再啟用額外的線程。
  • 在批量拉取某一層的元數據后,將每個新拉取的元數據頂點加入到一個線程中,在線程中單獨做屬性擴充
  • 等待所有的線程返回

對于關系較多的元數據,優化效果可以從分鐘級到秒級。

對于寫入瓶頸的優化

字節的數倉中有部分大寬表,列數超過 3000。對于這類元數據,初始的版本幾乎沒法成功寫入,耗時也經常超過 15 min,CPU 的利用率會飆升到 100%。

定位寫入的瓶頸

我們將線上的一臺機器從 LoadBalance 中移除,并構造了一個擁有超過 3000 個列的元數據寫入請求,使用 Arthas 的 itemer 做 Profile,得到下圖:

從上圖可知,總體 70%左右的時間,花費在 createOrUpdate 中引用的 addProperty 函數。

耗時分析

  1. JanusGraph 在寫入一個 property 的時候,會先找到跟這個 property 相關的組合索引,然后從中篩選出 Coordinality 為“Single”的索引
  2. 在寫入之前,會 check 這些為 Single 的索引是否已經含有了當前要寫入的 propertyValue
  3. 組合索引在 JanusGraph 中的存儲格式為:

  1. Atlas 默認創建的“guid”屬性被標記為 globalUnique,他所對應的組合索引是__guid。
  2. 對于其他在類型定義文件中被聲明為“Unique”的屬性,比如我們業務語義上全局唯一的“qualifiedName”,Atlas 會理解為“perTypeUnique”,對于這個 Property 本身,如果也需要建索引,會建出一個 coordinity 是 set 的完全索引,為“propertyName+typeName”生成一個唯一的完全索引

  1. 在調用“addProperty”時,會首先根據屬性的類型定義,查找“Unique”的索引。針對“globalUnique”的屬性,比如“guid”,返回的是“__guid”;針對“perTypeUnique”的屬性,比如“qualifiedName”,返回的是“propertyName+typeName”的組合索引。

  1. 針對唯一索引,會嘗試檢查“Unique”屬性是否已經存在了。方法是拼接一個查詢語句,然后到圖里查詢

  1. 在我們的設計中,寫入表的場景,每一列都有被標記為唯一的“guid”和“qualifiedName”,“guid”會作為全局唯一來查詢對應的完全索引,“qualifiedName”會作為“perTypeUnique”的查詢“propertyName+typeName”的組合完全索引,且整個過程是順序的,因此當寫入列很多、屬性很多、關系很多時,總體上比較耗時。

優化思路

  • 對于“guid”,其實在創建時已經根據“guid”的生成規則保證了全局唯一性,幾乎不可能有沖突,所以我們可以考慮去掉寫入時對“guid”的唯一性檢查,節省了一半時間。
  • 對于“qualifiedName”,根據業務的生成規則,也是“globalUnique”的,與“perTypeUnique”的性能差別幾乎是一倍:

優化實現效果

  • 去除 Atlas 中對于“guid”的唯一性的檢查。
  • 添加“Global_Unqiue”配置項,在類型定義時使用,在初始化時對“__qualifiedName”建立全局唯一索引。
  • 配合其他優化手段,對于超多屬性與關系的 Entity 寫入,耗時可以降低為分鐘級。

總結

  • 業務類系統的性能優化,通常會以解決某個具體的業務場景為目標,從接口入手,逐層解決
  • 性能優化基本遵循思路:發現問題->定位問題->解決問題->驗證效果->總結提升
  • 優先考慮“巧”辦法,“土”辦法,比如加機器改參數,不為了追求高大上而走彎路
責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2015-07-17 10:04:33

MKMapView優化

2020-08-24 07:12:17

前端CRP性能優化

2019-03-19 14:52:00

性能優化MySQL數據庫

2022-11-11 07:58:05

業務中臺架構

2020-06-05 08:53:31

接口性能實踐

2017-06-12 11:09:56

計數架構數據庫

2021-11-23 09:45:26

架構系統技術

2020-08-10 11:00:02

Python優化代碼

2021-03-12 15:08:23

服務器性能優化

2011-09-27 10:35:44

2022-06-06 21:53:08

云原生云計算

2024-07-09 11:51:20

Windows線程池源碼

2011-02-22 09:29:23

jQueryJavaScript

2023-11-06 07:45:42

單據圖片處理

2022-10-28 11:26:01

光纖終端盒光纖安裝

2019-03-29 08:21:51

馬蜂窩Golang并發代理

2022-03-23 15:43:26

Android客戶端架構

2021-03-05 22:41:55

CDH集群CDH集群

2020-10-30 14:11:38

服務器SDK堆棧

2021-08-26 22:26:55

性能優化技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品污www一区二区三区 | 亚洲欧洲在线观看视频 | av电影手机版 | 黄频视频 | 欧美日韩一区二区在线观看 | 欧美一级二级三级视频 | 亚洲国产精品福利 | 国产性网 | 色眯眯视频在线观看 | 亚洲第一天堂 | 亚洲福利| 亚洲一区二区三区在线视频 | 精品三区 | 欧美 日韩 中文 | 国产小视频自拍 | 毛片一级片 | 国产精品日韩 | 日本中文字幕视频 | 天天草草草 | 美女一区| 色综合一区二区三区 | 黄网站在线播放 | 欧美电影免费观看 | 国产一二三区精品视频 | 91国内精精品久久久久久婷婷 | 亚洲色图综合 | 91.色| 国产区在线视频 | 日本精品在线一区 | 欧美a免费 | 久草免费视 | 国产成人精品午夜视频免费 | 精品国产欧美在线 | 欧美一级大片免费看 | 91精品国产色综合久久 | 色男人天堂av | 国产午夜久久久 | www日韩高清| 日韩色视频 | 久久视频精品 | 天天操天天玩 |