2012-10-05 34 views
4

我試圖調整我的Magento數據庫以獲得最佳性能。Magento Mysql調優 - 表緩存

我在4GB內存上運行nginx,php-fpm和mysql,使用4GB內存的8CPU核心虛擬機。

我已經跑了Mysql的優化引物和一切看起來好除了我的表緩存:

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到 - 它似乎是con幾乎立即得到了結論。這對Magento來說是正常的嗎?它看起來異常高?

有沒有人有任何提示,我可以做些什麼來改善這一點?

感謝,

埃德

回答

1

檢查你的MySQL配置的查詢緩存類型設置:

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

如果你將它設置爲0或2,那麼它要麼不緩存任何疑問或只緩存你特別要求緩存的那些。這意味着Magento將不得不明確要求緩存的查詢結果(我不確定它是這樣做的)。如果將其設置爲1,則它將緩存除顯式請求無查詢緩存的查詢以外的所有查詢。

表緩存指潛在的打開文件指針。它可以被快速消費,並且會根據需要滾出未使用的條目。從MySQL's documentation

的中table_cache和max_connections系統變量影響文件服務器保持打開 最大數量。如果您增加這兩個值中的一個或 ,則您可能會針對打開的文件描述符的每進程數限制運行在您的操作系統的限制之下。 許多操作系統都允許您增加打開文件的限制, 儘管方法在系統之間差別很大。請諮詢您的 操作系統文檔,以確定是否有可能 增加限制以及如何操作。

table_cache與max_connections有關。例如,對於200 併發運行連接,您應該有一個至少爲200 * N的表緩存大小爲 ,其中N是您執行的任何查詢的每個連接的最大表數量。您還必須爲臨時表和文件保留一些額外的 文件描述符。

確保您的操作系統可以處理由table_cache設置暗示的開放 文件描述符的數量。如果table_cache設置爲 設置得太高,MySQL可能會耗盡文件描述符並拒絕連接,無法執行查詢並且非常不可靠。你也 必須考慮到MyISAM存儲引擎需要兩個 文件描述符爲每個獨特的開放表。您可以使用 --open-files-limit啓動選項將mysqld增加 可用於MySQL的文件描述符數量。參見C.5.2.18節「找不到文件」和類似的錯誤。

打開表的緩存保存在table_cache條目的級別。 默認值是64;這可以使用--table_cache 選項更改爲mysqld。請注意,MySQL可能暫時打開更多的表格 比執行查詢。

MySQL的關閉未使用的桌子和 從下表緩存中刪除下列情形之一的:

當緩存已滿且一個線程試圖打開一個表,是不是在緩存 。

當緩存包含多個table_cache條目和一個 中的表時,緩存不再被任何線程使用。

發生表沖洗操作時。當有人 發出FLUSH TABLES語句或執行mysqladmin flush-tables 或mysqladmin refresh命令時,會發生這種情況。

當表緩存滿時,服務器使用下列過程 找到一個緩存入口來使用:

表當前沒有使用被釋放,以最近最少使用的 表開始。

如果需要打開新表,但緩存已滿並且沒有可以釋放的表 ,則緩存將根據需要進行臨時擴展。當 緩存處於臨時擴展狀態,並且表從 用於未使用狀態時,該表將關閉並從緩存中釋放。

+0

感謝您的回答喬舒亞,但我不明白這是如何解釋爲什麼表緩存消耗得這麼快? –

+0

似乎表緩存設置並不像人們所期望的那樣直接引用內存;相反,如果我理解正確,它指的是連接數乘以表的數量。看到這個鏈接:http://serverfault.com/questions/78786/tuning-and-understanding-table-cache-in-mysql –

+0

P.S.,我已經更新了我的答案,更全面的解釋。 –