【问题标题】:Azure VMs seems to kill long running MySql queriesAzure VM 似乎会杀死长时间运行的 MySql 查询
【发布时间】:2019-01-27 15:28:42
【问题描述】:

在使用 MySql (Aurora) 时,我开始注意到奇怪的查询丢失了,而且工作人员只是永远挂起。经过一番调查,似乎在 AWS 中运行相同的代码是可以的,但在 Azure 上它只是永远挂起!

似乎原因是 Azure 只是简单地杀死了空闲的连接(如长时间运行的查询)。请注意,我可以在一个甚至没有负载均衡器的虚拟机上重现它。

这可以通过以下date && time mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(260);"重现

请注意,我用 240、250 对其进行了测试,但在 260 时它会死机。 但不只是死去,挂起,永远!看起来 Azure 甚至都懒得告诉套接字死掉所以 MySql 客户端挂起。

我们有从 NodeJs 和 Python 运行的查询,所以我需要一个在可能的情况下都适用的解决方案。

这里有一个很好的例子:https://imgur.com/gallery/FCV8ZWb(注意我必须在另一个会话中杀死 mysql 才能真正释放它)

【问题讨论】:

  • 是否有类似stackoverflow.com/a/40913764/3968921 这样的配置参数可用于配置长时间运行查询的阈值。另外我认为你应该终止查询而不是关闭套接字连接。 Socket 可以被不同的查询重用。
  • @AnkitDeshpande 虽然它使查询失败并且没有挂起,但我希望能够真正修复它,而不仅仅是减轻挂起。
  • 你在寻找什么样的修复,查询应该无限运行直到完成?
  • 是的,有时我们的查询需要 4 分钟以上才能完成。
  • 通常最好避免长时间运行的查询。尝试优化您的查询,您可能可以将其分解为多个批次。应该有一些阈值需要配置以允许查询运行长达 4 分钟。

标签: python mysql node.js azure


【解决方案1】:

经过一些研究,我发现了一个应该始终有效的低级解决方法,我将一个库注入到任何二进制文件中,使用 LD_PRELOAD 使所有套接字保持活动状态。我注入的库是libdontdie,一个旧库的分支:libkeepalive

构建库后,我运行: date && time DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so mysql -h$SERVER -u$USER -D mydb -p$PASS -e "SELECT SLEEP(300);"

它按预期工作(在 azure 中的 VM 和 AKS 中的 docker 映像上进行了测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多