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

add table level latency #406

Closed
levy5307 opened this issue Oct 22, 2019 · 3 comments
Closed

add table level latency #406

levy5307 opened this issue Oct 22, 2019 · 3 comments
Labels
type/enhancement Indicates new feature requests

Comments

@levy5307
Copy link
Contributor

levy5307 commented Oct 22, 2019

增加表级别延迟统计&表级别慢查询配置

一、背景

目前pegasus的一个node中关于get和multi-get接口的latency perf-counter是基于表分片的。有时我们需要查询一个node上的表延迟,由于node中的分片有可能有多个,所以就会很杂乱,基本没什么使用价值。

另外,由于不同表的结构不同,有的表读写40KB,有的表读写4KB,其读写latency肯定不同,如果设置一个统一的慢查询时长会导致很多无效的日志,所以需要针对不同的表提供不同的慢查询配置。

二、实现方案

2.1 增加表级别延迟统计

perf_counters单例中保存了当前node上的所有的perf counter,并维护了不同perf counter的引用计数。当某个perf counter引用计数变为0的时候将会被删除。

另外提供了创建新的perf counter的接口。在创建时,先判断该perf counter是否已经存在,如果已经存在,直接返回对应的perf counter指针;否则则创建一个新的。

(1) 数据结构

为replica增加一个unordered_map<int, perf_counter_wrapper>类型成员变量_counters_table_level_latency,用于存储task_code与perf_counter的映射。其中task_code包括RPC_RRDB_RRDB_GET、RPC_RRDB_RRDB_MULTI_GET、RPC_RRDB_RRDB_SET和RPC_RRDB_RRDB_MULTI_SET。

(2) 初始化

由于在replica_stub中创建replica的地方有多处,并最终都由会执行replica构造函数,所以选择在replica的构造函数中插入perf counter创建的逻辑实现。对于同一个app的不同replica,其对应的perf counter的name相同,以保证同一app的不同replica中使用同一组perf counter。

当新创建一个replica时,通过相应的perf counter name调用perf_counters的创建接口。如上所述,如果该perf counter不存在,则创建并初始化一个新的perf_counter;如果存在,说明该perf counter已经被其他的replica在初始化的时候创建好了,只需要获取其指针就可以了。

(3) 计数

当请求到来时,以get为例,在replica::on_client_read函数的_app->on_request前后分别记录请求开始时间和结束时间,相减便可以获取该次请求的latency, 计入到其perf counter中。

(4) 销毁

在replica的析构函数中,replica本地的所有perf_counter_wrapper将会被析构。当一个perf_counter_wrapper被析构时,对应的perf counter的计数会被减1。当其的引用计数变为0时,该perf counter将会被删除。

2.2 表级别慢查询配置

慢查询配置可以通过在表的环境变量中配置的方式来实现。命令如下:set_app_envs  replica.slow_query_threshold  {threshold_ms}

其中threshold_ms必须大于20ms。

当get/multi-get操作duration > threshold_ms时,将会写入慢查询日志。

三、目标预期

在不影响性能的前提下,实现各node的表级操作延迟统计(get/set/multi-get/muti-set)功能,以及表级别的慢查询配置功能。

但是目前无法将各node的表级perf counter进行汇总,因而无法实现集群的表级延迟统计。

@neverchanje
Copy link
Contributor

get_latency_perf_counters 不是只有 get 才会记 latency,你这个名字有问题。如果说 get/set/multiset/multiget 都要记 latency,你这个设计是不是不行?你肯定要设计的有可扩展性,能够支持不同的RPC类型。

@levy5307
Copy link
Contributor Author

levy5307 commented Oct 22, 2019

get_latency_perf_counters 不是只有 get 才会记 latency,你这个名字有问题。如果说 get/set/multiset/multiget 都要记 latency,你这个设计是不是不行?你肯定要设计的有可扩展性,能够支持不同的RPC类型。

不是get和multi-get这两个吗?还有set和multi-set?我理解的是get操作和set操作的latency不应该放在同一个perf counter里面吧

@acelyc111
Copy link
Member

首先, 调整下格式成markdown吧

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

3 participants