4

我正在尝试调整我的 Magento DB 以获得最佳性能。

我在 4GB RAM、8CPU 核心虚拟机和 4GB RAM 上运行 nginx、php-fpm 和 mysql。

我已经运行了 Mysql Tuning Primer,除了我的表缓存之外,一切看起来都不错:

TABLE CACHE
Current table_open_cache = 1000 tables
Current table_definition_cache = 400 tables
You have a total of 2510 tables
You have 1000 open tables.
Current table_cache hit rate is 3%
, while 100% of your table cache is in use
You should probably increase your table_cache
You should probably increase your table_definition_cache value.

和来自 mysqltuner

[!!] Table cache hit rate: 9% (1K open / 10K opened)
[!!] Query cache efficiency: 0.0% (0 cached / 209 selects)

my.cnf 文件中的相关设置:

table_cache            = 1000
query_cache_limit = 1M
query_cache_size        = 64M

问题是,无论我将 table_cache 增加到什么 - 它似乎几乎立即被消耗掉。这对 Magento 来说正常吗?好像异常高?

有人对我可以做些什么来改善这一点有任何建议吗?

谢谢,

埃德

4

1 回答 1

1

检查您的 MySQL 配置的查询缓存类型设置:

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_query_cache_type

如果您将其设置为 0 或 2,那么它将不缓存任何查询或仅缓存您特别要求缓存的查询。这意味着 Magento 必须明确要求缓存的查询结果(我不确定它是否这样做)。如果您将其设置为 1,那么它将缓存所有查询,除了那些明确要求没有查询缓存的查询。

表缓存是指潜在的打开文件指针。它可以很快被消耗,并且会根据需要滚动未使用的条目。来自MySQL 的文档

table_cache 和 max_connections 系统变量影响服务器保持打开的最大文件数。如果您增加这些值中的一个或两个,您可能会遇到操作系统对每个进程打开文件描述符的数量施加的限制。许多操作系统允许您增加打开文件的限制,尽管方法因系统而异。请查阅您的操作系统文档以确定是否可以增加限制以及如何增加限制。

table_cache 与 max_connections 有关。例如,对于 200 个并发运行的连接,您的表缓存大小应至少为 200 * N,其中 N 是您执行的任何查询中每个连接的最大表数。您还必须为临时表和文件保留一些额外的文件描述符。

确保您的操作系统可以处理 table_cache 设置所暗示的打开文件描述符的数量。如果 table_cache 设置得太高,MySQL 可能会耗尽文件描述符并拒绝连接,无法执行查询,并且非常不可靠。您还必须考虑到 MyISAM 存储引擎需要两个文件描述符用于每个唯一的打开表。您可以使用 mysqld 的 --open-files-limit 启动选项来增加 MySQL 可用的文件描述符的数量。请参见第 C.5.2.18 节,“未找到‘文件’和类似错误”。

打开表的缓存保持在 table_cache 条目的级别。默认值为 64;这可以通过 mysqld 的 --table_cache 选项进行更改。请注意,MySQL 可能会暂时打开比这更多的表来执行查询。

MySQL 在以下情况下关闭未使用的表并将其从表缓存中删除:

当缓存已满并且线程尝试打开不在缓存中的表时。

当缓存包含多个 table_cache 条目并且缓存中的表不再被任何线程使用时。

当发生表刷新操作时。当有人发出 FLUSH TABLES 语句或执行 mysqladmin flush-tables 或 mysqladmin refresh 命令时,就会发生这种情况。

当表缓存填满时,服务器使用以下过程来定位要使用的缓存条目:

当前未使用的表被释放,从最近最少使用的表开始。

如果需要打开一个新表,但缓存已满,无法释放任何表,则根据需要临时扩展缓存。当缓存处于临时扩展状态并且表从使用状态变为未使用状态时,表将关闭并从缓存中释放。

于 2012-10-11T16:35:10.353 回答