2012-09-27 82 views
7

我有一些網站PHPMySQL,尤其是運行MediaWiki,我需要提高性能。但是,我只允許使用有限的CPU百分比。緩存是否總能提高性能?

我可以考慮提高性能的最佳方法是啓用緩存。但是,我很困惑:這是否真的提高整體性能或只是提高速度?

我能想到的是,如果緩存將使用文件,那麼獲取這些文件的內容需要更多的處理。如果它使用SQL表,那麼它也需要更多的處理才能查詢這些表,也許時間會更短,但CPU使用率會更高。

這是正確與否?緩存是否會消耗更多的CPU來提供調速結果或者整體提高性能?

+1

那麼你的測量結果顯示了什麼? – arkascha

+0

「特別是MediaWiki」暗示對你的Q是肯定的,但只有正確的緩存。例如默認情況下MW使用innodb,所以MyISAM緩存確實有幫助。閱讀MW緩存頁面。您可以配置一些基於文件的緩存,這對客人(即大多數)訪問者而言,在MW中有很大差異。 – TerryE

+0

您應該可以通過https://www.mediawiki.org/wiki/Manual:Performance_tuning使用MediaWiki,您主要關心的是避免wikitext解析,這很慢並且需要大量的CPU。 – Nemo

回答

4

在最基本的級別上,應該使用緩存來存儲CPU密集型進程的結果。例如,如果您有一個服務器端圖像處理程序可以即時創建圖像(比如縮略圖和較大的預覽),那麼您不希望在每個請求上都發生此操作 - 您希望運行此過程一次並存儲結果;然後,每隔一個請求獲取保存的結果。

這顯然是一個非常簡單的基本緩存描述,在這種情況下使用圖像很好,因爲您不必擔心陳舊的數據,即實際圖像多久變化一次?在你的情況下,數據庫是非常不同的。如果您緩存數據,那麼如何保證您的數據與您的真實數據和您的緩存數據之間不會有瞬間不匹配?查詢數據庫並不總是一項CPU密集型任務(也許您必須考慮數據庫是如何設計索引,表大小等),但在大多數情況下,查詢設計良好的數據庫在磁盤I/O上的密集程度要高於它在CPU週期上。

首先,你需要看看你的數據庫設計,其次是你的查詢。例如你是normalizing your database correctly,當你可以存檔時,你的查詢是否通過大量的數據進行拖拽,你是否在非索引字段上連接表,是否在where子句中查詢可能被索引的字段(IN在這些情況下尤爲糟糕) 。

我建議你弄個query analyzer,花一些時間優化你的表結構和查詢,在查看更劇烈的變化之前找到瓶頸。

0

你需要分析你的樣子,並找出瓶頸正在發生的地方。緩存是頁面加載的最佳類型,它根本不會觸及服務器。您可以構建一個非常簡單的緩存系統,只需15分鐘即可重新載入信息。所以,如果頁面在最近15分鐘內被緩存,它會爲它們提供預先呈現的頁面。該頁面加載一次,它創建一個臨時文件。每15分鐘創建一個新的(如果有人加載該頁面)。

緩存僅存儲服務器已經完成工作的文件。創建該文件的工作已經完成,您只需存儲它。

1

參考:http://msdn.microsoft.com/en-us/library/ee817646.aspx

性能:緩存技術通常用於通過存儲有關數據儘可能接近到數據消費者,從而避免重複的數據創建,處理,運輸,以改善應用程序的性能。例如,將不會更改的數據(例如國家/地區列表)存儲在緩存中,可以通過最大限度地減少數據訪問操作並消除爲每個請求重新創建相同數據的需要,從而提高性能。

可伸縮性:應用程序中的許多用戶和進程通常需要相同的數據,業務功能和用戶界面片段。如果爲每個請求處理這些信息,那麼就會浪費寶貴的資源來重新創建相同的輸出。相反,您可以將結果存儲在緩存中併爲每個請求重新使用它們。這提高了應用程序的可伸縮性,因爲隨着用戶羣的增加,這些任務對服務器資源的需求保持不變。 例如,在Web應用程序中,Web服務器需要爲每個用戶請求呈現用戶界面。您可以將呈現的頁面緩存在ASP.NET輸出緩存中,以用於將來的請求,釋放資源以用於其他目的。

