Skip to content

Commit

Permalink
Merge pull request #12 from darionyaphet/Memory-usage-in-RocksDB
Browse files Browse the repository at this point in the history
fix typo in Memory-usage-in-RocksDB
  • Loading branch information
johnzeng committed Jun 16, 2021
2 parents e560cb7 + a8f021e commit 315261b
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions doc/Memory-usage-in-RocksDB.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,31 @@ table_options.block_cache->GetUsage();

# 索引和过滤块

索引和过滤快可能是内存使用大户,并且默认他们不会计算在你分配给块缓存的内存里。这有时候会迷惑用户:你分配了10GB给块缓存,但是Rocksdb使用了15GB的内存。这个差异通常是因为内存和bloom过滤块。
索引和过滤块可能是内存使用大户,并且默认他们不会计算在你分配给块缓存的内存里。这有时候会迷惑用户:你分配了10GB给块缓存,但是Rocksdb使用了15GB的内存。这个差异通常是因为内存和bloom过滤块。

这里介绍你如何大致计算和管理索引和过滤块的大小:

对于每个数据块我们存储三个信息到索引:一个key,一个偏移,以及一个大小。因此有两个方法你可以减少索引的大小。如果你增加块大小,块的数量会减少,所以索引的大小会线性减少。默认情况下我们的块大小为4KB,尽管我们通常在生产环境使用16~32KB。第二个减少索引大小的方法是减少key的大小,尽管对于某些使用场景,这不现实。
计算过滤块的大小的方法很简单。如果你配置bloom过滤器为每个key取10个bit(默认,会有1%的假阳性),bloom过滤器大小为number_of_keys * 10 bit。不过你可以使用一个技巧。如果你确认Get()在最坏的情况下都能找到一个key,你可以设置options.optimize_filters_for_hits为true。打开了这个选项,我们会不再最后一层,包含90%的数据库内容,构建bloom过滤器。因此,内存的bloom过滤器的使用量会少10X倍。但是,对于不能找到数据的Get请求,你每次都要花费一个额外的IO。
对于每个数据块我们存储三个信息到索引:一个key,一个偏移,以及一个大小。因此有两个方法你可以减少索引的大小。
如果你增加块大小,块的数量会减少,所以索引的大小会线性减少。
默认情况下我们的块大小为4KB,尽管我们通常在生产环境使用16~32KB。第二个减少索引大小的方法是减少key的大小,尽管对于某些使用场景,这不现实。
计算过滤块的大小的方法很简单。如果你配置bloom过滤器为每个key取10个bit(默认,会有1%的假阳性),bloom过滤器大小为number_of_keys * 10 bit。
不过你可以使用一个技巧。如果你确认Get()在最坏的情况下都能找到一个key,你可以设置options.optimize_filters_for_hits为true。
打开了这个选项,我们会不再最后一层,包含90%的数据库内容,构建bloom过滤器。因此,内存的bloom过滤器的使用量会少10X倍。
但是,对于不能找到数据的Get请求,你每次都要花费一个额外的IO。

有两个选项用于配置索引和过滤块使用多少内存的:

如果你设置cache_index_and_filter_blocks为true,索引和过滤块会被存储在块缓存,跟其他数据块一起。这同时意味着他们会被页换出。如果你的访问方式局部性比较强(比如,你有一些非常少用的key范围),这个设置就很合理了。然而,在大多数情况,他都是对你的性能有害的,因为你需要索引和过滤器来访问一个特定的文件。同事,总是考虑设置pin_l0_filter_and_index_blocks_in_cache来最小化对性能的冲击
如果cache_index_and_filter_blocks为false(默认值),索引/过滤块的数量通过max_open_files选项控制。如果你确定你的ulimit总是大于数据库中的文件数量,我们推荐你设置max_open_files为-1,以为这无限制。这个选项会预加载所有过滤器和索引块,并且不需要维护文件的LRU。设置max_open_files为-1会给你最好的性能。
如果你设置cache_index_and_filter_blocks为true,索引和过滤块会被存储在块缓存,跟其他数据块一起。
这同时意味着他们会被页换出。如果你的访问方式局部性比较强(比如,你有一些非常少用的key范围),这个设置就很合理了。
然而,在大多数情况,他都是对你的性能有害的,因为你需要索引和过滤器来访问一个特定的文件。
如果你确定你的ulimit总是大于数据库中的文件数量,我们推荐你设置max_open_files为-1,以为这无限制。
这个选项会预加载所有过滤器和索引块,并且不需要维护文件的LRU。设置max_open_files为-1会给你最好的性能。

为了了解索引和过滤块使用的内存,你可以使用RocksDB的GetProperty() API:

```
std::string out;
db->GetProperty("rocksdb.estimate-table-readers-mem", &out);
In
```

在MongoRock,只需要在mongo shell调用这个API:
Expand Down

0 comments on commit 315261b

Please sign in to comment.