web-dev-qa-db-ja.com

80%のCPU使用率を使用するmysql

私のmysqlは、CPUごとに約70〜80%と約5%のメモリを使用しており、高トラフィックの場合、ウェブサイトの読み込みに時間がかかりすぎる

誰かが私を助けてくれませんか?

私のサーバーは32コアのRAMを搭載した8コアで、cpanel/cloudlinuxでcentos 6.9を使用しています

ここに私のmy.cnfとmysqltunerログがあります

[mysqld]

innodb_file_per_table=1

local-infile=0

tmpdir =/dev/shm

max_connections = 1024

max_user_connections=650

key_buffer_size = 1024M

myisam_sort_buffer_size = 64M

#default-storage-engine=MyISAM

join_buffer_size = 1M

read_buffer_size = 1M

sort_buffer_size = 256K

thread_cache_size = 384

wait_timeout = 20

connect_timeout = 10

tmp_table_size = 64M

max_heap_table_size = 64M

max_allowed_packet = 64M

net_buffer_length = 16384

max_connect_errors = 10

thread_concurrency = 16

concurrent_insert = 2

read_rnd_buffer_size = 786432

bulk_insert_buffer_size = 8M

query_cache_limit = 7M

query_cache_size = 64M

query_cache_type = 1

query_prealloc_size = 262144

query_alloc_block_size = 65536

transaction_alloc_block_size = 8192

transaction_prealloc_size = 4096

max_write_lock_count = 16

innodb_buffer_pool_size=8G #75 % of RAM

innodb_flush_log_at_trx_commit=2

innodb_thread_concurrency=8 # of cpus

innodb_flush_method=O_DIRECT


[mysqld_safe]

open_files_limit = 8192


[mysqldump]

quick

max_allowed_packet = 16M


[myisamchk]

key_buffer = 384M

sort_buffer = 384M

read_buffer = 256M

/////////////////////////////

そしてこれがmysqltunerの出力です

--------パフォーマンスメトリクス---------------------------------------- -------------------------------

[--] Up for: 2d 3h 25m 54s (23M q [127.290 qps], 468K conn, TX: 138G, RX: 7G)

[--] Reads / Writes: 89% / 11%

[--] Binary logging is disabled

[--] Physical Memory : 31.3G

[--] Max MySQL memory : 12.9G

[--] Other process memory: 3.9G

[--] Total buffers: 9.1G global + 3.2M per thread (1024 max threads)

[--] P_S Max memory usage: 555M

[--] Galera GCache Max memory usage: 0B

[OK] Maximum reached memory usage: 10.0G (31.77% of installed RAM)

[OK] Maximum possible memory usage: 12.9G (41.28% of installed RAM)

[OK] Overall possible memory usage with other process is compatible with memory available

[OK] Slow queries: 0% (5K/23M)

[OK] Highest usage of available connections: 8% (85/1024)

[OK] Aborted connections: 0.55% (2598/468725)