緩存數據還可以幫助擴展數據庫服務器的資源。通過將經常使用的數據存儲在緩存中,可以減少數據庫請求,這意味着可以提供更多的用戶。

可用性:偶爾會向您的應用程序提供信息的服務可能不可用。通過將數據存儲在另一個地方,您的應用程序可以在系統故障(例如網絡延遲,Web服務問題或硬件故障)中存活。例如,每次用戶請求數據存儲區中的信息時,都可以返回信息並緩存結果,並在每個請求上更新緩存。如果數據存儲器變得不可用,則仍然可以使用緩存數據來處理請求,直到數據存儲器恢復聯機爲止。

+3

盡我們最大的尊重,這不僅僅是從這裏複製粘貼的答案:http://books.google.co.uk/books?id=MEOmjpKLmqYC&pg=PA414&lpg=PA414&dq=%22Performance+:+Caching+techniques + +通常+使用%22&source = bl&ots = nqFchRBGQH&sig = jdQfh6sIm17he94PhxlattcXeeM&hl = en&sa = X&ei = yR9kUO-jGefW0QWekoH4DQ& ved = 0CB4Q6AEwAA#v = onepage&q =%22 Performance%20%3A%20Caching%20techniques%20are%20commonly%20used%22&f = false - 如果你打算這麼做,至少應該引用你的來源來給予獎勵。 –

+0

我想提供最好的解決方案。所以我確實在網上衝浪並在這裏提供最好的解決方案。它有意義嗎?你怎麼看 ? –

+0

是的,大約35%的粘貼與回答原始問題有關。 – user989056

0

您使用術語「性能」和「速度」。我假設「性能」與Web服務器上的CPU週期有關,「速度」與將頁面提供給用戶所需的時間有關。您希望通過降低服務頁面所需的CPU週期總數來最大化Web服務器的性能,同時最大限度地提高「速度」(降低服務網頁所需的時間)。

對您而言,好消息是緩存可以同時改善這兩個指標。通過緩存內容,您可以創建一個存儲在緩存中的輸出頁面,並且可以直接爲用戶直接提供服務,而無需重新執行最初創建此輸出頁面的PHP代碼(從而降低CPU週期)。從緩存中獲取緩存頁面比重新執行PHP代碼消耗更少的CPU週期。

對於所有請求該頁面的用戶(例如在wiki中)以及對於通常不會經常更改的頁面的用戶而言,緩存特別適用於網頁,這同樣適用於wiki。

0

「增強性能」聽起來像一些電子郵件,我得到的...

有兩種,這裏發生的事情相互關聯。一個是「服務給定請求需要多長時間?」,另一個是「由於我有限的資源,我可以同時服務多少個請求?」。談論性能時,人們傾向於使用這些概念中的任何一個或兩個。

緩存可以幫助這兩個事情。

最有效的緩存策略使用機器外部的資源來緩存你的東西 - 最明顯的例子是用戶的瀏覽器或CDN。我假設你不能使用CDN,但是通過花費一點努力來設置HTTP緩存頭,你就可以顯着減少服務器對靜態或緩慢資源的請求數量。

對於動態內容(通常是通過查詢數據庫生成的網頁),下一個最有效的緩存策略是緩存頁面(部分)生成的HTML。例如,如果您的主頁上有「最受歡迎的項目」框,則通常會執行一些適度複雜的數據庫查詢,然後會有一些「將數據轉換爲HTML」後端代碼。如果可以緩存HTML,則可以同時保存數據庫查詢和將數據轉換爲HTML的CPU。

如果這不可行,您可以緩存某些數據庫查詢的結果。這有助於減少數據庫負載,並且通常還會減少Web服務器的負載 - 運行數據庫查詢並處理結果所需的代碼通常比從緩存中檢索項目更繁重;因爲速度更快,所以可以更快地處理您的請求,從而更快速地釋放資源。這可以減少服務器對單個請求的負載,從而允許您提供更多併發請求。