From 07841563a17f6f5dbc0e928edfee7650fb53a042 Mon Sep 17 00:00:00 2001 From: Lv Ying Date: Thu, 9 Dec 2021 04:05:19 +0800 Subject: [PATCH] Init package Signed-off-by: Lv Ying --- README.en.md | 36 ------------------------------ README.md | 31 +++++++++++++++++++------- atune_bpf_collection.spec | 45 ++++++++++++++++++++++++++++++++++++++ v1.0.0.tar.gz | Bin 0 -> 12984 bytes 4 files changed, 68 insertions(+), 44 deletions(-) delete mode 100644 README.en.md create mode 100644 atune_bpf_collection.spec create mode 100644 v1.0.0.tar.gz diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 3671303..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# A-Tune-BPF-Collection - -#### Description -A-Tune-BPF-Collection is BPF based tunning tools collection - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 47b930d..0941b3d 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,38 @@ # A-Tune-BPF-Collection #### 介绍 -A-Tune-BPF-Collection is BPF based tunning tools collection +A-Tune-BPF-Collection是BPF工具集,这些BPF程序用以跟踪内核行为模式以实时细粒度地调整内核参数,达到提升系统性能的目标。 #### 软件架构 -软件架构说明 +以`readahead_tune`为例来介绍A-Tune-BPF-Collection中的BPF程序。 +`readahead_tune`包含两部分: + +* BPF program(`readahead_tune.bpf`):加载到内核的BPF program以跟踪ext4/xfs文件系统的文件读操作 +* BPF control program(`readahead_tune`):读取配置文件,配置BPF program的参数,随即加载BPF program到内核 #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +通过rpm命令或者yum安装`A-Tune-BPF-Collection` rpm包: + +``` +# yum install A-Tune-BPF-Collection +or +# rpm -ivh A-Tune-BPF-Collection-{version}.x86_64.rpm +``` #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +以`readahead_tune`为例介绍A-Tune-BPF-Collection中的BPF程序程序使用: + +1. (可选)默认配置文件会安装在`/etc/sysconfig/readahead_tune.conf`,也可以自己新建配置文件,通过`start_readahead_tune`命令`-c|--config`选项指令配置文件路径。若未指定配置文件,则会使用默认安装的配置文件。 + + ``` + 注意:仅支持通过完整路径名指定配置文件,相对路径会无法识别;配置文件中若存在不合法的选项配置或者配置选项缺失,都会使用该选项的默认配置值。 + ``` + +2. 通过`start_readahead_tune`命令启动/加载`readahead_tune.bpf` BPF Program。命令使用方法可以使用`start_readahead_tune -h|--help`帮助命令。 +3. 通过`stop_readahead_tune`命令停止/卸载`readahead_tune.bpf` BPF Program。 #### 参与贡献 diff --git a/atune_bpf_collection.spec b/atune_bpf_collection.spec new file mode 100644 index 0000000..5c748ed --- /dev/null +++ b/atune_bpf_collection.spec @@ -0,0 +1,45 @@ +Name: A-Tune-BPF-Collection +Version: 1.0.0 +Release: 1 +License: Mulan PSL v2 +Summary: BPF program collection to adjust fine-grained kernel mode to get better performance +URL: https://gitee.com/openeuler/A-Tune-BPF-Collection +Source0: https://gitee.com/openeuler/A-Tune-BPF-Collection/repository/archive/v%{version}.tar.gz + +BuildRequires: clang, llvm, libbpf-devel, bpftool, dwarves +Requires: libbpf +Provides: readahead_tune + +%define debug_package %{nil} + +%description +A-Tune BPF Collection contains a set of BPF program which can interact with kernel in real time. +It has the following capabilities: +readahead_tune: trace file reading characteristics, then ajust file read mode to get maximum I/O efficency + +%prep +%autosetup -n %{name}-v%{version} -p1 + +%build +make %{?_smp_mflags} + +%install +install -D -p -m 0755 readahead_tune %{buildroot}/%{_sbindir}/readahead_tune +install -D -p -m 0644 readahead_tune.bpf.o %{buildroot}/%{_sbindir}/readahead_tune.bpf.o +install -D -p -m 0755 start_readahead_tune %{buildroot}/%{_sbindir}/start_readahead_tune +install -D -p -m 0755 stop_readahead_tune %{buildroot}/%{_sbindir}/stop_readahead_tune +install -D -p -m 0644 readahead_tune.conf %{buildroot}%{_sysconfdir}/sysconfig/readahead_tune.conf + +%files +%{_sbindir}/readahead_tune +%{_sbindir}/readahead_tune.bpf.o +%{_sbindir}/start_readahead_tune +%{_sbindir}/stop_readahead_tune +%config(noreplace) %{_sysconfdir}/sysconfig/readahead_tune.conf + +%changelog +* Tue Nov 9 2021 lvying - 1.0.0-1 +- Type:feature +- ID:NA +- SUG:NA +- DESC: Init A-Tune-BPF-Collection repo and add readahead_tune service diff --git a/v1.0.0.tar.gz b/v1.0.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6cdaed7968a1cb152a870d367999775410d82f59 GIT binary patch literal 12984 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 literal 0 HcmV?d00001