MySQL服务器负载非常高

MySQL服务器负载非常高,mysql,database,performance,amazon-web-services,aws-rds,Mysql,Database,Performance,Amazon Web Services,Aws Rds,我经营的网站拥有~500名实时访问者,~50000名每日访问者,以及~1300万总用户。我将服务器托管在AWS上,在那里我使用了几种不同类型的实例。当我创建网站时,不同的实例的成本几乎相同。当该网站开始吸引用户时,RDS实例(MySQL DB)的CPU不断地达到顶峰,我不得不对其进行多次升级,现在它已经开始占据性能和月成本的主要部分(约95%(2,8k$/月))。我目前使用的数据库服务器具有16vCPU和64GiB的RAM,我还使用多AZ部署来防止故障我想知道数据库这么贵是正常的,还是我做错了什

我经营的网站拥有~500名实时访问者~50000名每日访问者,以及~1300万总用户。我将服务器托管在AWS上,在那里我使用了几种不同类型的实例。当我创建网站时,不同的实例的成本几乎相同。当该网站开始吸引用户时,RDS实例(MySQL DB)的CPU不断地达到顶峰,我不得不对其进行多次升级,现在它已经开始占据性能和月成本的主要部分(约95%(2,8k$/月))。我目前使用的数据库服务器具有16vCPU和64GiB的RAM,我还使用多AZ部署来防止故障我想知道数据库这么贵是正常的,还是我做错了什么?

数据库信息

目前,我的数据库有40个表,其中大多数表有10万行,有些表有约200万行,1个表有3000万行。 我有一个系统,用来记录那些超过21天的行,而这些行已经不再需要了

网站信息

该网站主要使用PHP,但也有一些NodeJ和python

网站的大部分功能如下:

  • 启动事务
  • 插入行
  • 获取上次插入的id(lastrowid)
  • 做一些计算
  • 更新了插入的行
  • 更新用户
  • 提交事务
  • 我还从数据库中以10-30秒的间隔运行了大约100个Bots wich轮询,它们有时还会插入/更新数据库

    额外的

    为了降低数据库的负载,我做了几件事。例如启用数据库缓存、对某些查询使用redis缓存、尝试删除非常慢的查询、尝试将存储类型升级为“已配置IOPS SSD”。但似乎没有任何帮助

    以下是我对设置参数所做的更改:

    我曾经考虑过创建一个包含几个较小实例的MySQL集群,但我不知道这是否有帮助,也不知道这是否适用于事务


    如果您需要任何更多信息,请询问,在此问题上的任何帮助都将不胜感激

    根据我的经验,只要你问“我如何提高性能?”这个问题,你就知道你已经超过了RDS(编辑:我承认我的经验导致我的观点可能已经过时)

    听起来您的查询负载相当重。大量的插入和更新。如果可以,您应该在您的RDS版本上增加innodb_日志_文件大小。否则,您可能不得不放弃RDS,转而使用EC2实例,以便更轻松地调优MySQL

    我还将禁用MySQL查询缓存。在每次插入/更新时,MySQL都必须扫描查询缓存,以查看是否有需要清除的缓存结果。如果您有一个写繁重的工作负载,这是浪费时间。将查询缓存增加到2.56GB会使情况更糟!将缓存大小设置为0,将缓存类型设置为0

    我不知道您运行的是什么查询,也不知道您对它们的优化程度如何。MySQL的优化器是有限的,因此经常可以从重新设计SQL查询中获得巨大的好处。也就是说,更改查询语法,以及添加正确的索引

    您应该进行查询审核,以找出哪些查询是导致高负载的原因。一个很好的免费工具是,它可以根据缓慢的查询日志生成报告。使用CLI命令下载RDS慢速查询日志

    将long_query_time设置为0,让它运行一段时间以收集信息,然后将long_query_time更改回您通常使用的值。收集此日志中的所有查询非常重要,因为您可能会发现75%的负载来自不到2秒的查询,但这些查询的运行频率太高,这对服务器造成了负担

    在知道哪些查询是负载的原因后,您可以制定一些关于如何解决这些问题的明智策略:

    • 查询优化或重新设计
    • 应用程序中的更多缓存
    • 扩展到更多实例
      • 我认为答案是“你做错了什么”。您不太可能达到RDS限制,尽管您可能在某些方面达到了限制

        从启用详细监视开始。这将为您提供一些操作系统级别的信息,这些信息将有助于确定您的限制因素到底是什么。查看您缓慢的查询日志和数据库统计数据-您可能有一些导致问题的查询

        一旦您理解了问题——可能是错误的查询、I/O限制或其他问题——那么您就可以解决它们了。RDS允许您创建多个读取副本,因此您可以将部分读取负载移动到从属服务器

        您还可以迁移到Aurora,它将为您提供更好的I/O性能。或者使用PIOPS(或者分配更多磁盘,这将提高性能)。您正在使用SSD存储,对吗


        另一个建议-如果您的计算(上面的步骤4)花费大量时间,您可能需要考虑将其分为两个或多个事务。

        查询缓存大小超过50M是个坏消息。你经常写东西——每一张桌子每秒写很多次?这意味着QC需要每秒扫描多次以清除更改表的条目。当质量控制为2.5GB时,这对系统来说是一个很大的负载

        query\u cache\u type
        应该是
        DEMAND
        ,如果您可以证明它是打开的。在这种情况下,
        使用
        SQL\u CACHE
        SQL\u NO\u CACHE
        选择

        既然您已经打开了slowlog,请使用pt query digest查看输出。前两个问题是什么

        由于您的典型操作涉及到编写,因此我不认为使用只读从机有什么好处

        机器人在兰德运行吗