同時線上訪問量繼續增大 對於1G記憶體的伺服器明顯感覺到吃力嚴重時甚至每天都會死機 或者時不時的伺服器卡一下 這個問題曾經困擾了我半個多月MySQL使用是很具伸縮性的演算法,因此你通常能用很少的記憶體運行或給MySQL更多的被存以得到更好的效能。 安裝好mysql後,配製檔案應該在 /usr/local/mysql/share/mysql目錄中,配製檔案有幾個,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網站和不同配製的伺服器環境,當然需要有不同的配製檔案了。 一般的情況下,my-medium.cnf這個配製檔案就能 滿足我們的大多需要;一般我們會把設定檔拷貝到/etc/my.cnf 只需要修改這個設定檔就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的參數,有3個配置參數是最重要的,即key_buffer_size,query_cache_size,table_cache。 key_buffer_size只對MyISAM表起作用, key_buffer_size指定索引緩衝的大小,它決 定索引處理的速度,尤其是索引讀的速度。一般我們設為16M,實際上稍微大一點的網站 這個數字是遠遠不夠的,通過檢查狀態值 Key_read_requests和 Key_reads,可以知道key_buffer_size設定是否合理。比例key_reads / key_read_requests應該儘可能的低,至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。 或者如果你裝了phpmyadmin 可以通過伺服器運行狀態看到,筆者推薦用phpmyadmin管理mysql,以下的狀態值都是本人通過phpmyadmin獲得的執行個體分析: 這個伺服器已經運行了20天
key_buffer_size – 128M key_read_requests – 650759289 key_reads - 79112 |
比例接近1:8000 健康情況非常好 另外一個估計key_buffer_size的辦法 把你網站資料庫的每個表的索引所佔空間大小加起來看看以此伺服器為例:比較大的幾個表索引加起來大概125M 這個數字會隨著表變大而變大。 從4.0.1開始,MySQL提供了查詢緩衝機制。使用查詢緩衝,MySQL將SELECT語句和查詢結果存放在緩衝區中,今後對於同樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。根據MySQL使用者手冊,使用查詢緩衝最多可以達到238%的效率。 通過調節以下幾個參數可以知道query_cache_size設定得是否合理
Qcache inserts Qcache hits Qcache lowmem prunes Qcache free blocks Qcache total blocks |
Qcache_lowmem_prunes的值非常大,則表 明經常出現緩衝不夠的情況,同時 Qcache_hits的值非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小Qcache_hits的值不大,則表明你的查詢重複率很低,這種 情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩衝。 Qcache_free_blocks,如果該值非常大,則表明緩衝區中片段很多query_cache_type指定是否使用查詢緩衝 我設定: query_cache_size = 32M query_cache_type= 1 得到如下狀態值: Qcache queries in cache 12737 表明目前緩衝的條數 Qcache inserts 20649006 Qcache hits 79060095 看來重複查詢率還挺高的 Qcache lowmem prunes 617913 有這麼多次出現緩衝過低的情況 Qcache not cached 189896 Qcache free memory 18573912 目前剩餘緩衝空間 Qcache free blocks 5328 這個數字似乎有點大 片段不少 Qcache total blocks 30953 如果記憶體允許32M應該要往上加點 table_cache指定表快取的大小。每當 MySQL訪問一個表時,如果在表緩衝區中還有空間,該表就被開啟並放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值 Open_tables和 Opened_tables,可以決定是否需要增加table_cache的值。如果你發現open_tables等於table_cache,並且 opened_tables在不斷增長,那麼你就需要增加table_cache的值了(上述狀態值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設定成很大的值。如果設定得太高,可能會造成檔案描述符不足,從而造成效能 不穩定或者串連失敗。 對於有1G記憶體的機器,推薦值是128-256。 筆者設定table_cache = 256 得到以下狀態: Open tables 256 Opened tables 9046 雖然open_tables已經等於 table_cache,但是相對於伺服器已耗用時間來說,已經運行了20天,opened_tables的值也非常低。因此,增加table_cache 的值應該用處不大。如果運行了6個小時就出現上述值 那就要考慮增大table_cache。 如果你不需要記錄2進位log 就把這個功能關掉,注意關掉以後就不能恢複出問題前的資料了,需要您手動備份,二進位日誌包含所有更新資料的語句,其目的是在恢複資料庫時用它來把資料盡 可能恢複到最後的狀態。另外,如果做同步複製( Replication )的話,也需要使用二進位記錄傳送修改情況。 log_bin指定記錄檔,如果不提供檔案名稱,MySQL 將自己產生預設檔案名稱。MySQL會在檔案名稱後面自動添加數字引,每次啟動服務時,都會重建一個新的二進位檔案。此外,使用log-bin- index可以指定索引檔案;使用binlog-do-db可以指定記錄的資料庫;使用binlog-ignore-db可以指定不記錄的資料庫。注意的 是:binlog-do- db和binlog-ignore-db一次只指定一個資料庫,指定多個資料庫需要多個語句。而且,MySQL會將所有的資料庫名稱改成小寫,在指定資料 庫時必須全部使用小寫名字,否則不會起作用。 關掉這個功能只需要在他前面加上#號 #log-bin 開啟慢查詢日誌( slow query log ) 慢查詢日誌對於跟蹤有問題的查詢非常有用。它記錄所有查過long_query_time的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個慢查詢日誌的例子: 開啟慢查詢日誌,需要設定參數log_slow_queries、long_query_times、log-queries-not-using-indexes。 log_slow_queries指定記錄檔,如果不提供 檔案名稱,MySQL將自己產生預設檔案名稱。long_query_times指定慢查詢的閾值,預設是10秒。log-queries-not- using-indexes是 4.1.0以後引入的參數,它指示記錄不使用索引的查詢。筆者設定long_query_time=10 筆者設定:
sort_buffer_size = 1M max_connections=120 wait_timeout =120 back_log=100 read_buffer_size = 1M thread_cache=32 interactive_timeout=120 thread_concurrency = 4 |
參數說明: back_log 要求MySQL能有的串連數量。當主要MySQL線程在一個 很短時間內得到非常多的串連請求,這就起作用,然後主線程花些時間(儘管很短)檢查串連並且啟動一個新線程。back_log值指出在MySQL暫時停止 回答新請求之前的短時間內多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多串連,你需要增加它,換句話說,這值對到來的TCP/IP串連的 偵聽隊列的大小。你的作業系統在這個隊列大小上有它自己的限制。 Unix listen(2)系統調用的手冊頁應該有更多的細節。檢查你的OS文檔找出這個變數的最大值。試圖設定back_log高於你的作業系統的限制將是無效 的。 max_connections 並發串連數目最大,120 超過這個值就會自動回復,出了問題能自動解決 thread_cache 沒找到具體說明,不過設定為32後 20天才建立了400多個線程 而以前一天就建立了上千個線程 所以還是有用的 thread_concurrency #設定為你的cpu數目x2,例如,只有一個cpu,那麼thread_concurrency=2 #有2個cpu,那麼thread_concurrency=4 skip-innodb #去掉innodb支援 (閱讀次數: 1115) |