在Serverfault上有这个问题几天没有运气。
我在VPS上运行了mysqltuner.pl,对于要更改的变量的建议有很多问题。我确信这些都是复杂答案的一般性问题。
我不知道如何编写查询并对服务器进行测试,但我只是试图从运行五个WordPress网站的服务器中获得更多性能,每月页面浏览量超过200,000次。
我已经通过phpmyadmin优化了数据库(并定期这样做),但调谐器仍然说有碎片表。因为这是WordPress,我无法在核心代码中更改查询。
但是我应该增加多少变量,如query_cache_size和innodb_buffer_pool_size?其他innodb变量怎么样?
my.cnf中存在一些建议的变量,例如table_cache,并在调谐器报告等中标记。我可以将它们添加到my.cnf吗?
(为什么这个块在my.cnf中重复?我可以删除副本吗?)
set-variable = innodb_buffer_pool_size=2M set-variable = innodb_additional_mem_pool_size=500K set-variable = innodb_log_buffer_size=500K set-variable = innodb_thread_concurrency=2
下面是my.cnf和mysqltuner的输出:
my.cnf的内容:
query-cache-type = 1
query-cache-size = 8M
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
skip-bdb
set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-bdb
set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2
mysqltuner的输出:
------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.45
[!!] Switch to 64-bit OS - MySQL cannot currently use all of your RAM
-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 133M (Tables: 637)
[--] Data in InnoDB tables: 10M (Tables: 344)
[--] Data in MEMORY tables: 126K (Tables: 2)
[!!] Total fragmented tables: 69
-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 6h 24m 13s (2M q [22.135 qps], 116K conn, TX: 4B, RX: 530M)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 35.0M global + 2.7M per thread (100 max threads)
[OK] Maximum possible memory usage: 303.7M (8% of installed RAM)
[OK] Slow queries: 0% (4/2M)
[OK] Highest usage of available connections: 53% (53/100)
[OK] Key buffer size / total MyISAM indexes: 8.0M/46.1M
[OK] Key buffer hit rate: 99.6% (749M cached / 2M reads)
[OK] Query cache efficiency: 32.2% (685K cached / 2M selects)
[!!] Query cache prunes per day: 948863
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 660K sorts)
[!!] Temporary tables created on disk: 46% (400K on disk / 869K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 24K opened)
[OK] Open file limit used: 10% (109/1K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[!!] InnoDB data size / buffer pool: 10.6M/2.0M
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Enable the slow query log to troubleshoot bad queries
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
query_cache_size (> 8M)
tmp_table_size (> 32M)
max_heap_table_size (> 16M)
thread_cache_size (start at 4)
table_cache (> 64)
innodb_buffer_pool_size (>= 10M)
答案 0 :(得分:21)
我会尽我所能来帮助。 MysqlTuner报告暗示你在这个VPS中有4GB的RAM,所以我的建议就是基于此。
query_cache_size - 这是MySQL可用于缓存数据库查询结果的RAM量。存储在查询缓存中的结果比正常选择返回的速度快得多,因此该变量可以显着加快速度(比任何其他建议的更改更快)。
正确的价值是什么,你需要做一些实验。您目前将此设置为8M。如果你在这个盒子里有4GB的RAM,我将从64M开始,增加到128M,然后根据需要增加到256M。每次更改后,将事物保留几天,然后再次运行MysqlTuner,并将“查询缓存效率”的百分比与之前的百分比进行比较。对于主要托管5个Wordpress博客的服务器,我怀疑你会看到超过256M的任何改进,我不建议超过总RAM的八分之一。
就我个人而言,我发现Munin(一个免费的服务器监控工具)非常方便用于关注这类事情,因为它会绘制缓存命中与其他查询的关系。
tmp_table_size - 对于一些复杂的查询(特别是那些使用GROUP BY或复杂排序的查询),MySQL需要首先创建一个包含数据的临时表,然后对其运行一些操作以创建结果集。它将尝试在内存中创建这些临时表,因为这比在磁盘上创建它们要快得多;但对于大型结果集,这并不总是可行的。 tmp_table_size控制此阈值。
我无法想象Wordpress正在进行任何非常复杂的查询,所以我不会过分使用这个查询。 MysqlTuner建议值大于32MB,因此从64M开始,看看这会影响几天后“在磁盘上创建的临时表”值。正如你建议的那样设置max_heap_table_size。
thread_cache_size - 默认情况下,Wordpress不使用持久连接(这很好),因此每个请求都会与数据库建立新连接,然后在生成页面后关闭此连接。这种开销并不重要,但使用thread_cache_size允许MySQL重用这些连接线程,这将有所帮助。
我会使用建议的值4,除非你得到大量并发用户,否则我认为这样会很好。
table_cache - 我对这个有点朦胧,似乎与MySQL的表结构缓存有关。为此,我会选128。
innodb_buffer_pool_size - 这是MySQL可用于缓存InnoDB表的索引和数据的内存量。这个让我感到困惑,因为我认为Wordpress根本不使用InnoDB - 你在这台服务器上还有其他网站吗?
要回答您的其他问题,[mysqld_safe]
之后的配置仅适用于安全模式下的MySQL守护程序,而不是MySQL整体,这就是为什么某些变量重复的原因。如果您确实更改了innodb_buffer_pool_size,则需要更改第一个。你可以添加的文件中没有变量,是的,但是出于同样的原因将它们添加到[mysqld_safe]块之上。
最后,既然你有优化的心情,如果你还没有使用像APC那样的PHP字节码缓存,那么这值得探讨。 APC可以对PHP应用程序进行一些显着的速度改进,而不会产生任何负面影响。
答案 1 :(得分:3)
有更多工具可以调整你的mysql数据库:http://www.day32.com/MySQL/ 和http://www.maatkit.org/doc/和http://hackmysql.com/mysqlsla
在大多数情况下,您不需要编写查询并针对服务器测试它们。 只需启用慢速查询日志来识别慢速查询,使用mysqlsla聚合它们并用maatkit解释它们:
您可以将mysqla结果中最慢的查询粘贴到文本文件中,然后使用maatkit执行它们。
mk-visual-explain –host hostname –user username –password passwort –database \
databasename -c query1.sql >> query1_data.txt
-
mk-query-profiler –host hostname –user username –password passwort –database \
databasename query1_data.txt >> query1_data.txt
经常使用较新的mysql版本对性能至关重要。我经历过,比较例如mysql 5.0.23到5.1.4时,复杂查询的执行计划是非常不同的。使用5.1.4,它们在我们的环境中执行得更快。
有关mysql的大量有用信息可以在http://www.mysqlperformanceblog.com/和“高性能MySQL”一书中找到。
Tabe缓存: 根据书中“表缓存存储表示表的对象。缓存中的每个对象都包含关联表的解析.frm文件加上其他数据,具体取决于表的存储引擎。
表缓存的设计是以MyISAM为中心的 - 由于历史原因,这是服务器和存储引擎之间的分离不完全清洁的区域之一。表缓存对于InnoDB来说不那么重要,因为InnoDB并不依赖它来实现多种用途(例如保存文件描述符;为此目的,它有自己的表缓存版本)。但是,即使InnoDB也可以从缓存解析的.frm文件中获益。“。
如果您提升表缓存,则可能存在打开文件限制的错误。您还需要增加服务器上的open_files_limit变量以及操作系统打开文件限制:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/。
线程缓存:
线程缓存包含当前未与连接关联但准备提供新连接的线程。只要MySQL在缓存中有一个空闲线程,它就可以非常快速地响应连接请求,因为它不必为每个连接创建一个新线程。
[!!]在磁盘上创建的临时表:46%(磁盘上400K /总计869K) 如果尚未设置tmp_table_size和max_heap_table_size,请增加它们。与RAM操作相比,磁盘操作非常慢。 wordpress会使用大量的blob / text列吗?那么你不会看到太多的好处,因为内存表中不允许使用BLOB和Text列。
[确定]可用连接的最高使用率:53%(53/100) 要节省RAM,您可以减少允许的最大连接数。另一方面,您可能会在高峰时段耗尽连接。
使用PHP的操作码缓存是一个非常好的主意!
答案 2 :(得分:0)
我为WP调试MySQL的建议:
应定期优化数据库表(并在必要时进行修复)以获得最佳性能。
我建议使用WP-DBManager插件,它提供此功能以及数据库备份,这对于任何博客安装都至关重要。
WP-DBManager允许您安排和忘记,它将自动处理所有工作。
其他选择是通过phpmyadmin等工具手动优化和修复您的表格。
MySQL查询缓存会在查询再次出现时保存查询结果。但是,它只知道如何保存查询的字节文本,而不是它们的编译版本,因此对查询的小改动将创建不同的缓存条目。如果您在每个查询中都没有唯一ID,请启用此选项。您可以通过将以下内容添加到/etc/my.cnf来启用它:
query_cache_type = 1
query_cache_size = 26214400
答案 3 :(得分:0)
这不是您问题的直接答案,但根据我的经验,wordpress可以非常使用前端服务器上的缓存进行优化。另外,wordpress似乎在不在数据库上的前端机器上受CPU限制。 (您可能需要仔细检查确实是在优化瓶颈)。
例如,查看“w3 total cache”。与APC一起使用应该是最简单的方法。请确保您查看apc.shm_size(在php.ini中)和缓存命中率的大小(某些apc info实用程序应与w3tc一起提供)。
我已经看到wordpress实例在具有该设置的单个服务器上平稳运行,并且每月的页面浏览量超过200,000次。
答案 4 :(得分:0)
This should help,比尝试更改my.cnf
更容易