程序员 linux google 编程 java 开源 Python Firefox Android 微软 wordpress shell apache Ubuntu centos 云计算 Windows php nginx mysql

性能調優概述,這是一篇最通俗易懂的性能調優總結

概述

在這篇博文中,我不想用一些抽象的概念去說性能調優的問題,只想用最通俗的語言盡量來準確的表達我的想法。

由於本人水平有限,有什麽不對或者不清楚的地方歡迎大家交流指正。為了更能通俗易懂的理解我們即將要的性能調優的話題,我在這裏簡單的和大家說一下我寫這篇文章的寫作方法 5w+1h方法。

註,5w+1h就是對所做工作進行科學的分析,對某一工作在調查研究的基礎上:

就其工作內容(What)
責任者(who)
工作崗位(Where)
工作時間(When
怎樣操作(How
以及為何這樣做(Why)
即”5W”、”1H”進行書面描述,並按此描述進行操作,達到完成職務任務的目標。(來源“百度百科”)

哈哈!聽過馬哥課程的一定不陌生!

二、什麽是性能調優?(what)

在說什麽是性能調優之前,我們先來說一下,計算機的體系結構。

如上圖,簡單來說包括三塊:硬件、操作系統、應用程序。其實,性能調優就是調節這些內容,包括硬件、操作系統、應用程序。其中,這三大方面中又包含了若幹的內容。

硬件包括:CPU、內存、磁盤、網卡、其它……,

操作系統包括 進程、虛擬內存、文件系統、網絡、其它……,

應用程序我就不用說了大家都懂,常見的有Apache、mysqlNginx、Memcahed等。

那什麽是性能調優呢?

性能調優就是對計算機硬件、操作系統和應用有相當深入的了解,調節三者之間的關系,實現整個系統(包括硬件、操作系統、應用)的性能最大化,並能不斷的滿足現有的業務需求。這就是我們說的性能調優,客官你懂了嘛?

三、為什麽需要性能調優?(why)

下面我們來說一說為什麽需要性能調優,其實說到底就兩原因:一是為了獲得更好的系統性能(就是你現有的系統運行的還不錯,但優化一下可以運行的更好)。二是通過性能調優來滿足不斷增加的業務需求。為了更直觀的幫助大家來理解為什麽要性能調優?我們分別從三個方面來說:

硬件選型(根據服務器應用類型來選購服務器)
操作系統發行版本 (選擇發行版本)
應用程序 (Nginx、MySQL等)
1.硬件選型

不管你是租服務器也好還是自己買服務器也好都要遇到一個問題,我們選擇什麽樣硬件配置的服務器。

一般我們是根據應用類型來選擇服務器,因為你不可能一種硬件配置來滿足所有的應用需求,因為每個應用的具體需求不一樣。下面我們來看一下在項目實施中有哪些應用類型:

負載均衡:性能要求相對較低,因為只負責轉發數據,但要保證選一性能突出的網卡即可。(推薦配置:CPU E5620 x 1 內存 8G 硬盤 500G(RAID5))
Web 服務器:一般只處理一些靜態頁面或者圖片等,因此要求也不是很高,主流的服務器都可以。(推薦配置:CPU E5620 x 1 內存 16G 硬盤 500G(RAID5))
應用服務器:一般應用程序服器,他承擔網站功能的實現,在架構中占有比較重的位置,特別是網站架構中只有一臺應用服務器,對CPU、內存、磁盤要求都比較高。(推薦配置:CPU E5620 x 2 內存 32G 硬盤 500G(RAID10))
緩存服務器:分為前端頁面緩存與後面數據緩存,他們典型的應用分別是Varnish與Memcached,對內存的要求比較大,一般我們配置服務器時使用較大有內存。(推薦配置:CPU E5620 x 1 內存 32G 硬盤 500G(RAID10))
數據庫服務器:數據服務器對CPU、內存、磁盤的要求都很高,一但某個硬件是短板都會帶來性能問題。(推薦配置:CPU E5620 x 2 內存 64G 固態硬盤 500G(RAID10))
備份服務器:備份服務器一般就沒有什麽要求,但有點可以肯定是必須有足夠大的硬盤空間。(推薦配置:CPU E5620 x 1 內存 4G 硬盤 2TB(RAID5))
監控服務器:一般也沒什麽需要,普通的PC服務器就可以。(推薦配置:CPU E5620 x 1 內存 4G 硬盤 500(RAID5))
其它服務器:至於其它服務器就看各位的具體需要具體分析了。
這下各位知道什麽是硬件的性能調優了吧,根據你具體的應用,進行具體分析特別是像MySQL這樣的服務器,對CPU、內存、磁盤要求都比較高。

所以,對硬件的性能調優我們必須做到選擇合適的硬件配置。這是網站架架構或者項目實施首先要解決的問題!

2.操作系統

有本書叫《Linux Performance Tuning》(Linux 性能調優)這本書是老外寫的,作者是 Fernando Apesteguia 。

為什麽我們需要性能調優?他得出的結論是這樣的:

“當一個發行版打包發送到客戶手中的時候,它是為了完全兼容市場中大部分計算機而設計的。這是一個相當混雜的硬件集合(硬盤,顯卡,網卡,等等)。

所以Red Hat,SUSE,Mandriva,Ubuntu和其他的一些發行版廠商選擇了一些保守的設置來確保安裝成功。”

簡單說,你的操作系統已經運行的不錯了,但是你可以調節它獲得更高的性能,比如你有個高性能的磁盤,但你的操作系統中一些選項參數默認沒有啟動,就不能實現這些高級功能來提高硬盤性能。

還有我想說就是對操作系統發行版選擇的問題,RedHat或CentOS這些操作系統在項目實施或網站架構中用的比較多,主要針對企業應用而開發的操作系統。

而Ubuntu之類的操作系統對桌面支持的比較好,所以選擇發行版本時得註意。(一般企業中用的比較多的是CentOS)再有就是我們一般不要選擇最新的發行版,因為剛出來的發行版相對來說bug還比較多,不要先當“小白鼠”了,

比如:剛剛出來CentOS 7 等過一段時間穩定了再使用,目前我們可以選擇 CentOS 6.4 或 6.5即可。

(但新版本也有很多好處,新版本中加入了很多新功能,去掉習已知bug,對於一些不重要的應用,可嘗試使用新的操作系統)

3.應用程序

最後,我們得來說說應用程序了,我們先來簡單看到一下Apache的MPM配置文件:

prefork 模型:


 
  1. <IfModule prefork.c> 
  2. StartServers 8 
  3. MinSpareServers 5 
  4. MaxSpareServers 20 
  5. ServerLimit 256 
  6. MaxClients 256 
  7. MaxRequestsPerChild 4000 
  8. </IfModule> 

大家可以從上面的配置文件中可以看出,apache 開始啟動時啟用 8個進程,最小 5個進程,最大20個進程,每個進程限制請求數為256個,最多可以接受請求 4000個,超過這個限制數自動銷毀。

worker 模型:


 
  1. <IfModule worker.c> 
  2. StartServers 2 
  3. MaxClients 150 
  4. MinSpareThreads 25 
  5. MaxSpareThreads 75 
  6. ThreadsPerChild 25 
  7. MaxRequestsPerChild 0 
  8. </IfModule> 

在看一下,worker模型的配置文件,默認啟動2個進程,每個進程可以接受的請求為150個,每個進程中最小線程數25個,最大線程數為75個,默認線程數25個,每個線程可以接受的請求沒有限制為0。

好了,大家看完上面的配置文件,可以看出默認的Apache配置文件,設置的比較保守,只適於一些中小網站,想要獲得高性能的Apache服務器還必須進行性能調優,包括apache編譯選項,配置文件優化等,具體的調優我們在這裏先不細說。

通過我們上面的講解,我們分別從硬件、操作系統、應用程序,這三個方面入手和大家談談為何需要性能調優,相信大家已經知道並了解,相信大家都迫不及待了吧。

嘿嘿,我們先不急還有很多問題沒有說清楚,下面我們和大家來說說,什麽時候需要性能調優?

四、什麽時候需要性能調優?(when)

一般分為兩個時間段:

上線前(基本優化)
上線後(持續優化)
為什麽這樣說呢,一般我們在項目實施到項目上線這段時間,不但要準備硬件服務器、安裝操作系統、環境搭建,還有個很重要的問題就是進行性能優化,包括操作系統優化和應用環境優化等,我稱上線前的優化為基本優化也稱為經驗優化。

根據你做過的項目和你工作中的經驗對上線前的服務器或架構進行基本的性能優化來滿足業務需求。

再有就是項目上線後的優化,在上線前我們已經經過基本的性能優化,解決大部分的性能問題,但畢竟上線前的所以測試都是模擬測試並進行相關的性能優化,與上線後的真實環境還是有相當大的區.

我們首先要做的就是對上線後的項目進行性能監控包括服務器性能監控和服務性能監控。

服務器性能監控包括:

CPU使用率、CPU負載、內存使用率、磁盤I/O、磁盤空間使用率、網絡流量、系統進程等,服務性能監控包括apache、nginx、mysql。

以上架構中所有的服務都需要進行性能監控,一但發現有問題我們都得去進行性能優化,在這個過程中我稱為持續優化也稱為監控優化。下面我們來具體的說一下,具體什麽地方需要性能調優?

五、什麽地方需要性能調優?(where)

在上面我們說性能調優只說一些大的方面,包括硬件、操作系統、應用程序這三大塊。

其實還有一塊就是程序本身的優化,開發人員根據需求開發出來的程序本身就需要性能優化,但對於我們運維人員來說接觸的比較少而已。下面我們就來看看這三大塊:

硬件 (CPU、內存、磁盤、網卡)
操作系統(進程、文件系統、內核 ……)
應用程序(Nginx、MySQL ……)
1.硬件

硬件優化一般也包括兩塊:

上線前(硬件選型)
上線後(硬件擴展)
一般項目搭建時都需要根據具體的應用進行硬件配置選型,在這方面需要一定的運維經驗剛接觸的朋友可以在這方面有點欠缺,但沒事一般做過一兩個項目以後,對硬件配置選型也就會了,嘿嘿。

但有個不成文的經驗,硬件配置還是越高越好(別說是我說的)。

我們為什麽說需要根據具體的應用來選型呢,一方是什麽樣的應用需要什麽樣的硬件配置,還有點很重要就是節約成本,錢得要在刀刃上不該花的錢我們不能亂花,也是為公司節約成本,實現資源利用最大化。

上面我們說的是項目搭建初期,你運氣比較好項目一開始你就在這邊。

一般有經驗的運維工程師在硬件選型是不會有問題的,所以我們在性能優化時就不考慮硬件這塊,從理論上講我們服務器硬件配置一般不會出現在這種性能問題上。

但是呢,由於我們業務做的越來越好,項目創建初期沒有考慮到會有這麽大的性能需要(訪問量),現在有的硬件不能滿足業務需求,所我們這時需要更換更好的CPU、更大的內存和更快的磁盤。

至於如何找出硬件是性能瓶頸我們先在這裏不細說,在後面的文章中我們將會細說。最後我們來看一張硬件架構圖,能幫你更好的理解硬件優化,如下圖(Dell R 710 架構):

2.操作系統

下面我們來說操作系統,其實絕大部分的優化都在操作系統和應用程序的優化,除了上線前的硬件選型和上線後的硬件擴展,下面我們就來看看操作系統優化包括哪些:

操作系統安裝優化
系統初始化
進程調優
內存調優
IO 調優
文件系統調優
網絡調化
下面我們來看一張圖,可以更直觀的幫且我們理解,如下圖:

3.應用程序

最後我們來說說應用程序優化,這裏我們來說一下MySQL優化例子,讓大家更直觀的了解。

MySQL 編譯安裝優化
MySQL 配置文件優化
索引優化
MySQL 引擎優化
查詢緩存優化
SQL 語句優化
優化表類型(MyISAM或InnoDB)
鎖機制優化
MySQL 服務器優化(換SSD)
通達上面的對硬件、操作系統、應用程序的具體說明相信,大家對性能優化有了更深層次的了解,下面我們來說一個重要的問題,什麽人來進行性能優化?

六、什麽人來進行性能調優?(who)

一說起性能優化我們第一個想到的是運維工程師,他們來進行優化。

其實我想說,這麽說是片面的性能優化不僅僅是運維工程師的事。

其實呢,性能優化是一個團隊的事。我為什麽這麽說呢?

下面我們就來說一下,大家想啊一公司需要做一項目,我們就拿最常見的電子商務中商城的項目來說吧,公司確認由於業務需要我們需要在網上做一個建材商城,那項目的具體流程是什麽呢?可能不是很詳細,但大體過程是樣的:

運營提出需求
產品整理需求
開發開發具體的業務應用
運維搭建開發環境
QA 進行項目測試
運維進行項目上線
監控進行項目監控
開發一個具體的應用需要運營部、產品部、開發部、運維部、QA (測試)、監控等所以有部門的參加。

同樣的一個項目(業務)存在性能問題,不會只是運維部門需要性能調優而是所以部門一起解決這個性能問題,這是缺一不可的。

可能出現在產品,也可能出現在程序上(*.PHP),也可能是業務需要本身就有問題,也可能是運維的環境搭建有問題。但參加性能調優的更多的是開發、運維、測試和監控。

七、怎麽樣進行性能調優?(How)

下面進入正題了我們說一說怎麽進行性能調優,具體步驟如下:

性能指標 –> 確認衡量標準
性能測試 –> 驗證性能指標
性能分析 –> 找出性能瓶頸
性能調優 –> 解決性能問題
性能監控 –> 檢驗調優效果
1.性能指標

上面我們說了,我們優化的目的是為了獲得更好的性能,那麽性能指標是什麽呢?我們怎麽樣來衡量,一般衡量一個項目(這裏指的網站)的指標有三個:

吞吐量 –> 是單位時間內完成的用戶或系統的請求數量。
並發數 –> 同時能接受多少用戶的訪問請求
響應時間 –> 用戶發出請求到收到響應的時間間隔。
2.性能測試

我們做產品或者說項目(更直白的說是網站)目的是為了讓用戶使用,我們得先站在用戶的角度分析一下,用戶需要關註哪些性能。

對於用戶來說,當點擊一個按鈕、鏈接或發出一個操作指令,到系統把請求處理好發給用戶並用網頁的形式展現出來為止,這個過程中所消耗的時間是用戶對這個網站性能的直觀印象。

也就是我們所說的響應時間,當響應時間較小時,用戶體驗相對來說就會好,當然用戶體驗的響應時間包括個人主觀因素和客觀響應時間。

在網站開發與搭建時,我們就需要考慮到如何更好地結合這兩部分達到用戶最佳的體驗。用戶關註的是用戶操作的相應時間。

其次,我們站在運維的角度考慮需要關註的性能點。再次,我們得站在開發(設計)人員角度去考慮網站性能。最後,由QA測試與反饋我們網站性能。

經過上述的說明,我們來測試系統的性能,需要我們收集系統的吞吐量、並發數、響應時間這三個重要的指標。具體步驟是:

確認吞吐量、並發數、響應時間這三個值
找到或開發相應的性能測試工具
進行性能測試
反饋結果並提交測試報告
結果,有兩個一種是達到我們預期的性能目標,這樣我們就不需要性能優化任務完成可以交給運維上線,只需要進行相關的性能監控,方便上線後進行性能優化。

另一種是沒有達到我們預期的目標,我們要查找性能瓶頸並進行性能優化。

3.性能分析

通過上面的性能測試,我們發現網站沒有達到我們預期定義的性能目標,這時我們需要做的就是對現有的系統(服務器)進行監控,包括硬件與軟件監控,為性能調優提供有效的性能監控數據。

下面我們重點來說一下,用什麽工具能找出性能瓶頸:

硬件:

vmstatsariostat檢測是否是CPU瓶頸
free、vmstat檢測是否是內存瓶頸
用iostat檢測是否是磁盤I/O瓶頸
netstat檢測是否是網絡帶寬瓶
操作系統:

進程
文件系統
SWAP 分區
內核參數調整
應用程序(MySQL等):
mysqlreport 性能分析報告
mysqlsla 慢查詢日誌分析
4.性能調優

確定調優目標
具體調優步驟
檢測調優結果
確定調優目標

我們性能優化的目標是網站性能提高10%還是20%,不能老大說今天你給我優化一下網站性能,你就能使用網站性能翻一倍。

首先,你要問他我們需要達到一個怎麽的目標。

然後,我們要了解一下整個環境(架構)包括代碼(當然你需要了解一下業務邏輯,大致了解一下,肯定沒壞處),有時間多和開發溝通一下,問問代碼中有多少坑要填,這很重要。

往往他們優一下代碼中的SQL查詢,比你優化系統多少天都來的有效果,哈哈。

具體調優步驟

如果你不懂系統的參數,你千萬不要對系統的參數進行隨意的改動,不然你會後悔。
每次只對一種系統資源進行系統調試,如CPU、或內存、磁盤。
每次改動盡量少的參數設置,推薦每次修改一個設置。
分析一項系統資源時,使用多種工具,往往有意想不到的結果。
不及勝於過之(寧願少做一點,不要做過頭了,性能已達到要求就不要隨意亂動,做好你的監控)。
檢測調優結果

每次性能調優後必須對性能進程檢測,如Web服務器的ab工具,就是一個很好的檢測工具,每次調優後都能看到具體的變化。

5.性能監控

性能監控這個很重要,具體包括服務器性能監控和具體服務的性能監控。下面我們說一說具體有哪些性能監控指標:

服務器的性能監控

CPU 使用率
CPU負載
內存使用率
磁盤I/O
網絡流量
磁盤空間
系統進程
服務的性能監控(MySQL)

MySQL查詢吞吐率,包括Change DB、Select、Insert、Update、Delete
MySQL持久連接利用率
MySQL查詢緩存空間使用率
MySQL查詢緩存命中率
MySQL緩存查詢數
MySQL索引緩存命中率
MySQL索引讀取統計
MySQL連接吞吐率
MySQL連接緩存命中率
MySQL並發連接數,包括最大允許連接數、實際最大連接數、當前連接數、活躍連接數、緩存連接數
MySQL流量統計
MySQL表統計鎖定
八、總結

在這篇“性能優化概述”的博文中我只是給大家講解一下具體的優化思路,幫助大家理解性能優化,這樣大家更容易理解一些,讓大家知道性能優化並不是傳說中的那麽難,難到不可動手去做,只要我們掌握好方法,什麽難題都可以解決。

延伸阅读

    评论