2011-12-19 79 views
1

我有LAMP服务器有4核心CPU和32 GB RAM.We正在运行一个大型网站。我的服务器中有以下问题。mysql总是使用最大连接数

当我使用Mysqlreport工具来监视MySQL服务器时,我总是看到如下的连接使用情况。用户报告网站中的连接问题。

_

Connections _______________________________ 

Max used 251 of 250 %Max: 100.40 Total 748.71k 3.5/s 

但是当我使用 “显示进程列表” 命令,将输出什么。我们为我们所有的数据库使用MyISAM引擎。

我的MySQL配置文件粘贴如下:

###################### 

[mysqld] 

max_connections = 250 

set-variable=local-infile=0 

datadir=/var/lib/mysql 

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

user=mysql 

skip-name-resolve 

skip-bdb 

wait_timeout = 60 

thread_cache_size = 100 

table_cache = 1024 

key_buffer = 384M 

log_slow_queries=/mysql-log/mysql-slow.log 

query-cache-size=512M 

query-cache-type=1 

query_cache_limit=20M 

[mysqld_safe] 

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

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

谁在使用我的MySQL连接池?我怎么找到它?

而我有另一个问题。

Sometimes the Load average goes beyond 4-8 range. See below: 

13:40:02 up 2 days, 10:39, 0 users, load average: 5.03, 1.68, 0.93 

那时我可以看到mysql是CPU的最高消费者。是否有需要在MySQL服务器的任何优化?

请回复我上面的两个问题。

由于提前,

Aruns

+0

明白了。它报告max_used_connections,这是服务器上次重新启动后的高水位 - 这与当前的连接数不一样。从:http://serverfault.com/questions/342225/mysql-always-using-maximum-connection 谢谢大家为你的时间。 – ArunS 2011-12-19 13:40:17

回答

1

我注意到,你已经在使用MySQL查询缓存。

您是否尝试过使用MySQL工作台连接到您的MySQL数据库?它提供了检查MySQL数据库的图形化方式,包括进程列表。

如果您在防火墙后面,请尝试使用

show full processlist 

不过,我认为这不会真正的帮助。

我会假设你正在使用PHP-MySQL提供网页。所以这意味着你将主要发现MySQL连接是由PHP创建的。查看一次有多少个apache线程正在运行。你可以尝试:

ps aux |grep httpd |wc -l 

如果你有更多的线程在Apache上,连接到MySQL,那么你知道你有问题。

你提到你有一个繁忙的网站,因此,你的问题的真正答案是缓存你的内容,可能使用memcached。这个想法是减少你的MySQL服务器的命中。你的服务器有很多内存,非常适合memcached。

这种想法是重用根据一定时间的内容,如果内容需要新鲜感:

<?php 

$cachedContent = $memcache->get("cacheKey"); 

if (!$cachedContent) { 

    // retrieve from MySQL and formulate HTML here 
    // you can use obstart so that you can reuse your previous code 
    ob_start(); 

    // your previous code here 
    // echo or 
    ?> 
    <div> 
    previous generated content from mysql 
    </div> 
    <?php 

    // now cachedContent contains your previous generated HTML 
    $cachedContent = ob_get_contents(); 

    // set content into memcache 
    $memcache->set("cacheKey", $cachedContent, false, 1800); 

    // clear the buffer 
    ob_end_flush(); 

} 

echo $cachedContent; 

?> 

你需要找到第一缓存哪些内容。好的地方是:

  1. 索引上的低效位。php页面(我认为这将是最受欢迎的页面之一)
  2. 检查你的GA的大多数热门网页。
  3. 检查您的MySQL缓慢查询并缓存这些内容。
1

在my.cnf中添加以下变量: 如果您打算仅使用MyISAM引擎,则下面的变量将根据您的硬件配置给出最佳结果。

max_allowed_packet = 1M 
table_open_cache = 250 
sort_buffer_size = 2M 
thread_stack = 128K 
join_buffer_size = 1M 
query_cache_limit = 400k 
query_cache_size = 300M 
key_buffer_size = 5G 
read_buffer_size = 2M 
read_rnd_buffer_size = 2M 
bulk_insert_buffer_size = 8M 
myisam_sort_buffer_size = 8M 
myisam_max_sort_file_size = 6G 
myisam_recover=FORCE,BACKUP 

但是取决于你的数据库大小以及您的应用程序正在访问(读取)的数据,我们可以修改上面的变量。

减少wait_timeout = 30。

对此真的我没有任何线索:(.. 连接_ __ _ __ _ __ _ __ _ ____

最大使用250%251 Max:100.40总计748.71k 3.5/s

SHOW PROCESSLIST \ g

应提供进程列表连接到数据库的任何状态(睡眠/读取.....等)

在my.cnf中添加上述变量并重新启动服务器。