Mysql

MariaDB / MySQL 使用大量執行緒/記憶體

  • February 11, 2013

我一直在設置一個新的 VPS,並想試用 MariaDB。我使用的是 MariaDB 10.0.1,據我了解,它相當於 MySQL 5.6。

自 MariaDB/MySQL 5.5 以來,執行緒的執行緒處理是否發生了巨大變化?這是我在舊伺服器(CentOS 5.9,MySQL 5.5)上看到的:

centos 5.9上的mysql 5.5

在帶有 MariaDB 10 (MySQL 5.6) 的 Centos 6.3 上:

centos 6.3 上的 mariadb 10

以下是事實清單:

在伺服器 A(CentOS 5.9、MySQL 5.5)上:

  • 大約有 15 個數據庫連接到各種網站和服務
  • Plesk 已安裝
  • MySQL 進行了最低限度的調整:

/etc/my.cnf

[mysqld]
local-infile=0
query_cache_type = 1
query_cache_size = 32M

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# Misc vars
key_buffer_size=32M
join_buffer_size=512K
tmp_table_size=32M
max_heap_table_size=32M
thread_cache_size=4
table_cache=300

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# InnoDB vars
innodb_buffer_pool_size=96M
innodb_additional_mem_pool_size=500K
innodb_log_buffer_size=500K
innodb_thread_concurrency=2

在伺服器 B(CentOS 6.3,MariaDB 10)上:

  • 有 3 個數據庫,其中只有一個目前“正在使用”並連接到低流量站點。
  • 沒有 Plesk。
  • MariaDB 最小調整:

/etc/my.cnf.d/server.cnf

[mysqld]
# threads
thread_concurrency=2
thread_cache_size=1
thread_handling=one-thread-per-connection
thread_pool_size=4
thread_pool_max_threads=4
thread_pool_idle_timeout=60
thread_stack=240K

# Limit Connections?
# max_connections=5

skip-external-locking
key_buffer_size=64M
max_allowed_packet=1M
table_open_cache=128
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=4M
net_buffer_length=8K
myisam_sort_buffer_size=32M
query_cache_size=16M

# innodb settings
innodb_buffer_pool_size=32M
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=30
innodb_thread_concurrency=0

為什麼會有這麼多執行緒?我嘗試了許多設置來嘗試將程序執行緒的數量降低到合理的水平,但我似乎無法影響它。它總是使用 20 或 21 個執行緒。我可以通過調整來減少記憶體使用量innodb_buffer_pool_size,但是 32M 並不是一個執行 10 多個站點的合理值,所以我將它增加到 96M 或 128M。在這些值下,mysql 使用的記憶體超過 750-850M 記憶體。

如果這只是我必須忍受的事情,那很好(我在新的 VPS 上擁有更多的記憶體,YOLO),但我只是好奇為什麼記憶體使用量會有如此巨大的差異。

另外值得一提的是,如果我在兩個 VPS 上都關閉了 mysql,我使用的記憶體幾乎相同——A 約 300M,B 約 260M。

MySQL 應該使用盡可能多的可用記憶體。這種規模的執行緒數量非常少,不會影響記憶體使用。執行緒共享相同的虛擬記憶體空間。他們只使用幾 KB 的執行緒元數據。

新 MySQL 上的記憶體使用量實際上比以前要小。它在虛擬記憶體空間中分配了 1.1GB,但在物理記憶體中只有 60MB。

在尋找優化 MySQL 時,首先嘗試將瓶頸從磁碟 I/O 轉移到記憶體訪問。還優化查詢(重寫它們,索引) - 啟用 MySQL 慢查詢日誌。

有時你達到了硬體限制,唯一的優化就是升級硬體。對於 MySQL,第一件事是添加更多 RAM、更快的磁碟,然後是更多的 CPU。

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