Mysql

MySQL 使用所有 RAM

  • April 6, 2022

我正在嘗試在具有 1GB RAM 和 MySQL 5.7.21 的 Ubuntu 16.04 VM 上恢復大約 750 MB 的 SQL 轉儲文件。

我已配置innodb_buffer_pool_size = 768MB,innodb_buffer_pool_chunk_size = 128Minnodb_buffer_pool_instances = 1.

為了停止從 OOM-killer 殺死OOMScoreAdjust=-1000被添加到mysql.sqevice文件中。

開始恢復時,mysqld 使用了所有記憶體。

root@IA6-OA-DB-01:~# free -m
             total        used        free      shared  buff/cache   available
Mem:            987         925          11           0          50          19
Swap:           632         621          11

它開始殺死所有程序。

root@IA6-OA-DB-01:~# mysql -uroot -proot -D OA2017 < OA2017.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
Killed

系統日誌

Apr 14 13:13:35 IA6-OA-DB-01 kernel: [84990.058935] Out of memory: Kill process 24895 (mysql) score 17 or sacrifice child
Apr 14 13:13:35 IA6-OA-DB-01 kernel: [84990.477043] Out of memory: Kill process 2226 (sssd_be) score 3 or sacrifice child
Apr 14 13:13:35 IA6-OA-DB-01 kernel: [84990.747574] Out of memory: Kill process 2283 (sssd_be) score 3 or sacrifice child
Apr 14 13:13:36 IA6-OA-DB-01 kernel: [84990.903214] Out of memory: Kill process 1587 (smbd) score 3 or sacrifice child
Apr 14 13:13:36 IA6-OA-DB-01 kernel: [84990.971431] Out of memory: Kill process 1587 (smbd) score 3 or sacrifice child
Apr 14 13:13:36 IA6-OA-DB-01 kernel: [84991.208088] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:13:36 IA6-OA-DB-01 kernel: [84991.329594] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:13:38 IA6-OA-DB-01 kernel: [84993.369239] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:13:39 IA6-OA-DB-01 kernel: [84994.124215] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:13:41 IA6-OA-DB-01 kernel: [84995.928253] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:13:44 IA6-OA-DB-01 kernel: [84999.295787] Out of memory: Kill process 1587 (smbd) score 2 or sacrifice child
Apr 14 13:13:48 IA6-OA-DB-01 kernel: [85003.091554] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:13:49 IA6-OA-DB-01 kernel: [85003.498436] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:13:50 IA6-OA-DB-01 kernel: [85005.624213] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:13:55 IA6-OA-DB-01 kernel: [85007.717901] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:14:02 IA6-OA-DB-01 kernel: [85014.623037] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:14:02 IA6-OA-DB-01 kernel: [85016.130481] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:14:02 IA6-OA-DB-01 kernel: [85017.218094] Out of memory: Kill process 858 (sssd) score 2 or sacrifice child
Apr 14 13:14:09 IA6-OA-DB-01 kernel: [85024.577427] Out of memory: Kill process 858 (sssd) score 3 or sacrifice child
Apr 14 13:14:09 IA6-OA-DB-01 kernel: [85024.857977] Out of memory: Kill process 321 (systemd-journal) score 2 or sacrifice child
Apr 14 13:14:11 IA6-OA-DB-01 kernel: [85025.128881] Out of memory: Kill process 14831 (bash) score 2 or sacrifice child
Apr 14 13:14:11 IA6-OA-DB-01 kernel: [85025.173233] Out of memory: Kill process 14831 (bash) score 2 or sacrifice child
Apr 14 13:14:34 IA6-OA-DB-01 kernel: [85048.414654] Out of memory: Kill process 15546 (bash) score 2 or sacrifice child
Apr 14 13:14:34 IA6-OA-DB-01 kernel: [85048.545329] Out of memory: Kill process 1057 (nginx) score 1 or sacrifice child
Apr 14 13:14:34 IA6-OA-DB-01 kernel: [85049.430812] Out of memory: Kill process 15513 (sshd) score 1 or sacrifice child
Apr 14 13:14:46 IA6-OA-DB-01 kernel: [85060.595291] Out of memory: Kill process 1629 (sshd) score 1 or sacrifice child
Apr 14 13:14:46 IA6-OA-DB-01 kernel: [85060.884189] Out of memory: Kill process 1629 (sshd) score 1 or sacrifice child
Apr 14 13:14:46 IA6-OA-DB-01 kernel: [85061.268085] Out of memory: Kill process 1061 (nginx) score 1 or sacrifice child
Apr 14 13:14:46 IA6-OA-DB-01 kernel: [85061.470392] Out of memory: Kill process 1280 ((sd-pam)) score 1 or sacrifice child

