从 AWS EC2 MySQL 数据库迁移到 Azure MySQL 数据库导致性能非常差且缓慢

2024-04-20

我们有一个非常小的 150MB 的 MySQL 数据库,它在 AWS t2.large 数据库作为自托管的情况下运行得非常快。

硬件规格:Azure:2 个 vCPU,10 GB 内存,AWS:2 个 vCPU,8 GB 内存。

不过,该公司决定将 AWS DB 迁移到 Azure 托管 MySQL,并将 PHP 应用程序暂时保留在 EC2 中。

两台服务器的硬件/W 相同,事实上 Azure 有 2GB 额外内存,并且两台服务器的 vCPU = 2,

一旦迁移到 Azure,我们就看到性能大幅下降,

例子:在 AWS 中,ajax 请求需要 15 秒,在 Azure 中,相同的 ajax 请求需要 2.5 分钟。

Azure MySQL DB - 平均 %CPU 和 % 内存从未达到其分配资源的 50%, 所以规格似乎不是问题。

根据下面的问题连接到 Azure Database for MySQL 时,Azure 应用服务上的 PHP 性能缓慢 https://stackoverflow.com/questions/63970567/php-on-azure-app-service-slow-performance-when-connected-to-azure-database-for-m

我们确实打开了 Azure MySQL DB 服务器参数启用重定向 to ON并启用使用 TLS 1.2 强制实施 SSL。

并安装了“mysqlnd_azure”扩展,使用

sudo pecl install mysqlnd_azure

根据下面的链接,我们检查这对连接有任何影响,但主机名似乎相同,没有变化

https://learn.microsoft.com/en-us/azure/mysql/howto-redirection#confirm-redirection https://learn.microsoft.com/en-us/azure/mysql/howto-redirection#confirm-redirection

在下面的“测试代码”中,如果重定向设置为“打开”,则会出现错误“连接错误(2002):”如果重定向在 ini 文件中设置为关闭,则测试代码将转到具有相同主机名的其他位置,这表明重定向不起作用,但是可以看到 mysqlnd_azure 扩展已加载并且表名在结果集中正确显示

<?php
$host = '<yourservername>.mysql.database.azure.com';
$username = '<yourusername>@<yourservername>';
$password = '<yourpassword>';
$db_name = 'testdb';
 echo "mysqlnd_azure.enableRedirect: ", ini_get("mysqlnd_azure.enableRedirect"), "\n";
 $db = mysqli_init();
 //The connection must be configured with SSL for redirection test
 $link = mysqli_real_connect ($db, $host, $username, $password, $db_name, 3306, NULL, MYSQLI_CLIENT_SSL);
 if (!$link) {
    die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n");
 }
 else {
   echo $db->host_info, "\n"; //if redirection succeeds, the host_info will differ from the hostname you used used to connect
   $res = $db->query('SHOW TABLES;'); //test query with the connection
   print_r ($res);
   $db->close();
 }
?>

应用程序是通过 Code-igniter 和 PEAR 完成的。

在使用 AWS EC2 和 Azure MySQL DB 运行 Code Igniter 时,有人有类似的经历吗?和解决这个问题有什么建议吗?


您最紧迫的问题是你不知道.

所以首先要做的就是了解——调查where事情确实出了问题。

例如(但您需要做的不仅仅是这个):

function after($msg) {
    global $tsts;
    if (isset($tsts)) {
        $time = floor((microtime(true)-$tsts)*1000);
    } else {
        $time = 0;
    }
    print "{$msg}: {$time} ms\n";
    $tsts = microtime(true);
}
    
after("Start");
$db = mysqli_init();
after("mysqli_init");
after("FINISH");

$link = mysqli_real_connect ($db, $host, $username, $password, $db_name, 3306, NULL, MYSQLI_CLIENT_SSL);
after("mysqli_real_connect");

$res = $db->query('SHOW TABLES;'); //test query with the connection
after("query");
// MUCH BETTER: a call to *execute* the query, and a different call
// to *retrieve* results, and you time *both* operations! See below

$db->close();
after("close");

这将告诉您通话过程中时间的具体情况。例如,您可以修改 after() 函数,以便它立即返回,除非 REMOTE_ADDR 是您的确切工作站,否则它将默默地将其数据保存在数组中,当 $msg 为“FINISH”时,它将把数组转储到文件中。这样,在代码中的各处调用 after() 调用,您将能够看到时间成本在哪里。

