注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

InnoSQL Profiler  

来自江羽   2012-07-27 14:53:16|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

熟悉ORACLE的都知道,ORACLE有个Profile,可以用来限制用户的相关资源,以下是一些ORACLE Profile的部分功能

配置项

说明

错误处理

SESSIONS_PER_USER

相同用户最大连接数

超过最大连接后拒接新连接

CPU_PER_SESSION

会话最大CPU时间

回滚当前事务,终止会话

CPU_PER_CALL

单个事务的CPU时间

回滚当前事务

CONNECT_TIME

会话的连接时间

超过最大连接时间则断开会话连接

IDLE_TIME

会话空闲时间

超过最大空闲时间则断开会话连接

LOGICAL_READ_PER_SESSION

会话最大逻辑读数量

回滚当前事务,终止会话

LOGICAL_READ_PER_CALL

单个事务最大逻辑读

回滚当前事务

Oracle Profile部分参数表

对比于上述ORACLEProfileMySQL本身自带的相关配置就显得比较“寒碜”,MySQL5.0版本开始,在系统表mysql.user中增加了部分类似于ORACLEProfile的功能,如:max_questions, max_connections, max_user_connections等等。

配置项

说明

MAX_QUESTIONS

用于限制指定用户在单位时间(1小时)内执行的事务量,如果到达该事务量,后续的事务将无法被执行。

MAX_UPDATES

用于限制指定用户在单位时间(1小时)内的update次数,超过该次数后,后续update将无法被执行。

MAX_CONNECTIONS

用于限制事务在单位时间(1小时)内的连接次数,超过该连接次数后,用户将无法连接

MAX_USER_CONNECTIONS

用于限制指定用户同一时刻的连接数,即同一用户的并发连接数。

MySQL参数表

从上面的参数可知,MySQL并没有像ORACLE Profile一样,在系统资源(CPUIO等)上对用户进行一定的限制,MySQL缺少对用户的CPUIO资源进行限制的配置。

基于上面的比较,下面我们就来实现InnoSQL对指定用户在CPUIO资源上的相关限制。

ORACLE Profile类似,我们需要在InnoSQL中添加上面ORACLE4项配置,从而实现对InnoSQL用户进行CPUIO等的限制,前面MySQL的参数都存放在mysql.user表中,对于新增的参数,我们通过设计一个user_profiler表来进行保存。

