1

我正在尝试优化我在 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)
4

2 回答 2

2

" [!!] 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)"

于 2013-07-13T23:50:20.510 回答
0

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

有关说明,请参见http://www.percona.com/blog/2009/02/12/how-much-memory-can-mysql-use-in-the-worst-case/

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

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

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

于 2014-10-06T06:29:27.057 回答