Mysql 显示 CPU 使用率为 100%

Mysql 显示 CPU 使用率为 100%

我在使用 Cpanel 安装的 MYSQL 服务器中遇到了一些问题。即使我的网络流量不是很大,我的服务器也显示 mysql 使用率为 100%。

我正在运行 CentOS 6.5x64,配备 80GB SSD 和 8GB Ram,以及 4CPU 核心。

我的.cnf:

[mysqld]
max_connections=500
key_buffer=128M
myisam_sort_buffer_size=35M
join_buffer_size=1M
read_buffer_size=1M
sort_buffer_size=2M
table_cache=4000
thread_cache_size=286
interactive_timeout=25
wait_timeout=7000
connect_timeout=10
max_allowed_packet=268435456
max_connect_errors=10
query_cache_limit=2M
query_cache_size=256M
query_cache_type=1
tmp_table_size=16M
innodb_buffer_pool_size=134217728
open_files_limit=10000
[mysqld_safe]
[mysqldump]
quick
max_allowed_packet=16M
[myisamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=16M
write_buffer=16M

以下是 MySQLTuner 的输出:

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 164M (Tables: 88)
[--] Data in InnoDB tables: 33M (Tables: 239)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 129

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 15m 2s (83K q [92.549 qps], 13K conn, TX: 44M, RX: 5M)
[--] Reads / Writes: 61% / 39%
[--] Total buffers: 544.0M global + 4.5M per thread (500 max threads)
[OK] Maximum possible memory usage: 2.7G (34% of installed RAM)
[OK] Slow queries: 0% (0/83K)
[OK] Highest usage of available connections: 23% (116/500)
[OK] Key buffer size / total MyISAM indexes: 128.0M/59.2M
[OK] Key buffer hit rate: 97.9% (24K cached / 527 reads)
[OK] Query cache efficiency: 54.3% (18K cached / 33K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 1% (5 temp sorts / 388 sorts)
[OK] Temporary tables created on disk: 0% (0 on disk / 374 total)
[OK] Thread cache hit rate: 99% (116 created / 13K connections)
[OK] Table cache hit rate: 98% (465 open / 474 opened)
[OK] Open file limit used: 3% (311/10K)
[!!] Table locks acquired immediately: 58%
[OK] InnoDB buffer pool / data size: 128.0M/33.6M
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Enable the slow query log to troubleshoot bad queries
Optimize queries and/or use InnoDB to reduce lock wait

这是我的 TOP 的输出:

top - 12:01:06 up 1 day,  1:02,  1 user,  load average: 10.37, 9.22, 8.61
Tasks: 399 total,   1 running, 397 sleeping,   0 stopped,   1 zombie
Cpu(s): 84.1%us, 15.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.2%si,      0.7%st
Mem:   8191528k total,  6042780k used,  2148748k free,   242064k buffers
Swap:        0k total,        0k used,        0k free,  4785012k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24515 mysql     20   0 2732m 165m 6264 S 303.8  2.1  42:43.18 mysqld
19471 root  20   0  174m  10m 6148 S  1.0  0.1   0:00.03 php
19523 root  20   0  172m  10m 5864 S  1.0  0.1   0:00.03 php
19533 root  20   0  172m   9m 5804 S  0.7  0.1   0:00.02 php
19535 root  20   0  172m  10m 5864 S  0.7  0.1   0:00.02 php

这个问题可能是什么原因造成的?
我是否必须更改 my.cnf 以防止服务器挂起?
或者我是否需要购买一台具有 16GB 内存的新服务器?

答案1

查看您的详细信息,我们可以得出以下一般建议:

  1. 你的读取:写入比率(61:39)提示你的引擎类型应该改为Innodb。在此之前,请检查

    SHOW ENGINE INNODB STATUS\G; 
    SHOW FULL PROCESSLIST;
    

    在高峰时段。您很可能会看到状态查询LOCK。表锁是的一大限制MyISAM。如果您有大量并发写入和选择,并且查询性能必须始终保持快速,则Innodb由于更好的锁定机制(row-level)是唯一的选择

  2. 碎片表总数:129. 运行OPTIMIZE TABLE并进行碎片整理以获得更好的性能

  3. 看看你的慢查询日志,检查 Query_time、Lock_time、Rows_sent、Rows_examined。如果你发现查询集合比率Rows Sent / Rows Examined很高,那么这些查询是好的optimization。slow_query.log 中的一些查询可能占用了大量的 CPU 资源。

  4. 检查服务器的 RAM 和可用磁盘空间状态:free -m , df -h。如果有可用内存,请增加innodb_buffer_pool_size以便有更多的缓存。

  5. 在 MySQL 配置中调整这些参数总是好的

    innodb_fast_shutdown=0 innodb_log_buffer_size innodb_log_file_size innodb_flush_method=O_DIRECT query_cache_size=0


警告:

  • 检查表 1:MySQL 进程的 CPU,如果可能的话增加 CPU

  • 检查表 2:RAM,数据集是否适合 RAM。

  • 检查清单3 :连接相关参数ABORTED_CONNECTS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,​​​​​​​​​​​​​​​​​​​CONNECTIONSMAX_USED_CONNECTIONSOPEN_FILESOPEN_TABLESOPENED_FILESOPENED_TABLESQUERIESSLOW_QUERIESTHREADS_CONNECTEDTHREADS_CREATEDTHREADS_RUNNINGPERFORMANCE_SCHEMAQUERY_CACHE_SIZEWAIT_TIMEOUTLONG_QUERY_TIMEINTERACTIVE_TIMEOUTCONNECT_TIMEOUTMAX_CONNECTIONSLOCK_WAIT_TIMEOUTTX_ISOLATIONMAX_ALLOWED_PACKETGENERAL_LOGTABLE_OPEN_CACHESLOW_QUERY_LOGOPEN_FILES_LIMITINNODB_LOCK_WAIT_TIMEOUT

  • 检查表4 :内存相关参数key_buffer_sizequery_cache_sizeinnodb_buffer_pool_size,innodb_log_buffer_sizemax_connectionsread_buffer_sizeread_rnd_buffer_sizesort_buffer_sizejoin_buffer_sizebinlog_cache_sizethread_stacktmp_table_size

  • 检查清单 5:其他重要的 InnoDB 参数 innodb_log_file_size、innodb_file_per_table、innodb_flush_log_at_trx_commit、innodb_flush_method、innodb_fast_shutdown

  • 清单 6:mysqltuner

    不使用索引执行的连接:表缓存命中率:

    -------- MyISAM Metrics -------------------------------------------- 
    [!!] 
    [!!] Write Key buffer hit rate: 
    -------- InnoDB Metrics -------------------------------------------- 
    [!!] InnoDB buffer pool / data size: 
    [!!] Ratio InnoDB log file size / InnoDB Buffer pool size : 
    [!!] InnoDB buffer pool instances:
    
  • 检查表 7:Processlist 发现以下查询长时间处于“正在发送数据”状态

  • 检查表 8:慢查询日志 - Rows_examined 与 Rows_sent 比率非常高,

  • 检查表 9:重复索引(如果有)

  • 检查表 10:解释一些慢查询的计划

  • 检查表 11:检查 where 子句列是否正确索引(非索引查询)

  • 检查清单 12:检查是否存在表锁、元数据锁、死锁。

  • 检查表 13:任何维护工作都应间隔运行(例如 mysqlcheck、mysqldump 等)

  • 检查清单 14:硬件资源、慢速磁盘、RAID 重建、磁盘 I/O、饱和网络、随着线程数的增加而增加的网络带宽吞吐量。

相关内容