(这是一个非常糟糕的分析;xdebug 和 kcachegrind 会是更好和更精确的选择,但有更多的繁重要求,我们只想快速查看一下)。

例如,这会告诉您:

  • is the 联系 slow?
  • is the query slow?
  • is the 结果检索 slow?
  • is 格式化结果慢的? (不太可能,但是,嘿,它发生了:不同的 JSON 库,瞧!,你被卡住了)
  • is 发送结果慢的? (不太可能,但 Azure 几乎可以以任何方式(错误)配置。我有一台机器故意地以这种方式减慢速度以允许调试特定的 UI 问题)。
  • etc.

如果问题出在连接中,您将研究协议、防火墙、可能的替代连接,可能将整个应用程序移至 Azure 并在 EC2 中仅保留重定向存根等。

如果问题出在查询上,您需要检查内存、索引、可能的抖动、可能的 MySQL 配置错误。

如果是传输,请尝试协议压缩,或调查连接瓶颈,或与 Amazon 或 Azure 协商更好的连接策略。如果你有 57600 bps 的连接,没有什么可以帮助你,你需要麻烦谁为你提供带宽。

如果没有详细的计时信息,您就会在黑暗中跌跌撞撞。

小步骤

  • 首先连接到 Azure 计算机上设置的简单定制服务。您可以完全关闭数据库,而是在 MySQL 的端口 3306 上设置一个 Web 服务器。然后从 EC2 请求“https://azure.host/index.html”和时间that。如果整个缓慢出现在那里,那么您就知道问题只能出在网络中。

  • 然后启动一个测试数据库,其中包含一条记录的单个表。再说一次,如果缓慢出现在那里,那只能是MySQL的问题network配置。

  • 添加一个大表并运行一个查询,该查询将执行全表扫描,并且不返回任何内容。这会给缓冲池和磁盘 I/O 带来压力。

  • 返回大表,记录数量不断增加。这将测试奇怪的网络和防火墙问题(我有一次 MTU 不匹配被一个无聊的 Mikrotik 部分“修复”了,男孩是that调查一团糟)以及低带宽问题。在这里您可以打开和关闭压缩进行测试。

  • 最后使用复杂查询运行测试。这里的缓慢可能表明 mysqld.conf 中存在问题(与 EC2 上的相比),甚至是一些愚蠢的问题,例如忘记传输indexes甚至触发器(别笑,我做过一次。仍然很聪明)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 AWS EC2 MySQL 数据库迁移到 Azure MySQL 数据库导致性能非常差且缓慢 的相关文章

  • MySQL 5.0 索引 - 唯一索引与非唯一索引

    MySQL 唯一索引和非唯一索引在性能方面有什么区别 假设我想在 2 列的组合上创建索引 并且该组合是唯一的 但我创建了一个非唯一索引 这会对 MySQL 使用的性能或内存产生重大影响吗 同样的问题 有区别吗primary钥匙和unique
  • 从 MySQL 转储中删除 DEFINER 子句

    我有一个数据库的 MySQL 转储 其中有 DEFINER 子句 如下所示 DEFINER root localhost 也就是说 这些 DEFINER 子句位于我的 CREATE VIEW 和 CREATE PROCEDURE 语句中 有
  • 使用 MySQL 检测垃圾邮件发送者

    我发现越来越多的用户在我的网站上注册 只是为了向其他用户发送重复的垃圾邮件消息 我添加了一些服务器端代码来使用以下 mysql 查询检测重复消息 SELECT count content as msgs sent FROM messages
  • 如何将 AWS CLI 与 Elastic Beanstalk 结合使用?

    在文档中 它指出 EB CLI 已被 AWS CLI 取代 但所有文档仍在讨论 EB CLI 我已在 Elastic Beanstalk 控制台中创建了一个应用程序 现在准备开始开发 我已经在Ubuntu上安装了所有工具 并且已经在本地进行
  • PHP、MySQL、PDO 事务 - fetchAll() 可以在 commit() 之前吗?

    更多交易问题 我现在拥有的是一堆串在一起的查询 如果有任何失败 都会手动反转 代码块1 stmt1 db gt prepare Update table1 set col col 1 if stmt1 db gt execute stmt2
  • Amazon DynamoDB 使用无服务器修改结构

    修改 DynamoDB 表结构的最佳方法是什么 由于备份而删除它没有问题 我有一个只有哈希键的表 我必须为表添加一个排序键 当我部署堆栈时 我收到此错误 错误 CloudFormation 模板无效 模板格式错误 模板的资源块中存在未解析的
  • Blazor 服务器端 - AWS 环境中频繁出现 504 错误

    通过 AWS Elastic Beanstalk 将 blazor 服务器端项目部署到 Amazon Web Services 环境后 该网站经常断开连接 我不明白 测试时这些断开连接不会在本地发生 Errors 2020 04 30T16
  • SQL Server 与 MySQL:CONTAINS(*,'FORMSOF(THESAURUS,word)')

    我很震惊 当我在 SQL Server 中看到查询非常简单时 我花了 3 4 天弄清楚如何在 mysql 中实现词干提取 和同义词搜索 Select from tab where CONTAINS FORMSOF THESAURUS wor
  • 插入值数组

    我有一个具有可变数量值的数组 除了内部带有查询的循环之外 是否有更有效或更好的方法将它们插入到我的数据库中 At 这个网站 http www desilva biz mysql insert html 有一个很好的 MySQL 多插入查询示
  • 如何在托管的 VSO 构建代理中设置 Node.js 和 NPM 版本号?

    在 Visual Studio Online 中 您现在可以在生成定义的 常规 选项卡上设置生成依赖项 但是 有没有办法设置Node js和NPM的版本 托管构建代理当前似乎正在使用 Node js v0 12 7 和 NPM v2 11
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • SQL Select 使某个值仅出现一次

    对于那些一直在这个 Twitter 克隆上帮助我的人 谢谢你们 在您的帮助下 我已经成功地完成了大部分工作 现在终于完成了关注者功能的最后一步 现在 我有一个包含以下字段的数据集 用户名 推文 日期 数据示例可能如下所示 Username
  • 用户反馈系统的正确数据库模型(一个有趣的案例)

    我正在使用 PHP 和 Yii Framework 开发一个应用程序 我一直在考虑最适合给定功能的数据库结构 这就是我的想法 但我并不是 100 肯定应该这样做 因此我决定询问社区 应用程序说明 注册用户可以参加活动 每个事件都可以有一个
  • 这段php代码安全吗?

    我知道我应该使用准备好的语句 但我的下一个项目将使用准备好的语句 我只需要完成这个简单的小应用程序 所以我的问题是 以下代码片段安全吗 我使用了 htmlentities 以及 mysql real escape string 因为我认为这
  • 如何在应用程序级别管理只读数据库连接

    我们使用的是Java Spring Ibatis MySql 有没有办法利用这些技术在应用程序级别管理只读连接 我希望在只读 MySql 用户的基础上添加额外的保护层 如果 BasicDataSource 或 SqlMapClientTem
  • MySQL 客户端和服务器无法通信,因为它们不具备通用算法

    我在 AWS 服务器上运行以下代码 尝试连接到 AWS 提供的 mysql 服务 String conn buildConnString dc MySqlConnection connection new MySqlConnection c
  • 不允许为 VPC 创建 EC2 实例

    是否可以将 EC2 实例模板的 VPCId 定义为属性 我想做的是 Resources Ec2Instance Type AWS EC2 Instance Properties SecurityGroups Ref AWSSecurityG
  • 转储中的 MySQL 标志

    在查看 mySQL 转储时 我发现了一些东西并且想知道它们是什么 I see 50001 DROP TABLE IF EXISTS xxx 标志 50001 是什么 有它们含义的列表吗 它在 MySQL 的论坛 邮件列表上进行了讨论here
  • 我忘记了分号“;”在 MySQL 终端查询中。我该如何退出?

    有时我忘记用分号 结束 SQL 查询 在我的 Mac 终端中 发生这种情况时 终端会设置一个 gt 一开始我无法退出此命令或运行任何其他 SQL 命令 我该如何退出 你不知道mysql终端有5种不同的报价模式 我建议你回顾一下它们 http
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超

随机推荐