AWS RDS MySQL innodb/btr\u搜索\u闩锁

AWS RDS MySQL innodb/btr\u搜索\u闩锁,mysql,amazon-rds,Mysql,Amazon Rds,我在AWS RDS上运行MySQL 5.7.24,我有一个InnoDB类型的表,在正常流量下工作正常,但当向50k用户发送推送通知时,问题发生了 服务器具有32 GB RAM、8vCPU,我的AWS RDS服务器是db.m5.2xlarge wait/synch/sxlock/innodb/btr\u search\u闩锁获取大于wait/io/table/sql/handler的资源如下图所示 innodb\u自适应哈希索引现在已启用 您试图在五分钟内发送50000个推送通知 50000/30

我在AWS RDS上运行MySQL 5.7.24,我有一个InnoDB类型的表,在正常流量下工作正常,但当向50k用户发送推送通知时,问题发生了

服务器具有32 GB RAM、8vCPU,我的AWS RDS服务器是db.m5.2xlarge

wait/synch/sxlock/innodb/btr\u search\u闩锁获取大于wait/io/table/sql/handler的资源如下图所示

innodb\u自适应哈希索引现在已启用


您试图在五分钟内发送50000个推送通知

50000/300秒意味着每秒要推送167个通知,我假设随后会更新数据库以记录推送的结果。可能您正在许多并发线程中执行此操作,因此可以并行执行推送

您是否考虑过更渐进地执行这些推送通知,比如超过10或15分钟

或者批量更新数据库

还是使用更少的线程来避免数据库上的高争用

我曾为SchoolMessenger工作,这是一家为美国大多数公立学校提供通知服务的公司。我们每天发送数百万条通知、短信和电话。我们这样做的方式是让一个非常复杂的Java应用程序将通知排队,然后逐步发布它们。然后,随着推送结果的出现,它们也排队,并逐渐更新数据库

我们使用了MySQL,但我们也将其与作为持久队列一起使用。将所有要完成的任务推送到队列中,然后工作线程池将对这些任务执行操作,并将结果推回到另一个队列中。然后,结果读取线程将从队列中读取成批结果,并在批量更新中更新数据库

当您设计一个后端系统来完成大规模的工作时,您必须考虑新的方法来构建您的应用程序,以避免瓶颈

作为数据库性能和扩展顾问,我已多次遵守此规则:


对于每10倍的数据或流量增长,您应该重新评估您的软件体系结构。您可能需要重新设计它的某些部分才能在更大范围内工作。

您的意思是与写入数据库而不是查看相关的大量流量,因为sql/处理程序占用的资源很少,推送通知不是从我的系统发送的,而是从webengage发送的。我可以每分钟并行推送10K-15k。我认为与innodb中的哈希索引相关的问题您可以尝试
innodb\u adaptive\u hash\u index=0
禁用自适应哈希。但这可以通过降低二级索引查找速度来平衡。此外,我不是100%确定您可以在RDS参数组中设置该选项。