Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加流量热点检测功能 #445

Closed
Smityz opened this issue Dec 17, 2019 · 3 comments
Closed

增加流量热点检测功能 #445

Smityz opened this issue Dec 17, 2019 · 3 comments
Labels
type/enhancement Indicates new feature requests

Comments

@Smityz
Copy link
Contributor

Smityz commented Dec 17, 2019

增加流量热点检测功能

1 背景

目前pegasus针对热点流量检测还是比较原始地罗列监控数值,使用人工的方式进行故障检测和故障排查,在运维上显得略微繁琐。为了使得数据能更加直观地呈现,我们增加了流量热点检测模块,将热点问题相关数值进行打分并反馈到falcon,减少了运维人员的负担。

此模块的功能为实时收集partition级别的信息,并根据对应算法,计算出每个partition的热点值并反馈到falcon上。通过各个partition热点值的变化曲线,运维人员可以更加迅速地推断出出现热点的位置。

同时此工作也为热点数据读写问题的解决方案的工作之一。

2 算法框架

2.1 调用关系

info_collector.cpp中各个app中partition的数据将会按照_app_stat_interval_seconds的配置进行采集(默认间隔为10s)。

2.2 数据结构

2.2.1 数据库级

使用了std::map<std::string, hotpot_calculator *> _calculator_store保存了所有app的hotpot_calculator的指针,以便在遍历app时使用对应的算法与数据进行运算。

2.2.2 app级

在每个app对应的hotpot_calculator中存有:

class hotpot_calculator
{
public:
    std::vector<std::queue<Data_store>> data_stores;
    hotpot_calculator(const std::string &name, const int &app_size);
    void aggregate(std::vector<row_data> partitions);
    void start_alg();

private:
    std::string _app_name;
    Hotspot_policy *_policy;
    std::vector<dsn::perf_counter> _hotpot_points;
};

其中_app_name为app名, _policy为对应的算法,_hotpot_points为当前app中输出到perf_counter的每个partition的热点值。 data_stores保存了当前app中每个partition的历史记录,queue则是将历史数据做了缓存,便于算法查询。

2.2.3 paritition级

对于每个partition, 我们使用了一个data_store来存储单次采集收集的数据。目前确定可以收集到的信息为:

double total_get_qps = 0;
double total_multi_get_qps = 0;
double total_put_qps = 0;
double total_multi_put_qps = 0;
double total_remove_qps = 0;
double total_multi_remove_qps = 0;
double total_incr_qps = 0;
double total_check_and_set_qps = 0;
double total_check_and_mutate_qps = 0;
double total_scan_qps = 0;
double total_recent_read_cu = 0;
double total_recent_write_cu = 0;

我们的算法将基于这些信息去做打分。

2.2.4 类图

Screenshot from 2019-12-17 16-22-25

2.3 使用方法

代码示例

std::map<std::string, std::vector<row_data>> all_rows;
if (!get_app_partition_stat(&_shell_context, all_rows)) {
    derror("call get_app_stat() failed");
    return;
}
//首先取出当前所有app的信息
for (auto app_rows : all_rows) {
    hotpot_calculator *app_store = nullptr;
//取出map中对应app
    get_store_handler(app_rows.first, app_rows.second.size(), app_store);
//收集当前app所有partition的数据
    app_store->aggregate(app_rows.second);
//使用对应算法计算结果并输出
    app_store->start_alg();
}
@qinzuoyan
Copy link
Contributor

Good job~

@levy5307
Copy link
Contributor

levy5307 commented Dec 18, 2019

hotpot_calculator里的_name改成_app_name吧,不看你这边文章还以为是caculator的名字。
还有

//首先取出当前所有app的信息
for (auto app_rows : all_rows) {
    hotpot_calculator *app_store = nullptr;
    get_store_handler(app_rows.first, app_rows.second.size(), app_store);
//取出map中对应app
    app_store->aggregate(app_rows.second);
//收集当前app所有partition的数据
    app_store->start_alg();
//使用对应算法计算结果并输出
}```


这里注释写到上面一行吧

@Smityz
Copy link
Contributor Author

Smityz commented Dec 18, 2019

hotpot_calculator里的_name改成_app_name吧,不看你这边文章还以为是caculator的名字。
还有

//首先取出当前所有app的信息
for (auto app_rows : all_rows) {
    hotpot_calculator *app_store = nullptr;
    get_store_handler(app_rows.first, app_rows.second.size(), app_store);
//取出map中对应app
    app_store->aggregate(app_rows.second);
//收集当前app所有partition的数据
    app_store->start_alg();
//使用对应算法计算结果并输出
}```


这里注释写到上面一行吧

ok~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/enhancement Indicates new feature requests
Projects
None yet
Development

No branches or pull requests

4 participants