linux、渗透测试、网络安全、CTF、windows

mysql 占用cpu特别高的解决

你的话是我脚前的灯,路上的光。:

有一台服务器cpu占用老是到2000%多,开始老以为是php程序的问题。


后来发现是mysql配置不正确引起。


mysql> SHOW STATUS LIKE 'Qcache%';


No connection. Trying to reconnect...


Connection id:    11859


Current database: *** NONE ***




+-------------------------+-------+


| Variable_name           | Value |


+-------------------------+-------+


| Qcache_free_blocks      | 0     |


| Qcache_free_memory      | 0     |


| Qcache_hits             | 0     |


| Qcache_inserts          | 0     |


| Qcache_lowmem_prunes    | 0     |


| Qcache_not_cached       | 0     |


| Qcache_queries_in_cache | 0     |


| Qcache_total_blocks     | 0     |


+-------------------------+-------+


8 rows in set (0.00 sec)


发现查询缓冲被关闭。


使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。


通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。


 


与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。


 


query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。


query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。


query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。


mysql> SHOW STATUS LIKE 'Qcache%';


+-------------------------+----------+


| Variable_name           | Value    |


+-------------------------+----------+


| Qcache_free_blocks      | 172      |


| Qcache_free_memory      | 30956816 |


| Qcache_hits             | 34822    |


| Qcache_inserts          | 2357     |


| Qcache_lowmem_prunes    | 0        |


| Qcache_not_cached       | 802      |


| Qcache_queries_in_cache | 691      |


| Qcache_total_blocks     | 1575     |


+-------------------------+----------+


8 rows in set (0.00 sec)


重新配置my.cnf,并重启mysqld.问题解决


interactive-timeou


[root@localhost mysql]# vim /etc/my.cnf 


[mysqld]


skip-locking


key_buffer_size = 384M


max_allowed_packet = 1024M


table_open_cache = 512


sort_buffer_size = 2M


read_buffer_size = 2M


read_rnd_buffer_size = 8M


myisam_sort_buffer_size = 64M


thread_cache_size = 8


query_cache_size = 32M


thread_concurrency = 8


net_buffer_length = 16M




default-character-set=utf8


datadir=/var/lib/mysql


socket=/var/lib/mysql/mysql.sock


user=mysql


# Disabling symbolic-links is recommended to prevent assorted security risks


symbolic-links=0


wait_timeout=120


interactive_timeout=120


[mysqldump]


quick


max_allowed_packet = 1024M


[myisamchk]


key_buffer_size = 256M


sort_buffer_size = 256M


read_buffer = 2M


write_buffer = 2M


[mysqld_safe]


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


pid-file=/var/run/mysqld/mysqld.pid




[client]




default-character-set=utf8



评论
热度(2)

© redboy | Powered by LOFTER