2.25GBのRAMを搭載したVPSがあります。 MySQLは1.4GBを使用しており、私のサイトには現在4人のユーザーしかいません。オンラインのユーザーがいない場合でも、この量を使用しているようです。私のサーバーの利用可能なメモリは定期的に100MBを下回っています。
昨日、MySQLはOOMエラーでクラッシュし続け、データベースの破損を引き起こしました。そのため、この問題を調査するようになりました。
Percona構成によって生成された次の構成を使用していますWizard(わずかに変更):
# 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_packet
、open_files_limit
、table_open_cache
を増やしました。私はエラーを受け取っていたので変更を加えました(エラーの原因を正確に忘れてしまいました)。これらの変更を行うとエラーが発生しなくなりました。
また、innodb_buffer_pool_size
設定がRAM MySQLが使用している量(これは単なる偶然かもしれません)に近いですが、 この答え が示唆するように、私は以下を実行しました:
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がallデータでアクティブに動作することを前提としています。実際には、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
/秒はゼロです。
バッファープールを小さくすると、一部の読み取りはメモリからではなくディスクから提供されます。