Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1125481
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: Mysql/postgreSQL

2011-04-27 17:46:05

第一个重要参数 open_files_limit,这个和ulimit -n有关系,具体有个测试
 open_files_limit 不是设置为 0,则以 setrlimit() 函数计算后的结果为准,如果设置为 0,则实际值是 max_connections*5 或 max_connections + table_cache*2 中的最大者。
也就是说
show status like 'open_%'; 
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Open_files               | 413   | 
| Open_streams             | 0     | 
| Open_table_definitions   | 144   | 
| Open_tables              | 394   |  正在打开的表
| Opened_files             | 33197 | 
| Opened_table_definitions | 0     | 
| Opened_tables            | 0     |   网上很多解释都不清不楚造成理解错误,这里的数值表示不经table_open_cache打开的表
+--------------------------+-------+
中Open_tables数值和max_connections之和受到open_files_limit限制,open_files_limit的上限是ulimit -n
max_connections就是mysql连接数,这个根据业务需求放大即可
Opened_tables数值为0表示table_cache(5.1以后叫table_open_cache)完全够用。

相关连接
thread_cache_size
Thread_Cache中存放的最大连接线程数(单位是个).在短连接的应用中Thread_Cache的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的,如果不使用Thread_Cache那么消耗的资源是非常可观的!在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的.但并不是越大越好大了反而浪费资源,总的来说这个数值够用就好,设置这个数值可以避免频繁创建线程带来的开销,每个线程开销大概192K
thread_stack
每个连接被创建的时候,mysql分配给它的内存
show status like '%thread%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Delayed_insert_threads | 0     | 
| Slow_launch_threads    | 0     | 
| Threads_cached         | 221   | 
| Threads_connected      | 104   | 
| Threads_created        | 325   | 
| Threads_running        | 1     | 
+------------------------+-------+
Threads_connected就是netstat -natup | grep mysqld | grep ESTABLISHED | wc -l的数值,即当前连接(线程)数
Threads_cached  + Threads_connected 一般会等于 Threads_created(如果不my.ini里不设置thread_cache_size这里就不成立了,Threads_created即已创建的连接

max-user-connections 每个用户允许的最大连接数
net-buffer-length 网络包传输中,传输消息之前的 net buffer初始化大小
该参数主要影响的是网络传输的效率,由于该参数所设置的只是消息缓冲区的初始化大小,所以造成的影响主要是当每次的消息都很大时,MySQL 总是需要多次申请扩展缓冲区的大小。default 16MB,一般来说可以满足大多数场景,如果查询返回的数据量非常小,每次网络传输量都很少,而且系统内存又比较紧缺,可以适当将该值调整到 8MB。
max-allowed-packet 网络传输中,一次消息传输量的最大值
该参数与 net-buffer-length 相对应,只不过是net buffer的最大值,当消息传输量大于net-buffer-length的设置时,MySQL 会自动增大net buffer的大小,直到缓冲区大小达到 max-allowed-packet 所设置的值。系统默认值为 1MB,最大值是1GB,必须设定为1024的倍数,单位为字节。
back-log 在 MySQL 的连接请求等待队列中允许存放的最大连接请求数
连接请求等待队列,实际上是指当某一时刻客户端的连接请求数量过大,MySQL 主线程没办法及时给每一个新的连接请求分配(或创建)连接线程时,还没有分配到连接线程的所有请求将存放到一个等待队列中,这个队列就是MySQL 的连接请求队列。当系统存在瞬时的大量连接请求时,则应该注意 back-log 的设置时。default: 50,最大可以设置为 65535 。当增大 back-log 参数的设置时,同时还需注意 OS 级别对网络监听队列的限制,因为如果 OS 的网络监听设置小于 MySQL 的back-log设置,加大back-log设置是没有意义的。

flush_time(默认0最好不要改)
如果系统有问题并且经常锁死或重新引导,应将该变量设置为非零值,这将导致服务器按flush_time 秒来刷新表的高速缓存。用这种方法来写出对表的修改将降低性能,但可减少表讹误或数据丢失的机会。
一般使用缺省值。

tmp_table_size(线程独享的大小,是个阀值不是直接分配值)
不宜设置过大参考
不宜设置过大主要是防止内存不足的时候使用swap
它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下

+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     | 
| Created_tmp_files       | 13    | 
| Created_tmp_tables      | 1     | 
+-------------------------+-------+
你可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables),一般的比例关系是:
Created_tmp_disk_tables/Created_tmp_tables<5%
上面这情况Created_tmp_tables几乎都没有,不要考虑增加tmp_table_size

max_heap_table_size
这个变量定义了用户可以创建的内存表(memory table,即CREATE TABLE test ENGINE=MEMORY这类表)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#
,但是对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
这个变量和tmp_table_size一起限制了内部内存表的大小。

从下面连接中可以看到
“根据通用的mysql内存计算公司:  
 线程独享,约4.5GB = 151 * (10M + 10M + 5M + 5M + 512K),组成大概如下:
sort_buffer_size:10M
join_buffer_size:10M
read_buffer_size:5M
read_rnd_buffer_size:5M
thread_stack:512KB”

tmp_table_size、sort_buffer_size、join_buffer_size、read_buffer_size、
read_rnd_buffer_size、thread_stack等的参数都是线程独占的,是独享的,但都是按需分配的,并不是一开始就直接分配那么多

待续...
阅读(1387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~