我正在尝试优化我在2GB内存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)
答案 0 :(得分:2)
“[!!] Maximum possible memory usage: 2.2G (119% of installed RAM)
”
这意味着你基本上骗了MySQL,告诉你你有比现有更多的内存,2.2G> 2G。这可能会持续数周或数月,但这是一个坏主意。如果MySQL没有你告诉它使用的内存,那么MySQL会在最糟糕的时候随机崩溃。
如果在/etc/my.cnf文件中添加“skip-innodb”,可能会节省一些内存。我假设你没有使用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)
”
答案 1 :(得分:0)
从mysqltuner那里得到一些建议。它对最大可能的内存使用量做出了错误的估计。它无法做出正确的估算。
请参阅http://www.percona.com/blog/2009/02/12/how-much-memory-can-mysql-use-in-the-worst-case/以获取解释。
确实,每个连接使用一些内存,但有多少变化。你不会总是有300个连接在使用,即使它们是,他们也不会同时运行查询,即使它们是,查询也不会总是使用所有可能的缓冲区达到最大尺寸。
Mysqltuner警告说理论上最大的内存使用量永远不会发生。
另一种看待它的方式:我已经分析了数百种MySQL配置,并且它们中的每一个理论上可以分配比服务器上的物理RAM更多的内存。