web-dev-qa-db-ja.com

MySQLのメモリ使用量を減らすことはできますか、それともRAMを追加する必要がありますか?

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_packetopen_files_limittable_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プランをアップグレードする必要があるだけですか?

2
Nate

厳密に言えば、上記の推奨バッファプールサイズの計算は正しくありません。 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 /秒はゼロです。

バッファープールを小さくすると、一部の読み取りはメモリからではなくディスクから提供されます。

4
akuzminsky