- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我经营的网站拥有~500 名实时访问者、~5 万名每日访问者 和~130 万总用户。我在 AWS 上托管我的服务器,我在其中使用了多个不同类型的实例。当我启动该网站时,不同实例的成本大致相同。当网站开始获取用户时,RDS实例(MySQL DB)CPU不断飙升,不得不多次升级,现在已经开始占据性能和月成本的主要部分(95%左右) (2,8k $/月))。我目前使用具有 16vCPU 和 64GiB RAM 的数据库服务器,我还使用多可用区部署来防止故障。 我想知道数据库这么贵是正常的,还是我做错了什么?
数据库信息
目前我的数据库有 40 个表,其中大部分有 10 万行,一些有 200 万行,1 个有 3000 万行。我有一个系统,当不再需要它们时,它们会超过 21 天。
网站信息
网站主要使用PHP,也有一些NodeJS和python。
网站的大部分功能都是这样运行的:
我还运行了大约 100 个机器人,以 10-30 秒的间隔从数据库进行轮询,它们有时也会插入/更新数据库。
额外
我做了几件事来尝试降低数据库的负载。例如启用数据库缓存,对某些查询使用 redis 缓存,尝试删除非常慢的查询,尝试将存储类型升级为“Provisioned IOPS SSD”。但似乎没有任何帮助。
这是我对设置参数所做的更改:
我考虑过创建一个包含几个较小实例的 MySQL 集群,但我不知道这是否有帮助,而且我也不知道这是否适用于事务。
如果您需要更多信息,请询问,非常感谢有关此问题的任何帮助!
最佳答案
根据我的经验,一旦您提出“如何提高性能?”这个问题你知道你已经超出了 RDS 的范围(编辑:我承认我的经验让我得出这个观点可能已经过时了)。
听起来您的查询负载非常重。大量的插入和更新。如果可以的话,您应该增加 innodb_log_file_size 在您的 RDS 版本上。否则,您可能不得不放弃 RDS 并迁移到 EC2 实例,这样您可以更轻松地调整 MySQL。
我还会禁用 MySQL 查询缓存。在每次插入/更新时,MySQL 都必须扫描查询缓存以查看是否有任何需要清除的缓存结果。如果您的写入工作量很大,那么这是浪费时间。将查询缓存增加到 2.56GB 会使情况变得更糟!将缓存大小设置为 0,将缓存类型设置为 0。
我不知道您运行了哪些查询,或者您对它们的优化程度如何。 MySQL 的优化器是有限的,因此通常情况下您可以从重新设计 SQL 查询中获得巨大的好处。也就是说,更改查询语法以及添加正确的索引。
您应该进行查询审核,找出哪些查询导致了您的高负载。一个很棒的免费工具是 https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html ,它可以根据您的慢查询日志为您提供报告。使用 http://docs.aws.amazon.com/cli/latest/reference/rds/download-db-log-file-portion.html 下载 RDS 慢查询日志CLI 命令。
设置你的long_query_time=0,让它运行一段时间收集信息,然后把long_query_time改回你平时使用的值。收集此日志中的所有查询很重要,因为您可能会发现 75% 的负载来自 2 秒以内的查询,但它们运行得太频繁以至于给服务器造成了负担。
在您知道哪些查询占了负载之后,您可以针对如何解决这些问题制定一些明智的策略:
关于MySQL 服务器负载非常高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38293292/
在 Web 应用程序架构设计期间,我必须从概念上计算我的服务器之一可以服务多少个当前客户端。然后我可以预算它。 那么,有什么公式可以遵循吗?或者,你如何计算这个?或者,通常,一个 httpd/tomc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
我正在使用 Angular 5,我正在尝试在加载 div 的背景图像时获取加载图标。 如果它是一个普通的 img,我对此没有问题,但如果我尝试将它作为背景,它就不起作用。 这里是一些示例代码 app.
我们怎么知道我们的程序在 CPU 上有多少负载? 我尝试使用 htop 找到它。但是 htop 不会给 cpu 负载。它实际上给出了我程序的 cpu 利用率(使用 pid)。 我正在使用 C 编程,L
我们发现从Spark 1.3到当前的Spark 2.0.1以来,从Oracle数据库使用Spark的API加载数据一直很慢。典型的代码在Java中是这样的: Map options =
我有时会收到 mnesia overloaded主要使用时的错误消息 async_dirty查询和 ram_copies表。所以为了了解发生了什么,我想获得更多关于 mnesia 状态的信息,例如每秒
对于通常使用很少 CPU 的程序来说,内核 CPU 非常高。 Linux 机器在状态之间交替。大多数时候,程序使用低 CPU 正常执行。在 CPU“激增”期间,程序使用 100% 可用 CPU 使用高
我正在使用 Raspberry Pi 2 来路由 wifi-eth 连接。因此,从 eth 方面来看,我有一台可以使用 Pi wifi 连接到互联网的计算机。在 Raspberry 上我启动 htop
基本上我有一个网页,其中有一个 iframe 可以从不同的域加载另一个网页。它移动得很慢,我想证明整个页面很慢只是因为 iframe 内的页面。 有什么方法可以测量总页面负载以及总页面负载中有多少%来
我们有一个基于 Spring 的应用程序,它充当使用其他 Rest API 的编排层。我只想测试这个组件的性能,而不测试正在使用的下游 api。 我正在寻找有关如何完成此操作的任何架构建议? 当前的方
我正在学习 hibernate 。为了进行测试,我使用无效 key 调用了 session.load 。当我在调试器(JB Idea)中跨过该行后,没有任何反应 - 我预计会得到 ObjectNotF
我正在开发一个小型的待办事项 PHP 应用程序。我正在使用 jQuery 构建 HTML。其中一个是一个按钮,用于启动一个模式,允许用户编辑该项目。我很好奇加载数据时更好的方法是什么: 1) 在初始加
我尝试在 twitch 播放器中使用 angular 作为覆盖标记。 我将 ng-repear 与(键,值)结合使用。 //player is here 设置是一个全局对象。但是当我尝试加载页面
我即将了解 C 语言中的特定进程如何在特定时间范围内加载 CPU。该进程可能会在运行时切换处理器核心,因此我也需要处理这个问题。 CPU为ARM处理器。 我研究了从标准顶部获取负载的不同方法,perf
这个问题在这里已经有了答案: XMLHttpRequest Origin null is not allowed Access-Control-Allow-Origin for file:/// t
您好,我正在用 Java 开发负载平衡算法。在我的系统中将有一个主节点和 n 个从节点。主节点将接收查询分发给它的从节点。但是在将查询分发到其从节点之一之前,我想测量从节点中的当前负载,以检查特定从节
我正在渲染由大约 50 万个三角形组成的相当重的对象。我使用 opengl 显示列表,在渲染方法中只调用 glCallList。我认为一旦图形基元被编译成显示列表,cpu 的工作就完成了,它只是告诉
我正在尝试加密 Sipdroid,为此我必须在 RTP 数据包获得编码的音频负载后对其进行加密。我在 RTP 数据包类中使用这个函数: public byte[] getPayload() {
我正在尝试解析以下 JSON 负载: { "results":[ [ 298.648132, 280.68692, 356.54
在动画期间 cpu 负载非常高(高达 75%) 是否有优化代码以降低 CPU 负载的方法? 我的代码: ImageView myImageView = (ImageView)findViewById(
我是一名优秀的程序员,十分优秀!