Mysql CPU使用率超过800%

时间:2012-10-29 19:36:54

标签: mysql performance web cpu

我最近在网络服务器上遇到了很多麻烦。我的网页加载速度非常慢,当我检查htop时,我注意到mysql进程使用了​​大约800-1000%的CPU。我已经尝试了mysqltuner建议的所有内容,但我还没有看到改进。

以下是mysqltuner结果:

  

--------一般统计------------------------------------- -------------

     

[ - ] MySQLTuner脚本的跳过版本检查

     

[确定]当前运行支持的MySQL版本5.1.54-log

     

[确定]在64位架构上运行

     

--------存储引擎统计------------------------------------ -------

     

[ - ]状态:+存档-BDB -Federated + InnoDB -ISAM -NDBCluster

     

[ - ] MyISAM表中的数据:58M(表:243)

     

[ - ] InnoDB表中的数据:34M(表:303)

     

[!!]总碎片表:304

     

--------绩效指标------------------------------------- ------------

     

[ - ] Up:2d 0h 10m 24s(3M q [20.584 qps],594K conn,TX:2B,RX:   373M)

     

[ - ]读/写:78%/ 22%

     

[ - ]总缓冲区:全局652.0M +每线程14.6M(最多250个线程)

     

[确定]最大可能内存使用量:4.2G(已安装RAM的82%)

     

[确定]慢查询:1%(50K / 3M)

     

[确定]可用连接的最高使用率:46%(115/250)

     

[确定]密钥缓冲区大小/总MyISAM索引:256.0M / 18.7M

     

[确定]密钥缓冲命中率:100.0%(3B缓存/ 46K读取)

     

[确定]查询缓存效率:49.9%(785K缓存/ 1M选择)

     

[!!]每天查询缓存李子:24539

     

[确定]需要临时表的排序:0%(0个临时排序/ 91K排序)

     

[!!]连接没有索引:199247

     

[!!]在磁盘上创建的临时表:29%(磁盘上159K /总计547K)

     

[确定]线程缓存命中率:99%(创建118个/ 594K连接)

     

[确定]表缓存命中率:66%(1K开放/ 1K开启)

     

[确定]使用的打开文件限制:23%(1K / 4K)

     

[确定]立即获取表锁:99%(1M立即/ 1M锁)

     

[OK] InnoDB数据大小/缓冲池:34.4M / 128.0M

     

--------推荐-------------------------------------- ---------------

     

一般建议:

Run OPTIMIZE TABLE to defragment tables for better performance

Adjust your join queries to always utilize indexes

When making adjustments, make tmp_table_size/max_heap_table_size equal

Reduce your SELECT DISTINCT queries without LIMIT clauses
     

要调整的变量:

query_cache_size (> 80M)

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

tmp_table_size (> 180M)

max_heap_table_size (> 180M)

我可以做些什么来提高网页加载速度并减少CPU上的mysql压力?

2 个答案:

答案 0 :(得分:2)

正确索引表格应该有所帮助,请参阅create index syntax页面。另外,您可以查看有关optimization的页面。我最近经历了一些性能问题并决定将MySQL升级到5.5以利用多个CPU内核;我知道早期版本中的一些错误没有使用但只有一个核心等,但我现在找不到一个很好的参考。

另外,在/etc/my.cnf文件中尝试这样的设置:

# improvements for InnoDB:
innodb_buffer_pool_size=8G
innodb_log_buffer_size=512M
innodb_log_file_size=256M
# improvements for MyISAM:
key_buffer_size=2G

建议的值会根据服务器的RAM量而有所不同,所以值得一试。在这种情况下,我有20 GAG的RAM。

如果您有疑问,请使用MyISAM作为网页。 MySQL 5.5在使用InnoDB方面要成熟得多,但早期版本在InnoDB上存在问题。

答案 1 :(得分:1)

可能需要优化对数据库的查询..而且我也看到有很多没有索引的JOIN查询。在用于JOIN的字段上索引表会有所帮助。