MySQL 調優-高記憶體使用

MySQL 調優-高記憶體使用

我正在嘗試使用 mysqltuner 調整 mysql 資料庫。 Mysqltuner 建議我增加 join_buffer_size 和 query_cache_size。但同時,它警告我的最大記憶體使用量很高,為已安裝 RAM(即 2GB)的 200% 以上。當然,我所處的困境是,如果我按照 mysqltuner 所說的去做,記憶體使用量將會飆升得更高。那我在這裡做什麼呢?問題不是出在 mysql 上,而是出在該伺服器上運行的應用程序,這些應用程式顯然需要 mysql 進行大量快取?那裡的 mysql 管理員專家將如何從這裡開始?請參閱下面的 mysqltuner 報告以及我目前的 [mysqld] 設定:

MySqlTuner 報告:

MySQLTuner 1.2.0 - 主要 Hayden Bug 報告、功能請求和下載:http://mysqltuner.com/ 使用“--help”運行以獲得附加選項和輸出過濾

-------- 一般統計 ---------------------------------------- ----------
[--] 跳過 MySQLTuner 腳本的版本檢查
[OK] 目前執行支援的 MySQL 版本 5.5.30-log
[OK] 在 64 位元架構上執行

-------- 儲存引擎統計資料 -------------------------------------- ----
[--] 狀態:+Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] MyISAM 表中的資料:310M(表:264)
[--] InnoDB 表中的資料:8M(表: 365)
[--] PERFORMANCE_SCHEMA 表中的資料:0B(表:17)[!!] 碎片表總數:376

-------- 安全建議 ---------------------------------------- ---
[確定] 所有資料庫使用者都已指派密碼

- - - - 效能指標 - - - - - - - - - - - - - - - - - - - - ---------
[--] 最長:20h 20m 10s(2M q [35.305 qps],25K 連接,TX:88B,RX:2B)
[--] 讀取/寫入:22% / 78 %
[--] 總緩衝區:480.0M 全域+ 33.5M 每個執行緒(最多110 個執行緒:480.0M 全域+ 33.5M 每個執行緒(最多110 個執行緒)
[!!] 最大可能記憶體使用量:4.1G(已安裝 RAM 的 203%)
[OK] 慢查詢:0% (0/ 2M)
[OK] 可用連線的最高使用率:7% (8/ 110)
[OK] 鍵緩衝區大小/MyISAM 索引總數:150.0M/129.5M
[OK] 鍵緩衝區命中率:100.0%(15M 快取/7K 讀取) )
[OK] 查詢快取效率:74.3%(762K快取/1M 選擇)
[!!] 每天查詢快取修剪:4341
[OK] 需要臨時表的排序:0%(3 個臨時排序/11K 排序)
[!!]無索引執行的聯接:3901
[確定] 在磁碟上建立的臨時表:0%(磁碟上2K / 總計547K)
[確定] 執行緒快取命中率:99%(建立 8 個/25K 連線)
[確定] 表格快取命中率: 46%(688 個開啟/ 1K 開啟)
[OK] 使用的開啟檔案限制:17%(593/3K)
[OK] 立即取得的表鎖:99%(1M 立即/1M 鎖定)
[OK] InnoDB 資料大小/緩衝池:8.9M/ 256.0M

-------- 建議---------------------------------------- - -----------
一般建議:
執行 OPTIMIZE TABLE 對錶進行碎片整理以獲得更好的效能
MySQL 在過去 24 小時內啟動 - 建議可能不準確
減少總體 MySQL 記憶體佔用以確保系統穩定性
將連線查詢調整為始終利用索引
變數來調整:
* MySQL的最大記憶體使用量高得危險
在增加 MySQL 緩衝區變數之前加入 RAM *
query_cache_size (> 32M)
join_buffer_size (> 32.0M,或一律使用有連接的索引)

my.cnf 中目前 mysqld 設定:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
user=mysql
符號連結=0
埠= 3306
套接字= /var/lib/mysql/mysql.sock
跳過外部鎖定
key_buffer_size = 150M max_allowed_pa​​.sock跳過外部鎖定key_buffer_size = 150M
max_allowed_pa cket = 160M
max_connections = 110
wait_timeout = 60
query-cache-type = 1
query-cache-size = 32M
query_cache_limit = 2M
thread_cache_size = 16
tmp_table_size = 332_Fyize
32_sizes_Fsft table_open_cache = 128
table_cache = 1600 sort_buffer_size = 512K net_buff er_length = 8K 讀取緩衝區大小 = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M innodb_buffer_pool_size = 256M innodb_additional_mem_pool_size = 2M innodb_log_buffer_nodbsize









答案1

這裡有一個相當奇怪的資料庫 - 它執行的寫入操作比讀取操作多得多。

調整 DBMS 使其與 Innodb 良好運作非常重要或者您將其調整為與 MyISAM 一起運行良好 - 但您似乎混合了兩種表類型。您不可能擁有一個對兩者都最佳的 DBMS。您需要開始將資料遷移到單一引擎。考慮到資料庫的寫重性質,我推薦 Innodb。

總緩衝區:480.0M 全域 + 33.5M 每個執行緒(最大 110 個執行緒)

目前,遇到交換的風險主要是由每個連接的記憶體使用情況所驅動的。但請注意,這只是一個風險現在。您還需要確定是否需要 110 個並發連接 - 最好稍微減少一點。通常,sort_buffer_size 是每個連接耗盡記憶體的罪魁禍首 - 但你的是預設值的四分之一。

如果您要在 innodb 上進行整合,那麼您可能需要增加 innodb 緩衝池的大小。

您可以嘗試不同的值這裡

相關內容