Memory

MariaDB 減少每個執行緒的緩衝區 RAM 使用量

  • June 10, 2020

我一直在尋找這個問題的答案,但在任何地方都找不到。

我想減少每個數據庫連接的記憶體使用量。以下是 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_pa​​cket 變數;)

如果有人需要,這裡是檢查這些值的查詢:

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_pa​​cket 值,但我不確定這是否是好主意。

感謝大家的幫助。

引用自:https://serverfault.com/questions/1020632