網(wǎng)站建設(shè)費(fèi)攤銷年限seo獨(dú)立站優(yōu)化
硬件要求
硬件要求如表1所示。
表1 硬件要求
項目 | 說明 |
---|---|
CPU | ?12 * AMD Ryzen 5 5500U with Radeon Graphics |
內(nèi)存 | DDR4 |
磁盤 | HDD |
軟件要求
軟件要求如表2所示。
表2 軟件要求
項目 | 版本 | 說明 | 下載地址 |
---|---|---|---|
CentOS | 7.6 | 操作系統(tǒng)。 | Download |
kernel | 4.14.0 | 內(nèi)核。 | 包含在操作系統(tǒng)鏡像中。 |
GCC | 4.8.5 | 編譯器。 | 默認(rèn)系統(tǒng)已安裝。 |
Python | 2.7.5 | 腳本執(zhí)行工具。 | 默認(rèn)系統(tǒng)已安裝。 |
測試軟件包要求:
測試軟件包要求如下表3所示。
表3 測試軟件包要求
項目 | 版本 | 軟件包說明 | 獲取方法 |
---|---|---|---|
RocksDB | 6.10.2 | 待測試軟件包 | https://github.com/facebook/rocksdb/archive/refs/tags/v6.10.2.tar.gz |
一、編譯工具:db_bench
在安裝rocksdb的時候有一個make命令,執(zhí)行這個命令后就安裝了db_bench工具
驗證工具。
./db_bench --help
測試基準(zhǔn)場景
fillseq(順序?qū)?#xff09;
- 進(jìn)入工具所在目錄。
cd /home/rocksdb-6.10.2
- 執(zhí)行測試命令創(chuàng)建數(shù)據(jù)庫并填充數(shù)據(jù)。
./db_bench --benchmarks="fillseq,stats"
說明:選項--benchmarks的值,也可以由fillrandom替換,fillseq是按順序填充,fillrandom是隨機(jī)填充。
回顯信息中:Entries顯示數(shù)據(jù)量,Compression顯示壓縮類型,Memtablerep顯示內(nèi)存表類型,DB path顯示數(shù)據(jù)庫路徑,fillseq顯示性能數(shù)據(jù),Compaction Stats顯示合并信息。
overwrite(覆蓋寫)
- 進(jìn)入工具所在目錄。
cd /home/rocksdb-6.10.2
- 創(chuàng)建數(shù)據(jù)庫并填充數(shù)據(jù)。
./db_bench --benchmarks="fillseq,stats"
- 在已有數(shù)據(jù)庫的基礎(chǔ)上進(jìn)行覆蓋寫入。
./db_bench --benchmarks="overwrite,stats" --use_existing_db=true
回顯信息中:Entries顯示數(shù)據(jù)量,Compression顯示壓縮類型,Memtablerep顯示內(nèi)存表類型,DB path顯示數(shù)據(jù)庫路徑,overwrite顯示性能數(shù)據(jù),Compaction Stats顯示合并信息。
deleterandom(隨機(jī)刪)
- 進(jìn)入工具所在目錄。
cd /home/rocksdb-6.10.2
- 創(chuàng)建數(shù)據(jù)庫并填充數(shù)據(jù)。
./db_bench --benchmarks="fillseq,stats"
- 在已有數(shù)據(jù)庫的基礎(chǔ)上進(jìn)行隨機(jī)刪除。
./db_bench --benchmarks="deleterandom,stats" --use_existing_db=true \ --use_existing_keys=true
回顯信息中:Entries顯示數(shù)據(jù)量,Compression顯示壓縮類型,Memtablerep顯示內(nèi)存表類型,DB path顯示數(shù)據(jù)庫路徑,deleterandom顯示性能數(shù)據(jù),Compaction Stats顯示合并信息。
readrandom(隨機(jī)讀)
- 進(jìn)入工具所在目錄。
cd /home/rocksdb-6.10.2
- 創(chuàng)建數(shù)據(jù)庫并填充數(shù)據(jù)。
./db_bench --benchmarks="fillseq,stats"
- 在已有數(shù)據(jù)庫的基礎(chǔ)上進(jìn)行隨機(jī)讀取數(shù)據(jù)。
./db_bench --benchmarks="readrandom,stats" --use_existing_db=true \ --use_existing_keys=true
回顯信息中:Entries顯示數(shù)據(jù)量,Compression顯示壓縮類型,Memtablerep顯示內(nèi)存表類型,DB path顯示數(shù)據(jù)庫路徑,readrandom顯示性能數(shù)據(jù)。
readwhilemerging(合并時讀)
- 進(jìn)入工具所在目錄。
cd /home/rocksdb-6.10.2
- 進(jìn)行readwhilemerging基準(zhǔn)場景的性能測試。
./db_bench --benchmarks="readwhilemerging,stats" --merge_operator=put
補(bǔ)充
在使用 RocksDB 中的 db_bench 工具之前,需要確保已經(jīng)成功編譯和安裝了 RocksDB。然后按照以下步驟使用 db_bench 工具:
-
打開終端或命令提示符,并導(dǎo)航到 RocksDB 的安裝目錄。
-
運(yùn)行以下命令啟動 db_bench 工具:
./db_bench
- 可以根據(jù)需要指定一些參數(shù)來配置測試環(huán)境。例如,你可以使用?
-help
?參數(shù)查看可用的選項列表:
./db_bench -help
- 根據(jù)你的需求設(shè)置合適的參數(shù)來運(yùn)行性能測試。這些參數(shù)包括數(shù)據(jù)庫路徑、操作類型、數(shù)據(jù)大小等。例如,下面是一個示例命令,執(zhí)行寫入 1000 條記錄并進(jìn)行讀取測試:
./db_bench --benchmarks=fillrandom,readrandom --num=1000
- 運(yùn)行命令后,會顯示性能測試的結(jié)果和統(tǒng)計信息,如吞吐量、延遲等。
請注意,在實際使用時可能還需要進(jìn)一步配置和調(diào)整參數(shù)來滿足特定場景的需求。建議查閱 RocksDB 的文檔或官方資源以獲得更詳細(xì)的信息和使用指南。
補(bǔ)充2. 基本性能壓測
由于db_bench工具的選項太多了,這里直接提取社區(qū)的測試方式
核心是benchmark,它代表本次測試使用的壓測方式,benchmark的列表如下
fillseq -- write N values in sequential key order in async mode
fillseqdeterministic -- write N values in the specified key order and keep the shape of the LSM tree
fillrandom -- write N values in random key order in async mode
filluniquerandomdeterministic -- write N values in a random key order and keep the shape of the LSM tree
overwrite -- overwrite N values in random key order in async mode
fillsync -- write N/100 values in random key order in sync mode
fill100K -- write N/1000 100K values in random order in async mode
deleteseq -- delete N keys in sequential order
deleterandom -- delete N keys in random order
readseq -- read N times sequentially
readtocache -- 1 thread reading database sequentially
readreverse -- read N times in reverse order
readrandom -- read N times in random order
readmissing -- read N missing keys in random order
readwhilewriting -- 1 writer, N threads doing random reads
readwhilemerging -- 1 merger, N threads doing random reads
readrandomwriterandom -- N threads doing random-read, random-write
prefixscanrandom -- prefix scan N times in random order
updaterandom -- N threads doing read-modify-write for random keys
appendrandom -- N threads doing read-modify-write with growing values
mergerandom -- same as updaterandom/appendrandom using merge operator. Must be used with merge_operator
readrandommergerandom -- perform N random read-or-merge operations. Must be used with merge_operator
newiterator -- repeated iterator creation
seekrandom -- N random seeks, call Next seek_nexts times per seek
seekrandomwhilewriting -- seekrandom and 1 thread doing overwrite
seekrandomwhilemerging -- seekrandom and 1 thread doing merge
crc32c -- repeated crc32c of 4K of data
xxhash -- repeated xxHash of 4K of data
acquireload -- load N*1000 times
fillseekseq -- write N values in sequential key, then read them by seeking to each key
randomtransaction -- execute N random transactions and verify correctness
randomreplacekeys -- randomly replaces N keys by deleting the old version and putting the new version
timeseries -- 1 writer generates time series data and multiple readers doing random reads on id
???????創(chuàng)建一個db,并寫入一些數(shù)據(jù)?./db_bench --benchmarks="fillseq"
但是這樣并不會打印更多有效的元信息??????????????
DB path: [/tmp/rocksdbtest-1001/dbbench]
fillseq : 2.354 micros/op 424867 ops/sec; 47.0 MB/s
創(chuàng)建一個db,并打印一些元信息./db_bench --benchmarks="fillseq,stats"
--benchmarks表示測試的順序,支持持續(xù)疊加。本次就是順序?qū)懼蟠蛴b的狀態(tài)信息。
這樣會打印db相關(guān)的stats信息,包括db的stat信息和compaction的stat信息
?
DB path: [/tmp/rocksdbtest-1001/dbbench]
# 測試順序?qū)懙男阅苄畔?fillseq : 2.311 micros/op 432751 ops/sec; 47.9 MB/s** Compaction Stats [default] **
Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------L0 1/0 28.88 MB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 60.6 0.48 0.31 1 0.477 0 0Sum 1/0 28.88 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 60.6 0.48 0.31 1 0.477 0 0Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 60.6 0.48 0.31 1 0.477 0 0** Compaction Stats [default] **
Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
High 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.6 0.48 0.31 1 0.477 0 0
Uptime(secs): 2.3 total, 2.3 interval
Flush(GB): cumulative 0.028, interval 0.028
AddFile(GB): cumulative 0.000, interval 0.000
AddFile(Total Files): cumulative 0, interval 0
AddFile(L0 Files): cumulative 0, interval 0
AddFile(Keys): cumulative 0, interval 0
Cumulative compaction: 0.03 GB write, 12.34 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.5 seconds
Interval compaction: 0.03 GB write, 12.50 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.5 seconds
Stalls(count): 0 level0_slowdown, 0 level0_slowdown_with_compaction, 0 level0_numfiles, 0 level0_numfiles_with_compaction, 0 stop for pending_compaction_bytes, 0 slowdown for pending_compaction_bytes, 0 memtable_compaction, 0 memtable_slowdown, interval 0 total count** File Read Latency Histogram By Level [default] **** DB Stats **
Uptime(secs): 2.3 total, 2.3 interval
Cumulative writes: 1000K writes, 1000K keys, 1000K commit groups, 1.0 writes per commit group, ingest: 0.12 GB, 53.39 MB/s
Cumulative WAL: 1000K writes, 0 syncs, 1000000.00 writes per sync, written: 0.12 GB, 53.39 MB/s
Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent
Interval writes: 1000K writes, 1000K keys, 1000K commit groups, 1.0 writes per commit group, ingest: 124.93 MB, 54.06 MB/s
Interval WAL: 1000K writes, 0 syncs, 1000000.00 writes per sync, written: 0.12 MB, 54.06 MB/s
Interval stall: 00:00:0.000 H:M:S, 0.0 percent
更多的meta operation操作如下
compact 對整個數(shù)據(jù)庫進(jìn)行合并
stats 打印db的狀態(tài)信息
resetstats 重置db的狀態(tài)信息
levelstats 打印每一層的文件個數(shù)以及每一層的占用的空間大小
sstables 打印sst文件的信息
對應(yīng)的sstables和levelstats顯示信息如下
--- level 0 --- version# 2 ---7:30286882[1 .. 448148]['00000000000000003030303030303030' \seq:1, type:1 .. '000000000006D6933030303030303030' seq:448148, type:1](0)
--- level 1 --- version# 2 ---
--- level 2 --- version# 2 ---
--- level 3 --- version# 2 ---
--- level 4 --- version# 2 ---
--- level 5 --- version# 2 ---
--- level 6 --- version# 2 ---Level Files Size(MB)
--------------------0 1 291 0 02 0 03 0 04 0 05 0 06 0 0
單獨(dú)隨機(jī)寫測試相關(guān)的參數(shù)可以自己配置,這里僅僅列出一部分參數(shù)可以通過?./db_bench --help
自己查看想要的配置參數(shù),當(dāng)然配置前需要對各個參數(shù)有一定的了解。
./db_bench \
--benchmarks="fillrandom,stats,levelstats" \
--enable_write_thread_adaptive_yield=false \
--disable_auto_compactions=false \
--max_background_compactions=32 \
--max_background_flushes=4 \
--write_buffer_size=536870912 \
--min_write_buffer_number_to_merge=2 \
--max_write_buffer_number=6 \
--target_file_size_base=67108864 \
--max_bytes_for_level_base=536870912 \
--compression_type=none \ #關(guān)閉壓縮
--num=500000000 \ #總共寫入的請求個數(shù),如果達(dá)不到則寫30秒就停止
--duration=30 \ #持續(xù)IO的時間是30秒
--threads=1000\ #并發(fā)1000個線程
--value_size=8192\ #value size是8K
--key_size=16 \ #key size 16B
--enable_pipelined_write=true \
--db=./db_bench_test \ #指定創(chuàng)建db的目錄
--wal_dir=./db_bench_test \ #指定創(chuàng)建wal的目錄
--allow_concurrent_memtable_write=true \ #允許并發(fā)寫memtable
--disable_wal=false \
--batch_size=1 \
--sync=false \ #是否開啟sync
在這個workload下,每一次benchmark db_bench都會重新創(chuàng)建db,可能是遺留原因。而有的時候,我們想要在原有db之前追加一定條目的請求,并不希望之前的db被清理掉。可以這樣簡單更改一下db_bench的代碼:我們使用fillrandom workload的時候,搭配use_existing_db=1 默認(rèn)會退出
這個時候我們只需要將,fillrandom workload下的fresh_db 更改為false就可以繼續(xù)測試了,每一次fillrandom都會在之前的基礎(chǔ)上增加條目,而不會destory之前的db。
???????
隨機(jī)讀
使用之前fillrandom創(chuàng)建的db,進(jìn)行隨機(jī)讀取,需要開啟use_existing_keys=1
和use_existing_db=1
,否則都會是not-found,被bloom-filter過濾,不會命中之前寫入的數(shù)據(jù)。
./db_bench \
--benchmarks="fillseq,stats,readrandom,stats"
--enable_write_thread_adaptive_yield=false \
--disable_auto_compactions=false \
--max_background_compactions=32 \
--max_background_flushes=4 \
--write_buffer_size=536870912 \
--min_write_buffer_number_to_merge=2 \
--max_write_buffer_number=6 \
--target_file_size_base=67108864 \
--max_bytes_for_level_base=536870912 \
--use_existing_keys=1 \ #建議使用已存在key進(jìn)行讀,否則就一直被filter過濾掉,打不到磁盤,測試不精確
--use_existing_db=1 \
--cache_size=2147483648 \ #2G的block-cache,默認(rèn)是8M,實際生產(chǎn)環(huán)境,如果read-heavy應(yīng)該設(shè)置為內(nèi)存大小的三分之一。
--num=500000000 \ #總共寫入的請求個數(shù),如果達(dá)不到則寫30秒就停止
--duration=30 \ #持續(xù)IO的時間是30秒
--threads=1000 \ #并發(fā)1000個線程
--value_size=8192 \ #value size是8K
--key_size=16 \ #key size 16B
--enable_pipelined_write=true \
--db=./db_bench_test \ #指定創(chuàng)建db的目錄
--wal_dir=./db_bench_test \ #指定創(chuàng)建wal的目錄
--allow_concurrent_memtable_write=true \ #允許并發(fā)寫memtable
--disable_wal=false \
-
如果要測試熱點讀,可以指定參數(shù)
--key_id_range=100000
,表示生成的key的范圍是在100000范圍內(nèi),該測試需要在benchmark中增加timeseries
-
讀寫混合readwhilewriting
9個線程讀,一個線程寫
./db_bench \
--benchmarks="readwhilewriting,stats"
--enable_write_thread_adaptive_yield=false \
--disable_auto_compactions=false \
--max_background_compactions=32 \
--max_background_flushes=4 \
--write_buffer_size=536870912 \
--min_write_buffer_number_to_merge=2 \
--max_write_buffer_number=6 \
--target_file_size_base=67108864 \
--max_bytes_for_level_base=536870912 \
--use_existing_keys=1 \ #建議使用已存在key進(jìn)行讀,否則就一直被filter過濾掉,打不到磁盤,測試不精確
--use_existing_db=1 \
--cache_size=2147483648 \ #2G的block-cache,默認(rèn)是8M,實際生產(chǎn)環(huán)境,如果read-heavy應(yīng)該設(shè)置為內(nèi)存大小的三分之一。
--num=500000000 \ #總共寫入的請求個數(shù),如果達(dá)不到則寫30秒就停止
--duration=30 \ #持續(xù)IO的時間是30秒
--threads=1000\ #并發(fā)1000個線程
--value_size=8192\ #value size是8K
--key_size=16 \ #key size 16B
--enable_pipelined_write=true \
--db=./db_bench_test \ #指定創(chuàng)建db的目錄
--wal_dir=./db_bench_test \ #指定創(chuàng)建wal的目錄
--allow_concurrent_memtable_write=true \ #允許并發(fā)寫memtable
--disable_wal=false \
隨機(jī)讀隨機(jī)寫 ReadRandomWriteRandom隨機(jī)讀一個請求,隨機(jī)寫一個請求,可以指定讀寫比,readwritepercent;默認(rèn)是90%的讀,可以降低讀的比例需要注意開啟--use_existing_keys=1
?和?--use_existing_db=1
./db_bench \
--benchmarks="readrandomwriterandom,stats"
--enable_write_thread_adaptive_yield=false \
--disable_auto_compactions=false \
--max_background_compactions=32 \
--max_background_flushes=4 \
--write_buffer_size=536870912 \
--min_write_buffer_number_to_merge=2 \
--max_write_buffer_number=6 \
--target_file_size_base=67108864 \
--max_bytes_for_level_base=536870912 \
--use_existing_keys=1 \ #建議使用已存在key進(jìn)行讀,否則就一直被filter過濾掉,打不到磁盤,測試不精確
--use_existing_db=1 \ #建議打開,使用已經(jīng)存在的db
--cache_size=2147483648 \ #2G的block-cache,默認(rèn)是8M,實際生產(chǎn)環(huán)境,如果read-heavy應(yīng)該設(shè)置為內(nèi)存大小的三分之一。
--readwritepercent=50 \ #指定讀寫比 1:1,一次隨機(jī)讀,對應(yīng)一次隨機(jī)寫
--num=500000000 \ #總共寫入的請求個數(shù),如果達(dá)不到則寫30秒就停止
--duration=30 \ #持續(xù)IO的時間是30秒
--threads=1000\ #并發(fā)1000個線程
--value_size=8192\ #value size是8K
--key_size=16 \ #key size 16B
--enable_pipelined_write=true \
--db=./db_bench_test \ #指定創(chuàng)建db的目錄
--wal_dir=./db_bench_test \ #指定創(chuàng)建wal的目錄
--allow_concurrent_memtable_write=true \ #允許并發(fā)寫memtable
--disable_wal=false \
3. 便捷Benchmark.sh 自動匹配workload
ps: 需要注意的是benchmark.sh 中很多參數(shù)并不是默認(rèn)的,而是官方給的一些適配當(dāng)前benchmark workload 的系列優(yōu)化之后的參數(shù),所以如果大家想要測試自己的option,這個方法并不推薦,還是使用上面的db_bench方式來測試。
因為db_bench選項太多,而測試緯度很難做到統(tǒng)一(可能一個memtable大小的配置都會導(dǎo)致測試出來的寫性能相關(guān)的的數(shù)據(jù)差異很大),所以官方給出了一個benchmark.sh腳本用來對各個workload進(jìn)行測試。
該腳本能夠?qū)b_bench測試結(jié)果中的stats信息進(jìn)行統(tǒng)計匯總打印(qps,),更放方便查看。
這個測試需要將編譯好的db_bench二進(jìn)制文件和./tools/benchmark.sh放到同一個目錄下即可,測試項可以參考官方給出的workload,Performance Benchmarks
隨機(jī)插入 bulkload,制造好數(shù)據(jù)集
這里的隨機(jī)插入是指單純的隨機(jī)寫,且禁掉自動compaction,將當(dāng)前請求插入完成之后會再進(jìn)行手動compaction
NUM_KEYS=900000000 NUM_THREADS=32 CACHE_SIZE=6442450944 benchmark.sh bulkload
總體來說這個隨機(jī)插入結(jié)果相比于默認(rèn)配置是偏高的,benchmark.sh中的腳本對memtable相關(guān)的配置如下:
很明顯性能肯定好于默認(rèn)配置,好處是官方有一個在指定硬件之下的workload測試結(jié)果,可以進(jìn)行對比參考。
隨機(jī)寫,覆蓋寫
在上一次已有的數(shù)據(jù)基礎(chǔ)上進(jìn)行測試,會覆蓋寫9億條key
NUM_KEYS=900000000 NUM_THREADS=32 CACHE_SIZE=6442450944 DURATION=5400 benchmark.sh overwrite
讀時寫,9個線程讀,一個線程寫
這里的讀是從已經(jīng)存在的key中進(jìn)行讀
NUM_KEYS=900000000 NUM_THREADS=32 CACHE_SIZE=6442450944 DURATION=5400 benchmark.sh readwhilewriting
隨機(jī)讀
NUM_KEYS=900000000 NUM_THREADS=32 CACHE_SIZE=6442450944 DURATION=5400 benchmark.sh readrandom
4. 上限的benchmark及參數(shù)
歡迎大家補(bǔ)充各自的上限 workload 。
4.1 隨機(jī)寫
單進(jìn)程 32個線程,32個db,各自的寫吞吐會以秒計形態(tài)輸出到一個report.csv。這里線程數(shù) 和 db數(shù)可以根據(jù)自己環(huán)境的cpu核心情況而定,基本不用擔(dān)心write-stall問題。
./db_bench \--benchmarks=fillrandom,stats \--readwritepercent=90 \--num=3000000000 \--threads=32 \--db=./db \--wal_dir=./db \--duration=3600 \-report_interval_seconds=1 \--key_size=16 \--value_size=128 \--max_write_buffer_number=16 \-max_background_compactions=32 \-max_background_flushes=16 \-subcompactions=8 \-num_multi_db=32 \-compression_type=none
如果想要支持 direct_io 寫,可以打開
--use_direct_io_for_flush_and_compaction=true,這個配置是在寫sst時 也就是flush & compaction 生效。
如果想要測試 mmap 寫,則可以打開
--mmap_write=true
4.2 完全隨機(jī)讀
隨機(jī)讀想要命中所有的key,需要打開 use_existing_db=1 和 use_existing_keys=1。
需要注意的是 use_existing_keys 開啟之后不能直接讀多db,只能讀單個db,因為它會在真正執(zhí)行讀workload 之前從這一個db內(nèi)scan 所有的key 到一個數(shù)組中,同時 配置的 --num 選項是失效的,這里會填充掃描上來的key的個數(shù)。
使用這個配置之后 worklaod 不會立即啟動,會卡一會掃描完所有的key之后才真正開始隨機(jī)讀(讀的過程是生成隨機(jī)下標(biāo)來進(jìn)行訪問)
這個測試是使用默認(rèn)大小的block_cache (8MB),以及 開啟bloom filter,因為我們是use_existing_keys,那bloom filter基本沒什么用。
$DB_BENCH \--benchmarks=readrandom,stats \--num=3000000000 \--threads=40 \--db=./db \--wal_dir=./db \--duration="$DURATION" \--statistics \-report_interval_seconds=1 \--key_size=16 \--value_size=128 \-use_existing_db=1 \-use_existing_keys=1 \-compression_type=none \
想要測試 direct 讀,添加-use_direct_reads=true,那么讀就不會用os pagecache了,這里可以搭配-cache_size=1073741824 以及其他block_cache的配置進(jìn)行測試,來看rocksdb的block_cache 相比于os pagecache的收益。
想要測試 mmap 讀,添加-mmap_read=true 即可。
4.3 熱點讀
這里基本是使用之前的配置,主要是增加一個數(shù)據(jù)傾斜的配置?read_random_exp_range
,它會用來產(chǎn)生傾斜的隨機(jī)下標(biāo)。
這個值越大,下標(biāo)的傾斜越嚴(yán)重(可以理解為key-range 越小)。
$DB_BENCH \--benchmarks=readrandom,stats \--num=3000000000 \--threads=40 \--db=./db \--wal_dir=./db \--duration="$DURATION" \--statistics \-report_interval_seconds=1 \--key_size=16 \--value_size=128 \-use_existing_db=1 \-use_existing_keys=1 \-compression_type=none \-read_random_exp_range=0.8 \
以上所有的workload 最后的結(jié)果
可以通過?tail -f report.csv
?查看 吞吐
secs_elapsed,interval_qps
1,3236083
2,2877314
3,2645623
4,2581939
5,2655481
6,2038635
7,2226018
8,2366941
...
后面可以通過python 繪圖腳本系列簡單記錄進(jìn)行曲線繪圖。
二、rocksdb ldb工具使用
語法格式:
ldb --db=<full_path_to_db_directory> <command>
語法說明:
- 必須指定數(shù)據(jù)庫的路徑--db=<full_path_to_db_directory>
- 根據(jù)需要,選擇需要執(zhí)行的command
????????????????????????????????????????????????表1 ldb支持的command及其說明
命令 | 說明 |
---|---|
put <key> <value> [--ttl] | 寫入數(shù)據(jù)到數(shù)據(jù)庫。 |
get <key> [--ttl] | 從內(nèi)存memtable或磁盤中的sst文件中讀取指定的key對應(yīng)的值。 |
batchput <key> <value> [<key> <value>] [..] [--ttl] | 將數(shù)據(jù)批量寫入數(shù)據(jù)庫。 |
scan [--from] [--to] [--ttl] [--timestamp] [--max_keys=<N>q] [--start_time=<N>:- is inclusive] [--end_time=<N>:- is exclusive] [--no_value] | 掃描數(shù)據(jù)庫中數(shù)據(jù),也可以添加條件,指定掃描數(shù)據(jù)的范圍,如key值范圍、生命周期的時間等。 |
delete <key> | 刪除指定key的數(shù)據(jù)。 |
deleterange <begin key> <end key> | 刪除指定范圍內(nèi)的所有鍵值對。其中,<begin key>和<end key>分別表示要刪除的鍵值對的起始鍵和結(jié)束鍵。 |
query [--ttl] | 執(zhí)行query命令,之后會開始一個EEPL shell,鍵入help,之后會顯示出可用命令的列表,根據(jù)列表顯示執(zhí)行命令。 |
approxsize [--from] [--to] | 該命令用于查詢數(shù)據(jù)在磁盤上所占空間。由key值范圍指定要查詢的數(shù)據(jù)。 |
checkconsistency | 該命令功能為一致性檢測,檢查文件系統(tǒng)中是否包含所有在生命周期內(nèi)的文件,以及它們的文件大小與內(nèi)存記錄匹配。 |
list_file_range_deletes [--max_keys=<N>] | 打印出在sst文件中要刪除范圍的最大值。 |
管理員命令:
????????????????????????????????????????????????????????表1 管理員命令及其說明
命令 | 說明 |
---|---|
dump_wal --walfile=<write_ahead_log_file_path> [--header] [--print_value] [--write_committed=true|false] | 轉(zhuǎn)儲wal文件。 |
compact [--from] [--to] | compact操作范圍設(shè)定,from參數(shù)和to參數(shù)的取值是數(shù)據(jù)庫中已存在的key值。 |
reduce_levels --new_levels=<New number of levels> [--print_old_levels] | 還原指定level。 |
change_compaction_style --old_compaction_style=<Old compaction style: 0 for level compaction, 1 for universal compaction> --new_compaction_style=<New compaction style: 0 for level compaction, 1 for universal compaction> | 該命令是轉(zhuǎn)換設(shè)定對應(yīng)level層的compation的類型,參數(shù)由0和1兩個數(shù)字代替兩種compaction類型,分別是level compaction和universal compaction。 |
dump [--from] [--to] [--ttl] [--max_keys=<N>] [--timestamp] [--count_only] [--count_delim=<char>] [--stats] [--bucket=<N>] [--start_time=<N>:- is inclusive] [--end_time=<N>:- is exclusive] [--path=<path_to_a_file>] | 該命令用于查詢數(shù)據(jù)庫中已存在的key/value類型的數(shù)據(jù),將存儲文件中的特殊存儲格式的數(shù)據(jù),轉(zhuǎn)換成可以直接讀取識別的數(shù)據(jù)并回顯出來并帶有各類控制參數(shù)。
|
load [--create_if_missing] [--disable_wal] [--bulk_load] [--compact] | 該命令用于加載數(shù)據(jù)庫,加載的方式有參數(shù)所示的幾種方式。 |
manifest_dump [--verbose] [--json] [--path=<path_to_manifest_file>] | 該命令用于manifest文件的轉(zhuǎn)儲。 |
file_checksum_dump [--path=<path_to_manifest_file>] | 該命令是對數(shù)據(jù)庫中sst文件進(jìn)行校驗和驗證,并打印出每個sst文件的校驗信息。 |
list_column_families | 列出指定的數(shù)據(jù)庫中存在的所有列族。 |
create_column_family --db=<db_path> <new_column_family_name> | 在指定的數(shù)據(jù)庫中添加新的列族。 |
drop_column_family --db=<db_path> <column_family_name_to_drop> | 在指定的數(shù)據(jù)庫中刪除要求的列族。 |
dump_live_files | 轉(zhuǎn)儲在生命周期內(nèi)的文件。 |
idump [--from] [--to] [--input_key_hex] [--max_keys=<N>] [--count_only] [--count_delim=<char>] [--stats] | 該命令也是查詢數(shù)據(jù)庫中的數(shù)據(jù)與上述的dump命令類似。但是回顯的信息key/value數(shù)據(jù)更加詳細(xì),例如回顯信息中增加了每個數(shù)據(jù)寫入數(shù)據(jù)庫中的實際先后次序信息。 |
repair | 該命令是恢復(fù)最進(jìn)刪除的日志文件,例如MANIFEST文件和log文件。將恢復(fù)的日志文件放入數(shù)據(jù)庫中的新生成的lost目錄中。 |
backup [--backup_env_uri] [--backup_dir] [--num_threads] [--stderr_log_level=<int (InfoLogLevel)>] | 數(shù)據(jù)庫備份。 |
restore [--backup_env_uri] [--backup_dir] [--num_threads] [--stderr_log_level=<int (InfoLogLevel)>] | 數(shù)據(jù)庫恢復(fù)。 |
checkpoint [--checkpoint_dir] | 設(shè)置檢查點。 |
write_extern_sst <output_sst_path> | 把數(shù)據(jù)寫入指定位置的sst文件。 |
ingest_extern_sst <input_sst_path> [--move_files] [--snapshot_consistency] [--allow_global_seqno] [--allow_blocking_flush] [--ingest_behind] [--write_global_seqno] | 導(dǎo)入外部sst文件。 |
字符串輸入/輸出格式參數(shù)
如表1所示可選參數(shù)控制keys/values是作為十六進(jìn)制還是普通字符串輸入/輸出。
表1 字符串輸入/輸出格式參數(shù)及其說明
參數(shù) | 說明 |
---|---|
--key_hex | keys以十六進(jìn)制輸入/輸出。 |
--value_hex | values以十六進(jìn)制形式輸入/輸出。 |
--hex | keys和values都以十六進(jìn)制輸入/輸出。 |
數(shù)據(jù)庫內(nèi)部控制參數(shù)
如表1所示可選參數(shù)控制數(shù)據(jù)庫內(nèi)部。
????????????????????????????????????????????????表1 數(shù)據(jù)庫內(nèi)部控制參數(shù)及其說明
參數(shù) | 說明 |
---|---|
--column_family=<string> | 該參數(shù)是指在列式數(shù)據(jù)庫中,用于指定數(shù)據(jù)表中的列族。 default:默認(rèn)列族(即默認(rèn)表)。 --column_family=default |
--ttl with 'put','get','scan','dump','query','batchput' | TTL是一種機(jī)制,用于在一定時間后自動刪除數(shù)據(jù),以避免數(shù)據(jù)過期或占用存儲空間。 |
--try_load_options | 讀取數(shù)據(jù)庫的配置文件并打開數(shù)據(jù)庫。 |
--disable_consistency_checks | 用于禁用一致性校驗。 默認(rèn)值為true。 |
--ignore_unknown_options | 是否啟用加載選項文件時忽略未知選項。 |
--bloom_bits=<int,e.g.:14> | 每個key對應(yīng)的bloom過濾器位數(shù),RocksDB若啟用bloom過濾器請設(shè)置該值(例如14,默認(rèn)值為-1),若不啟用bloom過濾器請設(shè)置為0。 |
--fix_prefix_len=<int,e.g.:14> | 設(shè)置前綴bloom篩選器中的固定長度前綴的值,值為整型。 |
--compression_type=<no|snappy|zlib|bzip2|lz4|lz4hc|xpress|zstd> | 該參數(shù)用于指定壓縮類型。RocksDB默認(rèn)的壓縮方式是snappy。并且其各層之間的壓縮方法無需一致。 |
--compression_max_dict_bytes=<int,e.g.:16384> | 配置啟動壓縮庫的字典上限,即達(dá)到字典上限后會啟動壓縮庫。 |
--block_size=<block_size_in_bytes> | 用于設(shè)置塊大小。 塊大小通常為4KB。由于更小的塊大小會削減解壓縮時的開銷,塊大小越小,隨機(jī)讀速度越快。但過小的塊大小會導(dǎo)致壓縮失效,因此推薦設(shè)置為1KB。 |
--auto_compaction=<true|false> | 用于指定是否啟用RocksDB的auto compaction功能。 |
--db_write_buffer_size=<int,e.g.:16777216> | 設(shè)置所有column family的memtable的大小限制。 |
--write_buffer_size=<int,e.g.:4194304> | 設(shè)置每個column family的memtable的大小。 默認(rèn)值為64MB。 |
--file_size=<int,e.g.:2097152> | 設(shè)置level層的sst文件大小,即設(shè)置配置選項options.target_file_size_base的值。RocksDB使用sst文件分層(level 0層到level N層)管理數(shù)據(jù),level層sst文件的總和大小 = sst文件大小 * sst文件的個數(shù)。 |
例子:
put和batchput命令
前提條件
執(zhí)行下列的各個命令之前,需要新建一個目標(biāo)數(shù)據(jù)庫或已存在數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫詳情可參考步驟2。
操作步驟
- 進(jìn)入目錄“/home”。
cd /home
- 創(chuàng)建數(shù)據(jù)庫存儲目錄。
mkdir –p /home/rocksdb/rkdb
- 使用ldb命令,創(chuàng)建數(shù)據(jù)庫并使用put命令寫入第一個數(shù)據(jù)。
ldb --db=/home/rocksdb/rkdb --create_if_missing put k1 v1
說明
如果ldb工具的操作的目標(biāo)數(shù)據(jù)庫不存在,出現(xiàn)“does not exist”報錯提示,可以添加“--create_if_missing”參數(shù),創(chuàng)建新的目標(biāo)數(shù)據(jù)庫。
- 使用ldb工具執(zhí)行put命令添加數(shù)據(jù)。
ldb --db=/home/rocksdb/rkdb put k2 v2
- 使用ldb命令執(zhí)行batchput命令,批量寫入數(shù)據(jù)。
ldb --db=/home/rocksdb/rkdb batchput k3 v3 k4 v4 k5 555 kstring abcd
- 使用scan命令,查看寫入數(shù)據(jù)庫中的數(shù)據(jù)。
ldb --db=/home/rocksdb/rkdb scan
get和scan命令
前提條件
執(zhí)行下列的各個命令之前,需要新建一個目標(biāo)數(shù)據(jù)庫或已存在數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫詳情可參考步驟2。
操作步驟
- 進(jìn)入“/home”目錄。
cd /home
- 使用ldb工具執(zhí)行get命令,查看指定key的values。
ldb --db=/home/rocksdb/rkdb get k5
ldb --db=/home/rocksdb/rkdb get k3
- 使用ldb工具執(zhí)行scan命令,掃描數(shù)據(jù)庫中的所有數(shù)據(jù)。
說明
下述命令是scan命令的最簡形式,但數(shù)據(jù)庫的數(shù)據(jù)量較大時,掃描所有數(shù)據(jù)并回顯出來不合適,可以控制掃描數(shù)據(jù)的key值范圍,有指向地掃描數(shù)據(jù)??刂茀?shù)參考ldb支持的command的scan命令說明。
ldb --db=/home/rocksdb/rkdb scan
delete和deleterange命令
前提條件
執(zhí)行下列的各個命令之前,需要新建一個目標(biāo)數(shù)據(jù)庫或已存在數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫詳情可參考步驟2。
操作步驟
- 進(jìn)入“/home”目錄。
cd /home
- 使用scan命令,查看數(shù)據(jù)庫現(xiàn)有數(shù)據(jù)。
ldb --db=/home/rocksdb/rkdb scan
?
- 使用ldb工具執(zhí)行delete命令,刪除指定key的values。
ldb --db=/home/rocksdb/rkdb delete k5
?
- 執(zhí)行get命令,查看k5的values。
ldb --db=/home/rocksdb/rkdb get k5
?
- 使用ldb工具執(zhí)行deleterange命令,刪除指定范圍中key的values。
ldb --db=/home/rocksdb/rkdb deleterange k2 k4
?
- 查看范圍刪除后的結(jié)果。
ldb --db=/home/rocksdb/rkdb scan
?
三、驗證sst_dump的參數(shù)
前提條件
執(zhí)行下列的各個命令之前,需要新建一個目標(biāo)數(shù)據(jù)庫或已存在數(shù)據(jù)庫。以下操作默認(rèn)數(shù)據(jù)庫已存在。
操作步驟
-
進(jìn)入目錄“/home”。
cd /home
- 打印sst文件的屬性。
sst_dump --file=/home/rocksdb/rkdb/000004.sst --show_properties