MYSQL 压测出现热点问题,怎么监控,怎么判断系统的压力问题

cc507d9ce62322c0550d1bb9d2550fc1.png

最近在测试阿里的POLARDB ,并针对数据库进行压力测试,在上周六,进行压测的过程中,数据库报警。

首先声明,压测的目的就是想压测到数据库的G点,并发现这个配置下的数据库不能承受多大的压力值。产生报警的问题主要原因有两个

1  当时的产生的同时并发的压力较大,数据库无法接受(这是报警的原因)

2  当时产生压测的方式,产生了热点块

这里先针对提到的是数据热点块的问题,这个通过压测软件可以很容易做到,针对一个表的数据库频繁的更新,或者针对数据表里面的一些点,进行快速的更新,这就产生了资源的争抢,解决的问题除了逻辑的方案,那么就是物理的方案,磁盘速度和更大的内存是解决这个问题的一个方法。

因为要做一个关于数据库的系统,发现数据库产生热点的问题,就必须通过数据库内部的表来获取和分析。

方法1 :

select e.thread_id,e.event_name,e.avg_timer_wait/100000 as ms,s.user,

s.state,s.command,s.statement_latency,s.lock_latency,s.rows_examined,s.tmp_tables,

s.full_scan,current_memory,s.trx_autocommit,s.current_statement

from events_waits_summary_by_thread_by_event_name as e

left join sys.session as s on s.thd_id = e.thread_id

where count_star <> 0 and event_name = 'wait/lock/table/sql/handler' and s.lock_latency <> 0 and s.state is not null;

835ae526db98c344d0b1cbd16955c2eb.png

上面的查询是通过两个表

1 performance_schema中的events_waits_summary_by_thread_by_event_name 表中过滤wait/lock/table/sql/handler 条目的thread_id ,说明当前的这些表中存在锁,这些锁🔒是当前 被称为thr_lock(),这个锁里面包含了如下的操作

read normal

read with shared locks 

read high priority

read no insert

write allow write

write concurrent insert

write delayed 

write low priority

write normal 

同时还包含了外部锁,通过存储引擎层来获得

read external

write extenal

这些数据是通过对操作的等待收集而来的,通过sys 库中的session表进行关联.

通过此查询可以获知以下信息

1  操作这个语句的用户

2  这个语句的状态

3  语句的类型

4  语句产生的临时表

5  是否是全表扫描

6  当前SESSION 使用多少内存

7  执行的语句是那个

8  锁等待的平均时间

 第二种方式,可以通过针对定位表的方式来不断刷新以下的SQL 

通过 count_star 与 其他的等待时间的比值,来或许一个曲线,关于等待时间的上升或下降的曲线,也能看出表是否存在

 select object_schema, object_name, count_star, avg_timer_wait/count_star, AVG_TIMER_READ/count_star, avg_timer_read_external/count_star, AVG_TIMER_WRITE_EXTERNAL/count_star from table_lock_waits_summary_by_table   where OBJECT_NAME = 't1' and (avg_timer_wait/count_star >= 100)\G

d17cbba8478830c59eeb29642b255915.png

通过不断查看平均时间,来查看等待时间的变化,来感受表被操作的热度。

可以取一个平均值,在此值之上的,判断为性能问题。

这边在测试中,发现如果avg_timer_wiat/count_star 后,如果数字在100以上,此时你的主机的 load average 已经在200 左右了,

5b24a0abd118b74e25e11dd205833446.png

如果你的这边在测试中,发现如果avg_timer_wiat/count_star 后,如果数字在800以上,此时你的load average 已经在600 以上了,所以可以通过这个来判断你的系统的压力的大致的值,而推断的方式是通过表的访问的的后的状态而判断。

通过mysqlslap 进行压力测试的命令

mysqlslap  -utest -p1234.Com -h 192.168.198.101 -P 3306 -p1234.Com --auto-generate-sql --auto-generate-sql-load-type=mixed  --number-char-cols=10 --number-int-cols=10  --iterations=10 --create-schema=test  --concurrency=1000 --auto-generate-sql-write-number=1000 --auto-generate-sql-secondary-indexes=2  --verbose

6cc32a3897a6c292eeea2b04bf892a46.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值