在當今大數據時代,時序數據庫的應用越來越廣泛,尤其是在物聯網、工業監控、金融分析等領域。TDengine 作為一款高性能的時序數據庫,憑借獨特的存儲架構和高效的壓縮算法,在存儲和查詢效率上表現出色。然而,隨著數據規模的不斷增長,在保證數據安全性和存儲效率的同時,如何優化 CPU 的資源占用,成為了一個值得深入討論的問題。
本文將探討 TDengine 在數據寫入與查詢場景下的壓縮解壓與加密解密過程中對 CPU 資源的占用情況。通過深入分析 TDengine 的存儲壓縮技術和數據加密功能,我們將評估其在實際應用中的性能表現及對系統資源的影響。希望本篇分析能為 TDengine 用戶提供有價值的參考,幫助大家在實際應用中更好地權衡數據安全、存儲效率與系統性能。
測試環境
系統:Darwin Kernel Version 23.6.0
taosd 版本:
TDengine Enterprise Edition
taosd version: 3.3.5.2.alpha compatible_version: 3.0.0.0
git: 0a42d321120b313019f0ee9b1d7e23599bfd462d
gitOfInternal: ab27dbaf76fa60c57363a3053c9c5b012fafddad
build: macOS-arm64 2025-01-22 15:59:30 +0800
集群:1 dnodes, 1 vgroups, WAL_LEVEL 1
測試準備
建庫時指定加密方式,taosbenchmark 不支持加密建庫。
create database test ENCRYPT_ALGORITHM 'sm4';
insert.json
{"filetype": "insert","cfgdir": "/etc/taos","host": "localhost","port": 6030,"user": "root","password": "taosdata","connection_pool_size": 8,"num_of_records_per_req": 20000,"thread_count": 8,"create_table_thread_count": 10,"result_file": "./insert_res_mix.txt","confirm_parameter_prompt": "no","insert_interval": 0,"continue_if_fail": "yes","databases": [{"dbinfo": {"name": "test","drop": "no","vgroups": 1,"replica": 1,"stt_trigger": 1,"minRows": 100,"WAL_RETENTION_PERIOD": 10,"maxRows": 4096},"super_tables": [{"name": "meters","child_table_exists": "no","auto_create_table":"no","childtable_count": 10000,"insert_rows": 100,"childtable_prefix": "d","insert_mode": "stmt2","insert_interval": 0,"timestamp_step": 900000,"start_timestamp":"2022-09-01 10:00:00","disorder_ratio": 0,"update_ratio": 0,"delete_ratio": 0,"continue_if_fail": "yes","disorder_fill_interval": 0,"update_fill_interval": 0,"generate_row_rule": 0,"columns": [{ "type": "binary","compress":"lz4", "name": "val", "len": 64},{ "type": "binary","compress":"lz4", "name": "order_no", "len": 64},{ "type": "binary","compress":"lz4", "name": "production_no", "len": 64},{ "type": "binary","compress":"lz4", "name": "modal_no", "len": 64}],"tags": [{ "type": "binary", "name": "device_no", "len": 64 ,"values": ["San Francisco", "Los Angles", "San Diego","San Jose", "Palo Alto", "Campbell", "Mountain View","Sunnyvale", "Santa Clara", "Cupertino"] },{ "type": "int", "name": "channel_id", "max": 100, "min": 0},{ "type": "binary", "name": "point_no", "len": 64 ,"values": ["San Francisco", "Los Angles", "San Diego","San Jose", "Palo Alto", "Campbell", "Mountain View","Sunnyvale", "Santa Clara", "Cupertino"]},{ "type": "int", "name": "datatype", "max": 100, "min": 0},{ "type": "int", "name": "business_type", "max": 100, "min": 0},{ "type": "binary", "name": "unit", "len": 16 ,"values": ["San Francisco", "Los Angles", "San Diego","San Jose", "Palo Alto", "Campbell", "Mountain View","Sunnyvale", "Santa Clara", "Cupertino"]}]}]}]
}
測試結果
場景一:sm4 加密 & lz4 壓縮
測試方法:使用 taosBenchmark 對上面的 json 文件進行數據導入,同時對 taosd 使用 perf 采樣,以下是火焰圖信息。
測試結果:
壓縮:LZ4compress:0.76% + 2.84%(table data compress)+0.1%(Stt)
解密:SM4_decrypt:5.87%(MergeFile)+ 1.12%(MergeFile)
加密:SM4_encrypt:59.02%(WAL) + 10.68%(table data) + 6.97%(table data end) + 2.04%(Stt)
結論:加密比壓縮占用更多 CPU 資源,大約達 70%。這是因為壓縮/解壓僅在數據生成時調用,而寫入 WAL、Meta 數據和落盤至 TSDB 的全過程都涉及加密。此外,系統啟動時,讀取仍存于 WAL 中的未落盤數據、首次從 TSDB 讀取的數據,以及首次訪問 Meta 數據時,均需執行解密操作。
場景二:lz4 壓縮解壓縮
測試方法:使用 Benchmark taosc 導入數據,在使用腳本對所有子表做一遍查詢,對查詢過程打火焰圖分析。
for (int i = 0; i < 10000; i++) {sprintf(sql, "select * from d_%d", i);do_query(taos, sql);}
測試結果:
壓縮:compressData:3.33%(table data)+1.01%(table data end)
解壓縮:ColDataDecompress/decompressData:1.31%+0.66%+0.22%+0.18%
結論:加密解密的性能占比不高,大部分耗時在 LRU 緩存切換上,因為查詢次數過多,導致測試不理想。
場景三:增大數據量,減少查詢次數,測 lz4 壓縮解壓縮
測試方法:使用 Benchmark taosc 導入 10000 子表,1000 row 數據,查超級表(只查一次)
select * from meters;
測試結果:
壓縮:4.93%(table data end)+7.3%(table data)+0.44%(table data end)
解壓縮:0.95%+0.51%
結論:測試結果顯示,在正常情況下,壓縮/解壓過程占整個查詢的 CPU 開銷約 15%。由于壓縮/解壓僅在數據生成時調用,并且數據以塊形式進行處理,其效率遠高于加密/解密。
結論
通過分析 TDengine在數據寫入與查詢場景下的壓縮解壓與加密解密過程的 CPU 占用情況,可以看出,加密對數據導入影響較大,占用約 77% 的 CPU 資源。寫入 WAL、Meta 數據及落盤至 TSDB 的全過程均涉及加密,而系統啟動時,讀取仍存于 WAL 中的未落盤數據、首次從 TSDB 讀取的數據以及首次訪問 Meta 數據時,則需要執行解密操作。相比之下,壓縮/解壓對數據導入導出的影響較小,僅占 CPU 資源約 15%。這是因為壓縮/解壓僅在數據生成時調用,并且數據以塊形式處理,其效率遠高于加密/解密。
由此可見,TDengine 不僅顯著提高了存儲效率和數據安全性,還在一定程度上優化了 CPU 的資源占用。尤其是在處理平穩變化的時序數據時,TDengine 的差值編碼和通用壓縮技術表現出了極高的壓縮率,為用戶節約了大量的存儲成本。
然而,隨著數據規模的不斷增長,如何在保證數據安全性和存儲效率的同時,進一步優化 CPU 的資源占用,仍然是一個需要持續關注的問題。未來,隨著硬件性能的提升和算法的不斷優化,我們有理由相信,TDengine 將在時序數據庫領域繼續發揮其優勢,為用戶提供更加高效、安全的數據存儲和查詢解決方案。
希望本文的分析能夠為使用 TDengine 的用戶提供一些有價值的參考,幫助大家在實際應用中更好地平衡數據安全、存儲效率與系統性能。如果您對 TDengine 的壓縮和加密技術有更多的疑問或建議,歡迎在評論區留言討論。
想要了解更多 TDengine 的硬核技術,移步 https://docs.taosdata.com/?utm_source=zimeiti-orther&utm_medium=technology-blog&utm_campaign=2025-01-12