MySQL CPU使用率高于系统CPU

4
我有一台安装了Plesk的CentOS服务器,它拥有24个CPU内核和32GB的RAM。
当我在Linux中使用TOP命令时,我发现MySQL的CPU使用率约为200%,尽管总系统CPU使用率仅为2或3%,负载平均值低于3。
这种高MySQL CPU使用率导致网页加载时间长或者有时用户会收到错误提示。
我的问题是,为什么MySQL没有利用系统中可用的全部CPU使用率?用户MySQL在使用CPU方面受到限制吗?
  • cpu usgae for all cores show most of the cpus is idle in more than 90%
  • this is my top report :

    top - 10:16:50 up 78 days, 13:03,  1 user,  load average: 2.03, 2.66,
    2.23 Tasks: 452 total,   1 running, 451 sleeping,   0 stopped,   0 zombie
    Cpu(s):  5.6%us,  2.7%sy,  0.0%ni, 91.7%id,  0.0%wa,  0.0%hi, 
    0.0%si,  0.0%st Mem:  32838268k total, 30909316k used,  1928952k free,   
    346760k buffers Swap:  4737016k total,    21316k used,  4715700k free, 17724552k cached
    
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
    56223 mysql     20   0 12.5g 1.4g 7032 S 156.7  4.5 295:44.32 mysqld 
    16674 baadraan  20   0  191m  16m 8308 S  6.9  0.1   0:01.48 php-cgi
    16677 baadraan  20   0  193m  17m 8676 S  6.3  0.1   0:01.71 php-cgi
    
我检查了所有的ulimit都是无限制的。Plesk系统健康状况也显示CPU正常,但存在一个服务CPU问题:
MySQL CPU usage     225.1 %  (?)
Total usage     10.7% used  (?)
Load average    2.4 

请帮忙解释为什么mysql的CPU使用率超过了200%。

my.cnf 内容如下:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#basedir=/var/lib/mysql
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_file_per_table=1
max_connections=5000
max_user_connections=2000
log-slow-queries
long_query_time = 2
safe-show-database
skip-name-resolve
query_cache_size = 4000M
table_cache = 4000
thread_cache_size = 16M
query_cache_limit = 1M
key_buffer_size = 6G
wait_timeout = 500
interactive_timeout = 300
innodb_buffer_pool_size = 1024M
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 4M
sort_buffer_size = 4M
myisam_sort_buffer_size = 128M
join_buffer_size = 4M
read_buffer_size = 4M
tmp_table_size = 128M
connect_timeout = 15
max_allowed_packet = 2M
max_connect_errors = 9999
open_files_limit=3496


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

你的 MySQL 版本是什么? - jdiver
请张贴my.cnf文件(/etc/my.cnf)的内容,内存大小是多少? - Surendheran
如果你的系统在需要高CPU使用率的操作上没有高并发性能,我不认为有任何理由担心它。 - Antonios
MySQL 版本为 5.1.73。 - RezaMM
使用Linux,您报告的TOP 200%应该除以24个核心以获得平均忙碌度为8.3%。 - Wilson Hauck
显示剩余3条评论
2个回答

2

Remeshx,

"top"中看到的mysql负载是所有核心上所有mysql线程的总负载。如果您有24个核心的系统,则可以通过将200%/ 24进行除法来近似单个核心负载,这将得到约8%的负载,这并不坏。如果您想详细了解正在发生的情况,请使用“htop”而不是“top”,并在其设置中启用“树状视图”(设置->显示选项->树状视图)。您将在树状视图根目录中看到所有mysql线程及其负载以及总负载(您现在看到的负载)。

根据您所写的内容,您的系统负载不应该是长网页加载的问题。我猜数据库设计和/或查询存在问题。在您的配置中,我看到您启用了慢日志。我建议您仔细查看并跟踪缓慢、低效的查询。

此外,请查看您正在使用的表引擎。如果您正在使用MyISAM,并且有大量写入和大量负载-请记住,对MyISAM表的每次写入都会锁定整个表。

希望我已经澄清了一些问题 :)


1

针对您的配置 [mysqld] 部分,建议考虑以下内容:

将 read_buffer_size 设置为 64K,而不是 4M,以获得立即的改进。
将 max_connect_errors 设置为 10,而不是 9999,以防止黑客/破解者尝试入侵。 将 query_cache_size 设置为 50M,而不是 4000M(4G),以获得更合理的限制,易于管理。 将 query_cache_min_res_unit 设置为 512,以在查询缓存空间中存储更多条目。

停止/启动实例以提高性能。

查看个人资料以获取联系信息,并获取免费的实用程序脚本以协助进行性能调整。


@RezaMM 你在这个时间段内的实例进行得如何了?你已经能够应用我们的建议了吗?对结果的感知如何? - Wilson Hauck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接