天天看點

Rocksdb 日志分析工具 -- 性能和穩定性分析

文章目錄

  • ​​1. 前言​​
  • ​​2. 工具使用細節​​
  • ​​3. 如何制作一個自己的python-package​​
  • ​​3.1 項目配置檔案​​
  • ​​3.1.1 LICENSE 檔案​​
  • ​​3.2 README.md 檔案​​
  • ​​3.3 pyproject.toml 檔案​​
  • ​​3.4 setup.cfg檔案​​
  • ​​3.5 setup.py檔案​​
  • ​​3.2 打包​​
  • ​​3.2.1 安裝打包工具​​
  • ​​3.2.2 打包​​
  • ​​3.3 打包好的檔案上傳pypi​​
  • ​​3.3.1 注冊自己的pypi賬戶​​
  • ​​3.3.2 添加項目token​​
  • ​​3.3.3 釋出打封包件​​
  • ​​3.4 測試釋出的包​​

1. 前言

本節提供一個rocksdb的日志分析工具,能夠在db機器根據rocskdb的option檔案和log檔案 分析目前rocksdb運作過程中是否存在穩定性和性能問題,并給出對應的參數優化或者問題解決的建議。比如:目前db中存在write-stall問題,而且實際過程中write-stall可能的問題源頭有很多個,像L0檔案個數過多就是因為L0->L1 compaction太慢 或者說 compaction線程數太少, 這個工具能夠分析出其中存在問題根源,并提出對應的參數優化,像增大compaction線程數等等。

類似如下輸出:

# 規則檔案
Rule: stall-too-many-L0
# 日志異常資訊
LogCondition: stall-too-many-L0 regex: Stalling writes because we have \d+ level-0 files
# 建議修改的參數
Suggestion: inc-max-subcompactions option : DBOptions.max_subcompactions action : increase
Suggestion: inc-max-bg-compactions option : DBOptions.max_background_compactions action : increase suggested_values : ['2']
Suggestion: inc-write-buffer-size option : CFOptions.write_buffer_size action : increase
Suggestion: dec-max-bytes-for-level-base option : CFOptions.max_bytes_for_level_base action : decrease
Suggestion: inc-l0-slowdown-writes-trigger option : CFOptions.level0_slowdown_writes_trigger action : increase
scope: col_fam:
{'default'}      

2. 工具使用細節

工具本身是rocksdb 社群提供的,為了友善本地使用,我将其封裝成了python package 形态,可以直接通過本地pip安裝,也支援指定不同的國内源安裝,都沒有問題。

  • 下載下傳 ​

    ​pip3 install Adviser-Rocksdb​

  • 規則檔案儲存到伺服器上: ​​rules.ini​​
  • 執行:
python3 -m advisor.rule_parser_example \
# 指定儲存的規則檔案
--rules_spec=advisor/rules.ini \
# 指定db目錄下的option檔案
--rocksdb_options=OPTIONS-000005 \
# 指定db目錄下的日志檔案
--log_files_path_prefix=tests/input_files/LOG-0 \
# 指定db-log檔案内容的statistics列印頻率(這裡随意設定并沒有什麼問題,但需要有這個參數)
--stats_dump_period_sec=20      
  • 更多指令細節
python3 -m advisor.rule_parser_example  --help # 檢視工具幫助資訊      

本質上這個工具就像是一個規則引擎,通過預先設定好的規則​

​rules.ini​

​​檔案來從rocksdb-log中進行比對,輸出最後的比對結果,當然,我們也可以向​

​rules.ini​

​檔案中按照格式增加适合自己業務的比對規則即可。

比如發現如下參數不合理的問題,write_buffer_size 過小會出現頻繁的flush,且level0檔案因為小而數量增長快,排程的L0->L1 的compaction也會很頻繁,這個代價就比較大。

[CFOptions "col_fam_A"]
max_bytes_for_level_base=268435456
level0_file_num_compaction_trigger=5
write_buffer_size=1024000      

通過日志分析工具,能夠給出一個合理的參數優化方案:調大write-buffer-size 并适度縮小max_bytes_for_level_base來保證小sst檔案的LSM-tree形态。

Rule: small-l0-files
OptionCondition: small-l0-files options: ['CFOptions.max_bytes_for_level_base', 'CFOptions.level0_file_num_compaction_trigger', 'CFOptions.write_buffer_size'] expression: int(options[0])>(10*int(options[1])*int(options[2])) trigger: {'default': ['268435456', '4', '4194000'], 'col_fam_A': ['268435456', '5', '1024000']}
Suggestion: dec-max-bytes-for-level-base option : CFOptions.max_bytes_for_level_base action : decrease
Suggestion: inc-write-buffer-size option : CFOptions.write_buffer_size action : increase
scope: col_fam:
{'col_fam_A', 'default'}      

相關的日志分析工具源代碼見​​https://github.com/BaronStack/Rocksdb-Adviser​​

這裡順帶提一下如何制作一個自己的python-package:

3. 如何制作一個自己的python-package

下文中提到的配置檔案均可以參考:

​​​https://github.com/BaronStack/Rocksdb-Adviser​​ 中的内容。

如果你想做測試,可以直接按照如下步驟來嘗試。

3.1 項目配置檔案

建立目錄​

​packaging​

​,并建立如下檔案,可以先讓其中檔案内容為空,後面會補充。

