我可以减少MySQL内存使用量,还是需要添加更多内存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我可以减少MySQL内存使用量,还是需要添加更多内存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3271字,纯文字阅读大概需要5分钟。
内容图文
![我可以减少MySQL内存使用量,还是需要添加更多内存?](/upload/InfoBanner/zyjiaocheng/896/0fb5b4f52e6a47b2bf965184a4b792cb.jpg)
我有一个2.25GB内存的VPS. MySQL现在使用1.4GB,我的网站上只有四个用户.即使没有用户在线,它似乎也会使用此数量.我的服务器的可用内存经常下降到100MB以下,这是令人不安的.
昨天MySQL因OOM错误而崩溃并导致数据库损坏,所以这才真正促使我调查这个问题.
我正在使用Percona配置向导生成的以下配置(稍加修改):
# Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5_20120208
# MODIFIED SLIGHTLY
[mysql]
# CLIENT #
port = 3306
socket = "/var/lib/mysql/mysql.sock"
[mysqld]
slow-query-log=1
long-query-time=1
# GENERAL #
user = mysql
default_storage_engine = InnoDB
socket = "/var/lib/mysql/mysql.sock"
pid_file = "/var/lib/mysql/mysql.pid"
# MyISAM #
key_buffer_size = 32M
myisam_recover = FORCE,BACKUP
# SAFETY #
max_allowed_packet = 256M # Percona said 16M, but I need it larger to avoid errors
max_connect_errors = 1000000
# DATA STORAGE #
datadir = "/var/lib/mysql/"
######### removed the following because the logs were taking up TONS Of space:
# BINARY LOGGING #
#log_bin = /var/lib/mysql/mysql_bin
#expire_logs_days = 14
#sync_binlog = 1
# CACHES AND LIMITS #
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0 # was previously 1
query_cache_size = 0 # was previously 32M
max_connections = 500
thread_cache_size = 50
open_files_limit = 65535 # was previously 4822
table_definition_cache = 1024
table_open_cache = 2048 # was previously 1024
# INNODB #
innodb_flush_method = O_DIRECT
innodb_log_files_in_group = 2
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_buffer_pool_size = 1456M
# LOGGING #
log_error = "/var/lib/mysql/mysql_error.log"
log_queries_not_using_indexes = 1
如您所见,我增加了max_allowed_pa??cket,open_files_limit和table_open_cache.我做了更改,因为我收到错误(我忘记了现在导致它们的确切原因)并且进行这些更改导致错误消失.
另外,我注意到innodb_buffer_pool_size设置接近于MySQL正在使用多少RAM(这可能只是巧合),但是正如this answer建议我运行以下内容:
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;
输出为2,我相信推荐的innodb_buffer_pool_size是2GB.如果这是正确的,那么我当前的设置甚至低于建议的数量.
我真的不知道自己在做什么,也不愿意盲目地改变my.cnf.我可以做些什么来减少内存使用量,还是只需要升级我的VPS计划?
解决方法:
严格来说,上面推荐的缓冲池大小的计算是不正确的.它假设InnoDB主动使用所有数据.在实践中,InnoDB只能触及数据库的一小部分.
检查Innodb_buffer_pool_reads和Innodb_buffer_pool_read_requests如何随时间变化.
mysqladmin -r -i 1 ext | grep -e Innodb_buffer_pool_read_requests -e Innodb_buffer_pool_reads
如果Innodb_buffer_pool_reads变化不大,那么所有工作集(数据库InnoDB的一部分主动使用)都适合缓冲池.
理想情况下,缓冲池应该尽可能大,因此每秒Innodb_buffer_pool_reads为零.
您可以使缓冲池更小,然后从磁盘而不是从内存中提供一些读取.
内容总结
以上是互联网集市为您收集整理的我可以减少MySQL内存使用量,还是需要添加更多内存?全部内容,希望文章能够帮你解决我可以减少MySQL内存使用量,还是需要添加更多内存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。