此 VM 重新啟動後。可能是什麼問題呢?以及我需要更改哪些變數才能使其執行?

MySQL 使用所有 RAM

根據此處的 MySQL 文件,緩衝池大小必須始終等於或倍數innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。如果將innodb_buffer_pool_size配置為不等於或倍數的值innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances,則緩衝池大小會自動調整為等於或倍數的值innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances

innodb_buffer_pool_size

InnoDB 與 MyISAM 不同,它使用緩衝池來記憶體索引和行數據。您設置的越大,訪問表中的數據所需的磁碟 I/O 就越少。在專用數據庫伺服器上,您可以將此參數設置**80%**為機器物理記憶體大小。但是不要設置太大,因為物理記憶體的競爭可能會導致作業系統中的分頁。請注意,在32bit系統上,您可能會限制2-3.5G每個程序的使用者級記憶體,因此不要將其設置得太高。

innodb_buffer_pool_instances

InnoDB 緩衝池劃分的區域數。對於具有數 GB 範圍內緩衝池的系統,將緩衝池劃分為單獨的實例可以通過減少不同執行緒讀取和寫入記憶體頁面時的爭用來提高並發性。

例如,innodb_buffer_pool_size設置為8G,並innodb_buffer_pool_instances設置為16innodb_buffer_pool_chunk_size128M,這是預設值。

8G是一個有效值innodb_buffer_pool_size,因為它是= 16 * = 128M8G的倍數,即2Ginnodb_buffer_pool_instances``innodb_buffer_pool_chunk_size

shell> mysqld --innodb-buffer-pool-size=8G --innodb-buffer-pool-instances=16

mysql> SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
|                           8.000000000000 |
+------------------------------------------+

innodb_buffer_pool_chunk_size

innodb_buffer_pool_chunk_size定義 InnoDB 緩衝池大小調整操作的塊大小。innodb_buffer_pool_size參數是動態的,它允許您在不重新啟動伺服器的情況下調整緩衝池的大小。

為避免在調整大小操作期間複製所有緩衝池頁面,該操作在**chunks. 預設情況下,innodb_buffer_pool_chunk_size 為128MB**(134217728 字節)。塊中包含的頁數取決於innodb_page_size的值。innodb_buffer_pool_chunk_size 可以以 1MB(1048576 字節)為單位增加或減少。

重要提示:更改innodb_buffer_pool_chunk_size時應小心,因為更改此值會自動增加緩衝池的大小。在更改 innodb_buffer_pool_chunk_size 之前,計算它對 innodb_buffer_pool_size 的影響, 確保生成的緩衝池大小是可以接受的。

如需進一步參考,請點擊此處

一個大問題:在一台 1GB 的機器上,innodb_buffer_pool_size = 768MB太大。它導致交換(對性能很不利)或 OOM(更糟)。200M應該沒問題。

每個連接都會使用一些空間;我不會設置max_connections高於 20。

您還提出了哪些其他設置?如果有的話,您應該降低設置——開箱即用的 MySQL 不是為 1GB 的小型機器(或 VM)設計的。

並且不超過 1 個innodb_buffer_pool_instances

在 my.cnf 部分進行更改[mysqld]並重新啟動(如果它沒有再次崩潰)。

引用自:https://dba.stackexchange.com/questions/234747