调整实例max_prepared_stmt_count参数

您可以调整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测试需求。

参数设置步骤

请参见设置实例参数