【问题标题】:Managing Heroku RAM for Unique Application为独特的应用程序管理 Heroku RAM
【发布时间】:2020-12-28 22:35:24
【问题描述】:

我有一个 Flask 应用程序,它允许用户使用 SQL 查询 ~ 小型数据库(240 万行)。它类似于 HackerRank,但范围更有限。它部署在 Heroku 上。

我在测试期间注意到,通过运行大型查询,我可以预见地遇到 R14 错误(超出内存配额)或 R15(大大超出内存配额)。通常导致这种情况的查询超出了普通用户可能会执行的操作,例如 SELECT * FROM some_huge_table。也就是说,我担心当 5、10、100 个用户同时查询时,即使是很小的查询也会经常出现这些错误。

我正在寻找有关如何管理此类交互式网站的内存配额的建议。以下是我目前探索的内容:

  • 更改 gunicorn 工人的数量。这产生了一些影响,但我仍然经常遇到 R14 和 R15 错误。
  • 根据文本或 EXPLAIN 输出强制限制用户查询。这确实可以减少内存使用量,但恐怕它不会扩展到即使是非常有限的用户数。
  • 移动到更高的 Heroku 层。我目前使用的计划提供 ~512MB RAM。最大的计划是 14GB 左右。同样,这会有所帮助,但甚至不会适度扩展,更不用说相关成本了。
  • 显着减小数据库的大小。如果可能的话,我想避免这种情况。在 190 万行到 10k 或 50k 的表上进行餐巾纸数学运算,应用程序将大大减少内存需求并且可以更好地扩展,但仍会有一些适度的最大使用限制。

如您所见,在内存管理方面,我充其量只是个新手。我正在寻找一些关于如何解决这个一般问题的策略/想法,如果我需要大幅减少数据大小或为此投入大量美元,那也没关系。

谢谢

【问题讨论】:

    标签: python postgresql heroku memory ram


    【解决方案1】:

    根据我的个人经验,我看到了两种方法:

    1。计划一下

    从您的示例来看,这意味着您尝试计算请求将使用的最大内存,将其乘以 gunicorn 工作人员的数量,并使用足够大的 dynos。

    换一个例子,这可能是有效的,我认为它不适合你。

    2。减少内存使用,解决方案1

    使用过多的应用程序内存这一事实让我认为,您可能在代码中将整个结果集加载到内存中(甚至可能以多种格式多次加载),然后再将其返回给客户端。

    最后,您的应用程序只是从数据库中获取数据并将其转换为某种输出格式(JSON/CSV?)。

    您可能正在搜索的是流式响应

    您的 Flask 视图将在逐个记录的基础上工作。它将读取一条记录,将其转换为您的输出格式,然后返回一条记录。

    您的数据库客户端库和 Flask 都将支持此功能(在大多数数据库中,它称为 游标/迭代器)。

    2。减少内存使用,解决方案2

    其他服务通常使用简单的分页限制结果集来管理服务器端内存。

    安全附注

    听起来用户实际上可以在他们的 API 请求中定义 SQL 语句。这是一个安全和应用风险。除了执行 INSERTUPDATEDELETE 语句之外,用户还可以创建一个 SQL 语句,这不仅会消耗您的应用程序内存,还会破坏您的数据库。

    【讨论】:

    • 很好的建议。我将探索流响应并计划无论如何限制结果集。用户不需要返回超过 50 行左右的用例。在安全说明中,我计划只授予用户 SELECT 权限,以避免 SQL 注入,但听起来他们也可能造成其他损害。会破坏数据库的 SQL 语句的示例是什么?
    • 根据数据库内存的大小,我可以构建一个复杂的SELECT 查询,然后多次请求所述查询。这样其他用户就不会得到任何数据或错误。
    猜你喜欢
    • 2011-01-28
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2019-03-12
    • 2012-05-16
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多