【问题标题】:What does "MySQL's maximum memory usage is dangerously high" mean by mysqltuner?mysqltuner的“MySQL的最大内存使用量非常高”是什么意思?
【发布时间】:2013-03-02 06:25:51
【问题描述】:

我正在尝试优化我在 2GB mem VPS 上运行的 mysql,我使用了 mysqltuner,但我不太明白如何处理以下建议,尤其是上面说的: MySQL 的最大内存使用量非常高,处理这个?有人可以帮忙解释一下吗?谢谢。

-------- Performance Metrics -------------------------------------------------
[--] Up for: 3h 17m 7s (49K q [4.190 qps], 1K conn, TX: 70M, RX: 7M)
[--] Reads / Writes: 60% / 40%
[--] Total buffers: 314.0M global + 6.4M per thread (300 max threads)
[!!] Maximum possible memory usage: 2.2G (119% of installed RAM)
[OK] Slow queries: 1% (785/49K)
[OK] Highest usage of available connections: 85% (256/300)
[!!] Cannot calculate MyISAM index size - re-run script as root user
[OK] Query cache efficiency: 92.4% (38K cached / 41K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 633 sorts)
[!!] Temporary tables created on disk: 45% (315 on disk / 699 total)
[OK] Thread cache hit rate: 74% (359 created / 1K connections)
[OK] Table cache hit rate: 95% (141 open / 148 opened)
[OK] Open file limit used: 12% (189/1K)
[OK] Table locks acquired immediately: 99% (6K immediate / 6K locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Add skip-innodb to MySQL configuration to disable InnoDB
    MySQL started within last 24 hours - recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    tmp_table_size (> 32M)
    max_heap_table_size (> 32M)

【问题讨论】:

    标签: mysql memory mysqltuner


    【解决方案1】:

    [!!] Maximum possible memory usage: 2.2G (119% of installed RAM)

    这意味着您实际上对 MySQL 撒了谎,告诉它您的可用内存比实际拥有的多,2.2G > 2G。这可能会持续数周或数月,但这是一个坏主意。如果 MySQL 没有您告诉它使用的内存,MySQL 将在最坏的时间随机崩溃。

    如果您将“skip-innodb”添加到您的 /etc/my.cnf 文件中,这可能会为您节省一些内存。我假设您没有使用 InnoDB。这是一个切线,但我强烈建议您将数据从 MyISAM 转换为 InnoDB。 MyISAM 是旧技术。 InnoDB 是更现代的引擎。

    在您的 my.cnf 中查找可以降低以节省内存的任何内容。我通常看的第一件事是未使用的连接。 15% 的连接未被使用,但请注意“24 小时内开始”警告。通常降低 my.cnf 中的(未使用的)连接将节省大量内存。我不知道您的应用程序是做什么的,但 256 连接对我来说听起来很高。因此,我会确保您的应用程序确实需要那么多连接。也许您的服务器上有 256 个 PHP 子节点,而这可能会减少 12 个子节点。更多的孩子!= 更快的反应。如果你有 12 个 PHP 孩子,也许你只需要 13 个数据库连接。

    119% 显然太高了,但我认为 96% 也太高了。 (这就是为什么我在这里寻找最好的 % 来使用。)显然操作系统也需要一些内存。你应该为你的操作系统留下多少未使用的内存,我想知道!如果还没有被问到,我会在这里作为一个单独的问题问这个问题。 (如果您这样做,请在此处发布链接。)或者您可以只听mysqltuner的推荐。

    这里只是测试:

    [!!] Maximum possible memory usage: 3.4G (88% of installed RAM)

    再次降低 my.cnf 设置。

    [!!] Maximum possible memory usage: 3.3G (86% of installed RAM)

    还是太高了?

    [OK] Maximum possible memory usage: 3.2G (83% of installed RAM)

    【讨论】:

    • 请考虑在未来发布完整的 MySQLTuner 报告。包含许多详细信息以记录更多配置/环境特定信息。有些建议不应执行。例如,innodb_buffer_pool_size 大于 TOTAL 可用 RAM。在所有配置更改中都要谨慎,慢慢来。
    【解决方案2】:

    从 mysqltuner 那里得到一些建议。它对最大可能的内存使用量做出了错误的估计。而且它无法做出正确的估计。

    请参阅http://www.percona.com/blog/2009/02/12/how-much-memory-can-mysql-use-in-the-worst-case/ 了解说明。

    确实,每个连接都会使用一些内存,但多少会有所不同。您不会总是使用 300 个连接,即使它们在使用,它们也不会总是同时运行查询,即使它们是,查询也不会总是使用所有可能的缓冲区到最大大小。

    Mysqltuner 警告理论上的最大内存使用量永远不会发生。

    另一种看待它的方式:我分析了数百个 MySQL 配置,每一个理论上可以分配比服务器上的物理 RAM 更多的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2019-02-26
      • 2011-06-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多