CREATE TABLE `user_profiler` (

`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',

`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',

`Max_cpu_times` int(11) unsigned NOT NULL DEFAULT '0',

`Curr_cpu_times` int(11) unsigned NOT NULL DEFAULT '0',

`Max_io_reads` int(11) unsigned NOT NULL DEFAULT '0',

`Curr_io_reads` int(11) unsigned NOT NULL DEFAULT '0',

`Max_mem_size` int(11) unsigned NOT NULL DEFAULT '0',

`Max_cpu_times_per_trx` int(11) unsigned NOT NULL DEFAULT '0',

`Max_io_reads_per_trx` int(11) unsigned NOT NULL DEFAULT '0',

`Operate_priv` enum('N','Y') COLLATE utf8_bin NOT NULL DEFAULT 'N',

PRIMARY KEY (`Host`,`User`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users profiler'

配置项

说明

HOST

连接用户的host

USER

连接用户的用户名

MAX_CPU_TIMES

指定用户最大CPU时间,单位ms

CURR_CPU_TIMES

用于保存当前已经使用的CPU时间,单位ms

MAX_IO_READS

指定用户最大逻辑IO

CURR_IO_READS

用于保存当前已经使用的IO

MAX_MEM_SIZE

用户连接最大内存,当前没用

MAX_CPU_TIMES_PER_TRX

单个事务最大CPU时间,单位ms

MAX_IO_READS_PER_TRX

单个事务最大逻辑IO

OPERATE_PRIV

是否具有对该表的操作权限

MySQL Profiler参数

ORACLE没有CURR_CPU_TIMESCURR_IO_READS参数,ORACLE对于已经消耗的资源只针对当前连接,而我们可以选择将InnoSQL用户所消耗的资源信息保存下来,下次连接时,对消耗的资源进行累积,由于用户的CPU_TIMESIO_READS每执行一条事务都会发生相应变化,所以我们对CURR_CPU_TIMESCURR_IO_READS,设计了一个变量current_profiler_record,用于控制何时进行保存。

current_profiler_record是一个unsigned int型变量:

current_profiler_record=2,每执行一条事务就进行保存一次,类似于slow_log功能,这样在大事务量并发的情况下,会影响系统的性能。

current_profiler_record=1,只在有连接退出时进行保存,这样如果服务器CRASH,则本次连接操作产生的CPUIO消耗将会被丢失。

current_profiler_record=0,资源消耗信息不会被保存到磁盘,如果该用户所有连接断开后再连,则资源消耗会被重置。

取值

说明

0

不保存资源消耗信息到磁盘

1

当连接断开时保存资源消耗信息到磁盘

2

每次执行事务就保存资源消耗信息到磁盘

current_profiler_record取值说明

所有当前连接的相关资源消耗,可以通过在客户端运行show status进行查询,如图:

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

上图中Threads_cpu_times_usedThreads_io_usedThreads_mem_size都是新添加的查询资源状态信息,显示的结构都以current/total形式给出,对于cpu_times_usedio_usedcurrent表示当前该用户消耗的资源,total表示我们设定的该用户拥有的资源,如果total=0表示该用户不设定资源限制。而对于mem_size,其值显示按current/max形式给出,current代表当前占用的内存,max代表该连接迄今为止最大内存占用。

效果演示:

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

上图中Threads_cpu_times_used值为420/0,为了验证cpu_times_used的功能,我们手工修改max的值分别为420和450,来观察终端返回情况。

update user_profiler set max_cpu_times=420 where user=@current_user;flush privileges;

show status结果:

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

上图中我们可以看到cpu_times_used已经被改成420,然后我们随便执行一条sql试试:

select * from test.t

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

终端提示:

user ‘root@localhost’ CPU resource is exhaustedCPU资源耗尽了,用户不能再执行相关操作了。

接下来,我们手工修改max的值为450

update user_profiler set max_cpu_times=450 where user=@current_user;flush privileges;

show status结果:

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

Max的值被修改成450,执行刚才的sqlselect * from test.t

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

再次show status

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

由于select * from test.t只返回2条记录,执行的时间没有达到cpu_times_used的最小的单位ms,所以在show status中观察current的值没有变化,但是可以比较下前后两次io_used的值+4了,说明sql还是正常执行了,只是执行的时间太短,没有记录到thread_io_used中。

用户IO设置

对于IO的限制也可以做类似的测试

上图中io_used的值为21949/0,我们手工修改max的值为22000

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

 然后我们执行select * from test.t;Show status

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

Show status发现io_usedcurrent值从21945变成了21949,而21949没有达到22000的最大值,所以select * from test.t能返回正确结果。

从上面也可以看出每次select * from test.t后,io_usedcurrent值就增加4,我们执行若干次后,io_usedcurrent便可以达到22000的最大值

执行若干次select * form test.tShow status

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

show status发现io_used的current值已经达到21997,而一次select产生的io为4,所以下次select应该无法正常返回:

select * from test.t;

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

果然,提示:User ‘root@localhost’ IO resource is exhausted,表示IO资源耗尽,后面的食物将无法正常执行。

同样我们还可以得到如下结果:

当前事务IO限制

设定一个事务的最大IO访问,当有事务的IO访问量大于该值时,则事务被回滚,该设置只对单个事务的IO访问,不会进行累积,每次执行完事务,该值就会被重置

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

提示:User ‘root@localhost’ IO reads of the TRX limited

当前事务CPU限制

设定一个事务的最大CPU时间访问,当有事务的CPU时间大于该值时,则事务被回滚,该设置只对单个事务的CPU时间,不会进行累积,每次执行完事务,该值就会被重置

InnoSQL Profiler - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

提示:User ‘root@localhost’ CPU times of the TRX limited

注意:上述IO,CPU的限制都是针对用户的(user@host),同一个用户的不同连接都共享相同的资源,即,如果一个连接消耗了大部分资源,相同用户的其他连接在show status时,也会发现相同的资源消耗。

  评论这张
 
阅读(959)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017