[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance

[!!] Query cache may be disabled by default due to mutex contention.

[OK] Query cache efficiency: 61.7% (12M cached / 19M selects)

[!!] Query cache prunes per day: 1008253

[OK] Sorts requiring temporary tables: 0% (2K temp sorts / 34M sorts)

[!!] Joins performed without indexes: 150075

[!!] Temporary tables created on disk: 52% (577K on disk / 1M total)

[OK] Thread cache hit rate: 99% (85 created / 468K connections)

[!!] Table cache hit rate: 1% (2K open / 102K opened)

[OK] Open file limit used: 24% (1K/8K)

[OK] Table locks acquired immediately: 99% (38M immediate / 38M locks)


-------- Performance schema ------------------------------------------------------------------------

[--] Memory used by P_S: 555.4M

[--] Sys schema isn't installed.


-------- ThreadPool Metrics ------------------------------------------------------------------------

[--] ThreadPool stat is disabled.


-------- MyISAM Metrics ----------------------------------------------------------------------------

[!!] Key buffer used: 26.8% (287M used / 1B cache)

[OK] Key buffer size / total MyISAM indexes: 1.0G/1.5G

[OK] Read Key buffer hit rate: 100.0% (2B cached / 572K reads)

[!!] Write Key buffer hit rate: 30.1% (2M cached / 899K writes)


-------- InnoDB Metrics ----------------------------------------------------------------------------

[--] InnoDB is enabled.

[--] InnoDB Thread Concurrency: 8

[OK] InnoDB File per table is activated

[OK] InnoDB buffer pool / data size: 8.0G/1.2G

[!!] Ratio InnoDB log file size / InnoDB Buffer pool size (1.171875 %): 48.0M * 2/8.0G should be equal 25%

[OK] InnoDB buffer pool instances: 8

[--] InnoDB Buffer Pool Chunk Size not used or defined in your version

[OK] InnoDB Read buffer efficiency: 100.00% (786635092 hits/ 786673138 total)

[!!] InnoDB Write Log efficiency: 51.42% (236640 hits/ 460226 total)

[OK] InnoDB log waits: 0.00% (0 waits / 223586 writes)


-------- AriaDB Metrics ----------------------------------------------------------------------------

[--] AriaDB is disabled.


-------- TokuDB Metrics ----------------------------------------------------------------------------

[--] TokuDB is disabled.


-------- XtraDB Metrics ----------------------------------------------------------------------------

[--] XtraDB is disabled.


-------- RocksDB Metrics ---------------------------------------------------------------------------

[--] RocksDB is disabled.


-------- Spider Metrics ----------------------------------------------------------------------------

[--] Spider is disabled.


-------- Connect Metrics ---------------------------------------------------------------------------

[--] Connect is disabled.


-------- Galera Metrics ----------------------------------------------------------------------------

[--] Galera is disabled.


-------- Replication Metrics -----------------------------------------------------------------------

[--] Galera Synchronous replication: NO

[--] No replication slave(s) for this server.

[--] This is a standalone server.


-------- Recommendations ---------------------------------------------------------------------------

一般的な推奨事項:

Run OPTIMIZE TABLE to defragment tables for better performance

OPTIMIZE TABLE `modsec`.`hits`; -- can free 382.777297973633 MB

Total freed space after theses OPTIMIZE TABLE : 382.777297973633 Mb

Set up a Secure Password for user@Host ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
 Restrict Host for user@% to user@SpecificDNSorIp

アカウントをIPまたはサブネットのみで構成し、skip-name-resolve = 1で構成を更新します

常にインデックスを利用するように結合クエリを調整する

調整を行うときは、tmp_table_size/max_heap_table_sizeを等しくします

SELECT DISTINCTLIMIT句のないクエリ

ファイル記述子の制限を回避するために、table_open_cacheを徐々に増やします

Table_open_cacheを64以上に増やす前にこれを読んでください:table_cacheの負のスケーラビリティ

Open_files_limit(8192)変数に注意してください

table_open_cache(2000)より大きくする必要があります

GitHubからSysスキーマをインストールすることを検討してください-mysql/mysql-sys:MySQL sysスキーマ

Innodb_log_file_sizeやinnodb_log_files_in_groupを変更する前にこれを読んでください:MySQL :: MySQL 5.7リファレンスマニュアル:: 14.7.2 InnoDB REDOログファイルの数またはサイズの変更

調整する変数:

query_cache_size (=0)

query_cache_type (=0)

query_cache_size (> 64M)

join_buffer_size (> 1.0M, or always use indexes with joins)

tmp_table_size (> 64M)

max_heap_table_size (> 64M)

table_open_cache (> 2000)

innodb_log_file_size should be (=1G) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
2
Miguel

「パフォーマンスの問題を回避することはできません。」

クエリキャッシュmayが問題の一部である可能性があります。適度に効率的に実行されていますが、プルーンはたくさんあります-12 /秒。プルーンは高価です。

MyISAM may問題の一部になります。 convert をInnoDBに変換する必要があります。

MysqltunerとWilsonのいくつかの提案は役立ちますが、some高CPUでの実際の問題は、ほとんどの場合、不十分なインデックスまたは不適切にフォーマットされたクエリです

_long_query_time 1_;でスローログをオンにします。一日待つ; _pt-query-digest_または_mysqldumpslow -s t_を実行して、「最悪」のクエリを見つけます。次に、それらを高速化するのに役立ちます。 詳細

これはあなたのケースで最も重要なチューナーコメントかもしれません:

_[!!] Temporary tables created on disk: 52% (577K on disk / 1M total)
_

これは約6 /秒で、他のサーバーと比較して約90パーセンタイルです。 Windowsで実行していますか? MySQLのバージョンは?

適切なサイズの列にTEXTを使用していますかVARCHAR(...)?列の小さなリストだけが必要なときに_SELECT *_を使用しますか?これらの両方canは、ディスク上のtmpテーブルにつながります。

効率 多くの:多くのスキーマ。

2
Rick James

クエリキャッシュが最適ではない方法で実装されました。競合の問題があり、データの無効化が頻繁に行われているため、CPU使用率が高くなっている可能性があります。

Innodb_log_file_sizeの値は何ですか?少なくとも1Gでない場合(とにかく2Gを好む傾向があります)、実際には増やす必要があります。そうしないと、フラッシュの問題が発生し、そうです、これはCPUに影響します。

セッションごとのバッファも、CPU使用率に悪影響を与える可能性があります。高すぎる値または低すぎる値を選択した場合の影響は通常、関係があります。デフォルトを使用してください。

MyISAMがCPU使用率を上げることができるとは思いません。通常、それを取り除く他の理由があります。しかし、それはInnoDBよりもはるかに複雑ではないので、CPUの敵になるべきではありません。

0

My.cnf/ini [mysqld]セクションの提案

#sort_buffer_size=256k  # disable to allow default to work for you
#read_buffer_size=1M  # disable to allow default to work for you
#read_rnd_buffer_size  # disable to allow default to work for you
#join_buffer_size  # disable to allow default to work for you

key_buffer_size=384M  # from 1024M only 287M used today
max_connections=164  # from 1024 because max_used_connections 85 today
wait_timeout=40  # from 20 seconds - does not allow much think time
#max_allowed_packet=64M  # to disable and allow 1M default if you need more,

sESSION <SET @ max_allowed_pa​​cket = nnnnnn; 1GまでIS THE LIMIT

#query_cache_limit=7M  # disable to allow default of 1M  only 9 would fit
query_cache_min_res_unit=512  #from def 4096 to increase capacity of QC
query_prealloc_size=32768  # 262144  to minimize RAM malloc
query_alloc_block_size=32768  # from 65535 to be same as p_a_s

Www.mysqlcalculator.comで2分間費やしてください。最初の4つの変数が無効になっていることがわかります。RAMフットプリントは、応答時間を改善するために必要なものよりはるかに大きくなっています。

0
Wilson Hauck