我是否通過在 MongoDB 中使用 zlib 而不是 snappy 壓縮來提高讀取性能?
我目前的儲存引擎是
WiredTiger
,它的壓縮級別是預設的,snappy。我遇到過 MongoDB 文件,有人提到使用 zlib 壓縮效果更好,但需要更多 CPU。我想知道與壓縮數據
zlib
相比,它會在記憶體中儲存更多數據嗎?snappy
我有一台具有 16 個 CPU 核心的伺服器。由於 RAM 更昂貴,我寧願節省記憶體以防它保留更多數據。它是否正確?可以盲目切換到zlib來記憶體更多數據,提高讀取性能嗎?
**注意:**我們的伺服器是讀取密集型的。
https://docs.mongodb.com/manual/core/wiredtiger/#memory-use上的文件說收集數據僅在磁碟上壓縮,因此在記憶體中未壓縮。索引將其前綴壓縮保留在記憶體中,但不是塊級壓縮。
因此,更改壓縮算法不會直接減少保持讀取繁重工作負載高效所需的記憶體量(即確保其工作集保留在 RAM 中),除非您已經記憶體不足,在這種情況下,更好的壓縮可能會有所幫助由於儲存系統受到衝擊,因此減少了 IO,因為作業系統緩衝區和記憶體中的任何數據庫數據都將被壓縮。唯一可以確定的方法是在測試環境中使用您正在考慮的每種選項組合對類似生產數據的實際工作負載進行基準測試。
但是,“除非您已經記憶體不足”在這裡很重要:一旦您處於這種狀態,壓縮可能會做的最好的事情就是將您的性能從非常緩慢提高到非常緩慢。
上述情況的一個例外是任何需要讀取太大而無法放入任何實際記憶體量的數據集的查詢,在這種情況下,您可能會看到顯著的改進:需要讀取查詢所需的所有數據無論如何,來自 IO 子系統,壓縮可能對此有所幫助。我們需要更多地了解您的應用程序的數據和工作負載,以提供有關這是否會對您的情況產生明顯影響的具體提示,即使這樣,唯一可以確定的方法還是再次執行基準測試。
注意:並非所有數據庫都是這種情況。例如,使用 MS SQL Server 的壓縮選項,RAM 中頁面中的數據被壓縮,就像它們在磁碟上一樣。這減少了緩衝池對 RAM 的使用,但每次讀取每頁時都會消耗 CPU 時間。當數據在 RAM 中解壓縮時,解壓縮 CPU 命中只會在從磁碟載入數據時發生,因此不會影響後續讀取,直到該頁面/塊/文件被驅逐,因為它最近沒有被引用。
能不能瞎…
最簡潔的答案是不。
更長的答案是:nnnnnoooooooooooooooooooooooooooooooooooooooooooooooooo
少開玩笑:在生產數據庫和/或應用程序上盲目地做任何事情都是危險的,因此它絕不是推薦的做法。如果您重視您的使用者和您自己的理智,請永遠不要這樣做。無論您多麼信任任何建議的建議來源,都始終首先在開發/測試環境中進行測試。當您進行測試並沒有發現任何不良影響時,您可能會覺得這是在浪費時間,但是在您的職業生涯中的某個時刻,您會非常高興地進行了盡職調查,並讓自己免於生產應用程序中令人討厭和尷尬的事件!如果您不以這種方式進行盡職調查,您可能會遇到計劃外的簡歷更新事件。