速率限制

在使用RocksDB时,出于多种原因,用户可能希望将最大写入速度限制在一定的范围内。 例如,如果闪存写入超过某个阈值,会导致严重的读取延迟峰值。 既然您已经阅读了这个网站,我相信您已经知道为什么需要速率限制器。 实际上,RocksDB包含一个本地的速率限制器,它应该适合大多数用例。

如何使用

通过调用NewGenericRateLimiter创建一个RateLimiter对象,该对象可以为每个RocksDB实例单独创建,也可以在RocksDB实例之间共享,以控制刷新和压缩的聚合写速率。

  1. RateLimiter* rate_limiter = NewGenericRateLimiter(
  2. rate_bytes_per_sec /* int64_t */,
  3. refill_period_us /* int64_t */,
  4. fairness /* int32_t */);

参数:

  • rate_bytes_per_sec: 这是大多数情况下需要设置的惟一参数。它控制压缩和刷新的总写速率,单位为每秒字节。 目前,RocksDB只对刷新和压缩(例如写入到WAL)执行速率限制
  • refill_period_us: 这控制了令牌被重新填充的频率。例如,当rate_bytes_per_sec被设置为10MB/s, refill__us被设置为100ms时,那么内部每100ms就会重新填充1MB。 较大的值会导致突发写操作,而较小的值会引入更多的CPU开销。默认值100,000适用于大多数情况。
  • fairness: RateLimiter接受高优先级请求和低优先级请求。低优先级请求通常会被阻塞,以支持高优先级请求。 目前,RocksDB将low-pri分配给压缩请求,high-pri分配给刷新请求。如果连续出现刷新请求,低pri请求可能会被阻塞。 这个公平参数以1/公平机会授予低优先级请求权限,即使存在高优先级请求以避免饿死。你应该把默认值设为10。

定制

对于需要超出RocksDB本机Ratelimiter提供的功能的用户,可以通过扩展include/rocksdb/rate_limit.h实现自己的Ratelimiter