web-dev-qa-db-ja.com

MySQLサーバーが大量のメモリを消費している

現在、私は次のことが起こっています:

enter image description here

そして:

enter image description here

クエリを実行すると、ほとんどの時間が0に設定された約68のエントリが表示されます

show full processlist;

enter image description here

  • 私は何を間違っていますか?
  • メモリを解放するにはどうすればよいですか?
  • そのようにスワップを凍結するのは普通ですか?私は成功せずにswappinessを変更しようとしました。

    エコー10>/proc/sys/vm/swappiness

my.cnfファイル

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
Nice            = 0

log-warnings    = 2
log-error       = /var/log/mysqld.log



[mysqld]
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /data/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

#
# * Fine Tuning
#
key_buffer_size         = 16M
max_allowed_packet      = 128M
thread_stack            = 192K
thread_cache_size       = 64
table_open_cache        = 3000
#open_file_limit         = 10000
join_buffer_size        = 128k
# This replaces the startup script and checks MyISAM tables if needed

# the first time they are touched
myisam-recover         = BACKUP
max_connections        = 3000
wait_timeout           = 150
interactive_timeout    = 30


innodb_buffer_pool_size        = 25G
#  The preferred value size for the log_file_size is 25% of the innodb_buffer_pool_size.
innodb_log_file_size           = 1G
#innodb_log_buffer_size         = 512M


innodb_buffer_pool_instances   = 10
tmp_table_size                 = 256M
max_heap_table_size            = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_limit              = 64M
query_cache_size               = 256M


server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 1
max_binlog_size         = 100M

[mysqldump]
quick
quote-names

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer              = 16M
2
Tarek

Mysqldを誤って構成し、サービスがサーバーが実際に持っているよりも多くのメモリを予約しているようです(VIRTは37Gですが、サーバーは32Gです)。 doc をご覧ください。 my.cnfはわかりませんが、まずinnodb_buffer_pool_sizeを24Gに設定してサービスを再起動する必要があります。

1
s.meissner

32Gマシンでバッファプールを25Gにすることは妥当です。メインキャッシュ領域用に25GBが予約されています。 (RAMを消費する他のアプリケーションを実行する場合は、25Gを下げてそれらのスペースを確保します。)

出力は、スワップしていないことを意味します。良い。多くのmysqlプロセスが生きているが、おそらく何もしていないことを意味します。これは正常です。しかしながら、 thread_cache_sizeは64;これは不必要に大きいです。通常は10で十分です。

query_cache_size-5,000万以下。値を大きくすると、処理が遅くなる可能性があります。

max_connections-数百に低下します。まれなインストールだけが1000を超える必要があります。3000が必要な場合は、他の問題があり、それらに対処する必要があります。あなたはそれが1700でピークに達したと言いますか?あなたのクライアントはどうですか?彼らは切断に失敗していますか?彼らはあまりにも多くの接続を許可していますか?たとえば、ApacheはMaxClientsを持っています。これは、たった20の値ではなく、大きな値ではありません。

1
Rick James