- 什麼是性能調優?(what) - 為什麼需要性能調優?(why) - 什麼時候需要性能調優?(when) - 什麼地方需要性能調優?(where) - 什麼人來進行性能調優?(who) - 怎麼樣進行性能調優?(How) - 總結 # 什麼是性能調優?(what) # ![](http://i. ...
- 什麼是性能調優?(what)
- 為什麼需要性能調優?(why)
- 什麼時候需要性能調優?(when)
- 什麼地方需要性能調優?(where)
- 什麼人來進行性能調優?(who)
- 怎麼樣進行性能調優?(How)
- 總結
# 什麼是性能調優?(what) #
![](http://i.imgur.com/RkFKTz6.jpg)
在說什麼是性能調優之前我們先來說一下,電腦的體繫結構。
如上圖,簡單來說包括三塊:硬體、操作系統、應用程式。其實,性能調優就是調節這些內容,包括硬體、操作系統、應用程式。其中,這三大方面中又包含了若幹的內容。
硬體包括: CPU、記憶體、磁碟、網卡、其它……,
操作系統包括 進程、虛擬記憶體、文件系統、網路、其它……,
應用程式我就不用說了大家都懂,常見的有Apache、MySQL、Nginx、Memcahed等。
那什麼是性能調優呢?
性能調優就是對電腦硬體、操作系統和應用有相當深入的瞭解,調節三者之間的關係,實現整個系統(包括硬體、操作系統、應用)的性能最大化,並能不斷的滿足現有的業務需求。這就是我們說的性能調優,客官你懂了嘛?
# 為什麼需要性能調優?(why) #
下麵我們來說一說為什麼需要性能調優,其實說到底就兩原因:一是為了獲得更好的系統性能(就是你現有的系統運行的還不錯,但優化一下可以運行的更好)。二是通過性能調優來滿足不斷增加的業務需求。為了更直觀的幫助大家來理解為什麼要性能調優?我們分別從三個方面來說:
硬體選型(根據伺服器應用類型來選購伺服器)<br/>
操作系統發行版本 (選擇發行版本)<br/>
應用程式 (Nginx、MySQL等)<br/>
## 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 模型:
<IfModule prefork.c>
StartServers 8
MinSpareServers5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
大家可以從上面的配置文件中可以看出,apache 開始啟動時啟用 8個進程,最小 5個進程,最大20個進程,每個進程限制請求數為256個,最多可以接受請求 4000個,超過這個限制數自動銷毀。
worker 模型:
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</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 架構):
![](http://i.imgur.com/pHb7XaA.jpg)
## 2.操作系統 ##
下麵我們來說操作系統,其實絕大部分的優化都在操作系統和應用程式的優化,除了上線前的硬體選型和上線後的硬體擴展,下麵我們就來看看操作系統優化包括哪些:
- 操作系統安裝優化
- 系統初始化
- 進程調優
- 記憶體調優
- IO 調優
- 文件系統調優
- 網路調化
下麵我們來看一張圖,可以更直觀的幫且我們理解,如下圖:
![](http://i.imgur.com/6qcc4WU.jpg)
## 3.應用程式 ##
最後我們來說說應用程式優化,這裡我們來說一下MySQL優化例子,讓大家更直觀的瞭解。
- MySQL 編譯安裝優化
- MySQL 配置文件優化
- 索引優化
- MySQL 引擎優化
- 查詢緩存優化
- SQL 語句優化
- 優化表類型(MyISAM或InnoDB)
- 鎖機制優化
- MySQL 伺服器優化(換SSD)
通達上面的對硬體、操作系統、應用程式的具體說明相信,大家對性能優化有了更深層次的瞭解,下麵我們來說一個重要的問題,什麼人來進行性能優化?
# 什麼人來進行性能調優?(who) #
一說起性能優化我們第一個想到的是運維工程師,他們來進行優化。
其實我想說,這麼說是片面的性能優化不僅僅是運維工程師的事。
其實呢,性能優化是一個團隊的事。我為什麼這麼說呢?
下麵我們就來說一下,大家想啊一公司需要做一項目,我們就拿最常見的電子商務中商城的項目來說吧,公司確認由於業務需要我們需要在網上做一個建材商城,那項目的具體流程是什麼呢?可能不是很詳細,但大體過程是樣的:
- 運營提出需求
- 產品整理需求
- 開發開發具體的業務應用
- 運維搭建開發環境
- QA 進行項目測試
- 運維進行項目上線
- 監控進行項目監控
- 開發一個具體的應用需要運營部、產品部、開發部、運維部、QA (測試)、監控等所以有部門的參加。
同樣的一個項目(業務)存在性能問題,不會只是運維部門需要性能調優而是所以部門一起解決這個性能問題,這是缺一不可的。
可能出現在產品,也可能出現在程式上(*.php),也可能是業務需要本身就有問題,也可能是運維的環境搭建有問題。但參加性能調優的更多的是開發、運維、測試和監控。
# 怎麼樣進行性能調優?(How) #
下麵進入正題了我們說一說怎麼進行性能調優,具體步驟如下:
- 性能指標 –> 確認衡量標準
- 性能測試 –> 驗證性能指標
- 性能分析 –> 找出性能瓶頸
- 性能調優 –> 解決性能問題
- 性能監控 –> 檢驗調優效果
## 1.性能指標 ##
上面我們說了,我們優化的目的是為了獲得更好的性能,那麼性能指標是什麼呢?我們怎麼樣來衡量,一般衡量一個項目(這裡指的網站)的指標有三個:
- 吞吐量 –> 是單位時間內完成的用戶或系統的請求數量。
- 併發數 –> 同時能接受多少用戶的訪問請求
- 響應時間 –> 用戶發出請求到收到響應的時間間隔。
## 2.性能測試 ##
我們做產品或者說項目(更直白的說是網站)目的是為了讓用戶使用,我們得先站在用戶的角度分析一下,用戶需要關註哪些性能。
對於用戶來說,當點擊一個按鈕、鏈接或發出一個操作指令,到系統把請求處理好發給用戶並用網頁的形式展現出來為止,這個過程中所消耗的時間是用戶對這個網站性能的直觀印象。
也就是我們所說的響應時間,當響應時間較小時,用戶體驗相對來說就會好,當然用戶體驗的響應時間包括個人主觀因素和客觀響應時間。
在網站開發與搭建時,我們就需要考慮到如何更好地結合這兩部分達到用戶最佳的體驗。用戶關註的是用戶操作的相應時間。
其次,我們站在運維的角度考慮需要關註的性能點。再次,我們得站在開發(設計)人員角度去考慮網站性能。最後,由QA測試與反饋我們網站性能。
經過上述的說明,我們來測試系統的性能,需要我們收集系統的吞吐量、併發數、響應時間這三個重要的指標。具體步驟是:
確認吞吐量、併發數、響應時間這三個值
找到或開發相應的性能測試工具
進行性能測試
反饋結果並提交測試報告
結果,有兩個一種是達到我們預期的性能目標,這樣我們就不需要性能優化任務完成可以交給運維上線,只需要進行相關的性能監控,方便上線後進行性能優化。
另一種是沒有達到我們預期的目標,我們要查找性能瓶頸併進行性能優化。
## 3.性能分析 ##
通過上面的性能測試,我們發現網站沒有達到我們預期定義的性能目標,這時我們需要做的就是對現有的系統(伺服器)進行監控,包括硬體與軟體監控,為性能調優提供有效的性能監控數據。
下麵我們重點來說一下,用什麼工具能找出性能瓶頸:
硬體:
- 用vmstat、sar、iostat檢測是否是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表統計鎖定
# 總結 #
在這篇“性能優化概述”的博文中我只是給大家講解一下具體的優化思路,幫助大家理解性能優化,這樣大家更容易理解一些,讓大家知道性能優化並不是傳說中的那麼難,難到不可動手去做,只要我們掌握好方法,什麼難題都可以解決
更多內容請訪問 李興利博客