MariaDB 減少每個執行緒的緩衝區 RAM 使用量
我一直在尋找這個問題的答案,但在任何地方都找不到。
我想減少每個數據庫連接的記憶體使用量。以下是 mysql Tuner 目前所說的關於我的一個數據庫的記憶體使用情況:
[--] Physical Memory : 985.2M [--] Max MySQL memory : 950.4M [--] Other process memory: 0B [--] Total buffers: 292.0M global + 18.8M per thread (35 max threads) [--] P_S Max memory usage: 0B [--] Galera GCache Max memory usage: 0B [OK] Maximum reached memory usage: 310.8M (31.55% of installed RAM) [!!] Maximum possible memory usage: 950.4M (96.47% of installed RAM)
您可以看到每個執行緒的記憶體使用量非常高18.8M。這是我的其他伺服器之一的輸出:
[--] Total buffers: 400.0M global + 2.8M per thread (250 max threads)
您可以看到這裡的記憶體使用量要低很多(只有 2.8M),因此我可以與數據庫建立更多連接。
我試圖找出哪個變數控制每個執行緒的記憶體使用量,但找不到任何東西。我認為它與 sort_buffer_size 或 read_buffer_size 有關,但是當我更改其中一個變數時,每個執行緒的使用率似乎並沒有下降。
在我看來,這根本不是我可以修改的東西,可能是根據每個執行緒的實際記憶體使用情況計算的?
我能做些什麼來減少每個執行緒的緩衝記憶體使用量嗎?
編輯(2020-06-10):這兩個數據庫的區別在於第一個是 MariaDB 10.4.12 版本,而第二個是 MariaDB 10.1.38。如果我比較評論中提到的 sort_buffer_size、read_buffer_size、key_buffer_size 等變數,我所看到的只是它們被設置為相同的值。
好的,所以經過更多調查後,我終於弄清楚了為什麼這兩個數字如此不同。
問題是我在伺服器上使用的是舊版本的 mysqltuner.pl,每個執行緒的最大記憶體使用量僅為 2.8 MB。6 個月前,mysqltuner.pl 也開始在每個執行緒的使用量計算中使用max_allowed_pa cket變數值,這增加了 16 MB,達到 18.8 MB。這是github上的更改:https ://github.com/major/MySQLTuner-perl/commit/c5765f02133259b40d9932eb7d35ba5c1665bad9 執行更新版本的mysqltuner.pl後,RAM使用情況如下所示:
[--] Total buffers: 400.0M global + 18.8M per thread (250 max threads)
這些是用於計算每個執行緒的緩衝區使用量的變數(對於相對較新的 MariaDB 版本):
read_buffer_size, read_rnd_buffer_size, sort_buffer_size, thread_stack, max_allowed_packet, join_buffer_size
只有@Wilson Hauck 提到了 max_allowed_packet 變數;)
如果有人需要,這裡是檢查這些值的查詢:
SHOW GLOBAL VARIABLES WHERE variable_name IN('read_buffer_size', 'read_rnd_buffer_size', 'sort_buffer_size', 'thread_stack', 'max_allowed_packet', 'join_buffer_size');
因此,經過所有這些研究,我發現第二台伺服器(250)上允許的數據庫連接數量太多了。如果總共使用,我的數據庫可以使用 5GB 的 RAM,而我在這個系統上只有 2GB。
最初問題的實際答案: 因此,如果我想降低每個執行緒或每個連接的記憶體使用量(正如你們中的一些人提到的那樣),我可能不得不降低 max_allowed_packet 值,但我不確定這是否是好主意。
感謝大家的幫助。