您可以调整RDS MySQL实例的max_prepared_stmt_count参数,以满足压测和业务需求。本文介绍Sysbench压测模型下max_prepared_stmt_count参数的设置方法。
背景信息
max_prepared_stmt_count参数限制了Server Prepare Statement的总数。用于可能存在拒绝服务攻击的环境,这种攻击会注入大量Prepare Statement语句来耗费MySQL实例的内存。详情请参见max_prepared_stmt_count。
RDS MySQL实例max_prepared_stmt_count参数默认值为16382,在某些场景下,该默认值过小,无法满足需求,需要将参数值调大。例如,在Sysbench压测场景下,可能会出现报错,提示max_prepared_stmt_count参数值过小:
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
应用场景
在以下场景下,您需要修改RDS MySQL实例的max_prepared_stmt_count参数值:
Sysbench压测场景。
业务对max_prepared_stmt_count参数有特殊需求的场景 。
注意事项
在Sysbench压测场景下,需临时调大max_prepared_stmt_count参数值以满足测试需求,测试完成后建议调小该参数值,避免内存和安全风险。
调大和调小max_prepared_stmt_count参数值的风险如下:
调大的风险:一条Prepare Statement语句最少需要占用8 KB的内存,调大会占用过多的实例内存资源,增加MySQL被攻击的风险。
调小的风险:风险较小,现有Prepare Statement语句不受影响,超过max_prepared_stmt_count数量后不能准备新的Prepare Statement语句,需要等之前的Prepare Statement语句被释放。
Sysbench压测下的参数设置依据
本文以Sysbench 1.0.20为例,通过分析Sysbench源码,总结了常见压测模型下Prepare Statement语句数量的计算公式。对于某个测试模型,只要max_prepared_stmt_count参数值大于或等于下表中的Prepare Statement语句数,即可满足Sysbench测试要求。
测试模型 | Prepare Statement语句数 |
oltp_read_only | 大于或等于线程数x表数量x5+线程数 |
oltp_write_only | 大于或等于线程数x表数量x4+线程数 |
oltp_read_write | 大于或等于线程数x表数量x9+线程数 |
oltp_insert | 0(该场景没有Prepare Statement语句) |
例如,在oltp_read_only模型下,线程数为256,表数量为100时,根据公式计算得到Prepare Statement语句数为128256。那么在Sysbench测试过程中,只需将max_prepared_stmt_count参数设置为比128256大的值,即可满足Sysbench测试需求。
参数设置步骤
请参见设置实例参数。