MySQL maximum possible memory usage above installed RAM
I'm using debian 8 Jessie and MariaDB. My mysqltuner seems to indicate as MariaDB can use 142% of RAM :
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +Aria +BLACKHOLE +CSV +FEDERATED +InnoDB +MRG_MyISAM
[--] Data in InnoDB tables: 2G (Tables: 79)
[--] Data in MyISAM tables: 96M (Tables: 146)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 52)
[!!] Total fragmented tables: 34
-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 16h 44m 38s (73M q [502.853 qps], 196K conn, TX: 572B, RX: 14B)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 17.3G global + 56.2M per thread (500 max threads)
[!!] Maximum possible memory usage: 44.8G (142% of installed RAM)
[OK] Slow queries: 0% (2K/73M)
[OK] Highest usage of available connections: 28% (141/500)
[OK] Key buffer size / total MyISAM indexes: 1.0G/32.6M
[OK] Key buffer hit rate: 100.0% (132M cached / 53K reads)
[OK] Query cache efficiency: 44.9% (50M cached / 113M selects)
[!!] Query cache prunes per day: 260596
[OK] Sorts requiring temporary tables: 0% (2K temp sorts / 2M sorts)
[OK] Temporary tables created on disk: 21% (6K on disk / 28K total)
[OK] Thread cache hit rate: 99% (141 created / 196K connections)
[OK] Table cache hit rate: 72% (500 open / 692 opened)
[OK] Open file limit used: 17% (429/2K)
[OK] Table locks acquired immediately: 99% (25M immediate / 25M locks)
[OK] InnoDB buffer pool / data size: 16.0G/2.4G
[!!] InnoDB log waits: 30
My innodb_buffer_pool_size
is at 16Go, for 32Go RAM that should be ok, I don't know what to do for optimize this.
The thing is, my memory general usage in the server is always under 89% (plus for caching). MariaDB is actually using 50,6% of RAM.
This the principal variables in my.cnf I adjusted which could have an effect on this:
max_connections = 100
max_heap_table_size = 64M
read_buffer_size = 4M
read_rnd_buffer_size = 32M
sort_buffer_size = 8M
query_cache_size = 256M
query_cache_limit = 4M
query_cache_type = 1
query_cache_strip_comments =1
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 64M
nnodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 16G
thread_cache_size = 4M
max_connections = 500
join_buffer_size = 12M
interactive_timeout = 30
wait_timeout = 30
open_files_limit = 800
innodb_file_per_table
key_buffer_size = 1G
table_open_cache = 500
innodb_log_file_size = 256M
Is something incorrect in my configuration ?
Solution 1:
Additional reduction in memory footprint can be achieved by REMOVING from your my.cnf the following to allow defaults to serve your system.
sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
Consider changing or adding the following in my.cnf
key_buffer_size = 164M # you already have 132m cached per MySqlTuner
thread_cache_size = 100 # CAP suggested in 8.0 to avoid overload
There were 141 threads created to serve 196K connections in your 1 day 16 hrs uptime. This will reduce high cpu utilization for creating/breaking down connections.
Keeping your innodb_buffer_pool_size at 16G for now is fine since you only have 2.4G of data per MySQLTuner.
The other items suggested by SEO DEVS are super.
Use mysqlcalculator.com for a quick check on approximate RAM utilization
Solution 2:
You have over done your setup and the sql database is set for a possible overload, also you have a duplicate max-connection. For a 32gb server the my.cnf should look more like this. change your settings to match the ones below.
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
max_connections = 250
table_cache = 4K
wait_timeout = 1200
query_cache_limit = 1M
query_cache_size = 128M
join_buffer_size = 2M
expire_logs_days = 10
max_binlog_size = 100M
innodb_buffer_pool_size = 26G
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
Hope this helps