<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[在Linux高负载下mysql数据库彻底优化]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[搜索优化]]></category>
<pubDate>Thu, 19 Mar 2009 07:53:38 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法，因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。 <br/><br/>安装好mysql后，配制文件应该在 /usr/local/mysql/share/mysql目录中，配制文件有几个，有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境，当然需要有不同的配制文件了。 <br/><br/>一般的情况下，my-medium.cnf这个配制文件就能满足我们的大多需要；一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了，使用mysqladmin variables extended-status –u root –p 可以看到目前的参数，有３个配置参数是最重要的，即key_buffer_size,query_cache_size,table_cache。 <br/><br/>key_buffer_size只对MyISAM表起作用， <br/><br/>key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和 Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析: <br/><br/>这个服务器已经运行了20天 <br/><br/><br/>key_buffer_size – 128M key_read_requests – 650759289 key_reads - 79112 <br/><br/>比例接近1:8000 健康状况非常好 <br/><br/>另外一个估计key_buffer_size的办法　把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。 <br/><br/>从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将SELECT语句和查询结果存放在缓冲区中，今后对于同样的SELECT语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。 <br/><br/>通过调节以下几个参数可以知道query_cache_size设置得是否合理 <br/><br/><br/>Qcache inserts Qcache hits Qcache lowmem prunes Qcache free blocks Qcache total blocks <br/><br/>Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时 Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。 <br/><br/>Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲 <br/><br/>我设置: <br/><br/>query_cache_size = 32M <br/><br/>query_cache_type= 1 <br/><br/>得到如下状态值: <br/><br/>Qcache queries in cache 12737 表明目前缓存的条数 <br/><br/>Qcache inserts 20649006 <br/><br/>Qcache hits 79060095 　看来重复查询率还挺高的 <br/><br/>Qcache lowmem prunes 617913　有这么多次出现缓存过低的情况 <br/><br/>Qcache not cached 189896 　　 <br/><br/>Qcache free memory 18573912　　目前剩余缓存空间 <br/><br/>Qcache free blocks 5328 这个数字似乎有点大　碎片不少 <br/><br/>Qcache total blocks 30953 <br/><br/>如果内存允许32M应该要往上加点 <br/><br/>table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和 Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且 opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。 <br/><br/>对于有1G内存的机器，推荐值是128－256。 <br/><br/>笔者设置table_cache = 256 <br/><br/>得到以下状态: <br/><br/>Open tables 256 <br/><br/>Opened tables 9046 <br/><br/>虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。 <br/><br/>如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制日志包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( Replication )的话，也需要使用二进制日志传送修改情况。 <br/><br/>log_bin指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引，每次启动服务时，都会重新生成一个新的二进制文件。此外，使用log-bin-index可以指定索引文件；使用binlog-do-db可以指定记录的数据库；使用binlog-ignore-db可以指定不记录的数据库。注意的是：binlog-do- db和binlog-ignore-db一次只指定一个数据库，指定多个数据库需要多个语句。而且，MySQL会将所有的数据库名称改成小写，在指定数据库时必须全部使用小写名字，否则不会起作用。 <br/><br/>关掉这个功能只需要在他前面加上#号 <br/><br/>#log-bin <br/><br/>开启慢查询日志( slow query log ) <br/><br/>慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子： <br/><br/>开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。 <br/><br/>log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是 4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10 <br/><br/>笔者设置: <br/><br/><br/>sort_buffer_size = 1M max_connections=120 wait_timeout =120 back_log=100 read_buffer_size = 1M thread_cache=32 interactive_timeout=120 thread_concurrency = 4 <br/><br/>参数说明: <br/><br/>back_log <br/><br/>要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。 <br/><br/>max_connections <br/><br/>并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决 <br/><br/>thread_cache <br/><br/>没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的 <br/><br/>thread_concurrency <br/><br/>#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2 <br/><br/>#有2个cpu,那么thread_concurrency=4 <br/><br/>skip-innodb <br/><br/>#去掉innodb支持 <br/><br/>Tags - <a href="http://www.dzhope.com/tags/mysql/" rel="tag">mysql</a> , <a href="http://www.dzhope.com/tags/mysql%25E4%25BC%2598%25E5%258C%2596/" rel="tag">mysql优化</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 在Linux高负载下mysql数据库彻底优化]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>