> tree .
.
├── LICENSE # 本package 遵守的開源協定
├── README.md # 你的package 描述文檔,告訴别人如何使用這個package
├── example_pkg # package 源代碼目錄
│   └── __init__.py # 該檔案支援将你的源代碼以package 形式導入
├── pyproject.toml # 打包目前package是需要增加的依賴庫版本
├── setup.cfg # 靜态打包,類似靜态庫,相關依賴/需要安裝内容在安裝之前就已經确定,并打包好,一般優先使用.cfg來打包
├── setup.py # 動态打包,通過setuptool工具,在安裝的時候才去安裝對應的依賴
└── tests # 源代碼的測試檔案目錄      

3.1.1 LICENSE 檔案

可以在​​ https://choosealicense.com/ ​​ 找到協定内容,比如尊崇的是MIT開源協定:

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.      

3.2 README.md 檔案

這裡不多說,就是針對你個人package的使用描述檔案.

# TEST
This is a packaging test directory.      

3.3 pyproject.toml 檔案

指定打包時 源代碼所需要的依賴庫,這個檔案預設可以不需要添加,一般認為這個檔案存在,是因為你需要依賴​

​wheel​

​。

如果不依賴wheel,則可以不需要這個檔案
[build-system]
requires = [
    "setuptools>=42",
    "wheel" 
]
build-backend = "setuptools.build_meta"      

3.4 setup.cfg檔案

這個檔案在打包之前就能夠明确指定目前package的資訊,比較準确且容易發現配置内容的問題,也是官方推薦的打包方式。

一般内容如下,可以直接使用

[metadata]
# 指定你想要 打包的 包名稱 ‘packaging-testing’ 
name = example-pkg-YOUR-USERNAME-HERE
# 包的版本
version = 0.0.1
# 開發者
author = Example Author
# 開發者郵件
author_email = [email protected]
# 包的簡單功能描述
description = A small example package
# 指定較長的描述 的檔案,預設是README.md
long_description = file: README.md
# 指定較長的描述的的文本編輯器 markdown,可能還有富文本編輯器
long_description_content_type = text/markdown
# 指定維護package的github位址,可選
url = https://github.com/pypa/sampleproject
# 指定package的issue位址,可選
project_urls =
    Bug Tracker = https://github.com/pypa/sampleproject/issues
# 一些版本 - 協定資訊
classifiers =
    Programming Language :: Python :: 3
    License :: OSI Approved :: MIT License
    Operating System :: OS Independent

# python版本
[options]
packages = find:
python_requires = >=3.6      

如果​

​setup.py​

​​檔案存在,也就是後面說的這個檔案存在,則目前 ​

​setup.cfg​

​​不會生效,預設以​

​setup.py​

​為主,為了保證安裝時增加的setuptools的擴充插件能夠被正确安裝。

setup.py和setup.cfg 兩個檔案選擇一個就可以,官方推薦setup.cfg來打包

3.5 setup.py檔案

基本和​

​setup.cfg​

​配置項一樣,隻是啟動方式不同,通過pip在各自本地安裝時通過setuptool安裝一些依賴。

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
    version="0.0.1",
    author="Example Author",
    author_email="[email protected]",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    project_urls={
        "Bug Tracker": "https://github.com/pypa/sampleproject/issues",
    },
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    packages=setuptools.find_packages(),
    python_requires=">=3.6",
)      

3.2 打包

3.2.1 安裝打包工具

​python3 -m pip install --upgrade build​

3.2.2 打包

​python3 -m build​

打包完成會在目前目錄下生成一些打包目錄,其中​

​dist​

​目錄是打包完成的檔案:

> tree .
.
├── BaronStack.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── LICENSE
├── README.md
├── build
│   └── bdist.macosx-11-x86_64
├── dist
│   ├── BaronStack-0.0.1-py3-none-any.whl
│   └── BaronStack-0.0.1.tar.gz
├── example_pkg
│   └── __init__.py
├── setup.cfg
├── setup.py
└── tests      

3.3 打包好的檔案上傳pypi

我們需要将打包好的檔案上傳到​​https://pypi.org/​​中,才能夠被全世界的其他想要使用的夥伴下載下傳下來。

3.3.1 注冊自己的pypi賬戶

這個不多說,直接注冊完了

3.3.2 添加項目token

這一步主要是為了保證本地剛才建構好的python package 能夠免密上傳到自己的賬戶下。

  • 我的賬戶已經注冊完了,選擇 ​

    ​accont setting​

  • Rocksdb 日志分析工具 -- 性能和穩定性分析
  • 添加token
  • Rocksdb 日志分析工具 -- 性能和穩定性分析
  • 設定token名稱, 設定token範圍,第一次建立的話需要設定為适配所有項目,保證對目前自己想要上傳的項目生效
  • Rocksdb 日志分析工具 -- 性能和穩定性分析
  • 将生成的token添加到自己的本地​

    ​~/.pypirc​

    ​檔案中
  • Rocksdb 日志分析工具 -- 性能和穩定性分析

3.3.3 釋出打封包件

  • 安裝釋出工具 (隻需安裝一次,後續可以直接執行第二個指令)

    ​python3 -m pip install --user --upgrade twine​

  • 釋出

    ​python3 -m twine upload dist/*​

    ​釋出成功後會出現:
Uploading distributions to https://test.pypi.org/legacy/
Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz
100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]      

這個時候你去​​https://pypi.org/manage/projects/​​就能夠看到自己的項目了。

3.4 測試釋出的包