精彩早知道
作者概述
什麼是性能調優?(what)
為什麼需要性能調優?(why)
什麼時候需要性能調優?(when)
什麼地方需要性能調優?(where)
什麼人來進行性能調優?(who)
怎麼樣進行性能調優?(how)
總結
硬體配置:cup xeon e5620 x 2 8核心, 記憶體 16g , 硬碟 raid 10
作業系統: centos 6.4 x86_64(64位)
一、作者概述
在這篇博文中,我不想用一些抽象的概念去說性能調優的問題,隻想用最通俗的語言盡量來準确的表達我的想法。
由于本人小平有限,有什麼不對或者不清楚的地方歡迎大家交流指正。為了更能通俗易懂的了解我們即将要的性能調優的話題,我在這裡簡單的和大家說一下我寫這篇文章的寫作方法 5w+1h方法。
注,5w+1h就是對所做工作進行科學的分析,對某一工作在調查研究的基礎上:
就其工作内容(what)
責任者(who)
工作崗位(where)
工作時間(when
怎樣操作(how
以及為何這樣做(why)
即對”5w”、”1h”進行書面描述,并按此描述進行操作,達到完成職務任務的目标。
二、什麼是性能調優?(what)

在說什麼是性能調優之前我們先來說一下,計算機的體系結構。
如上圖,簡單來說包括三塊:硬體、作業系統、應用程式。其實,性能調優就是調節這些内容,包括硬體、作業系統、應用程式。其中,這三大方面中又包含了若幹的内容。
硬體包括: cpu、記憶體、磁盤、網卡、其它……,
作業系統包括 程序、虛拟記憶體、檔案系統、網絡、其它……,
應用程式我就不用說了大家都懂,常見的有apache、mysql、nginx、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 模型:
大家可以從上面的配置檔案中可以看出,apache 開始啟動時啟用 8個程序,最小 5個程序,最大20個程序,每個程序限制請求數為256個,最多可以接受請求 4000個,超過這個限制數自動銷毀。
worker 模型:
再看一下,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 架構):
下面我們來說作業系統,其實絕大部分的優化都在作業系統和應用程式的優化,除了上線前的硬體選型和上線後的硬體擴充,下面我們就來看看作業系統優化包括哪些:
作業系統安裝優化
系統初始化
程序調優
記憶體調優
io 調優
檔案系統調優
網絡調化
下面我們來看一張圖,可以更直覺的幫且我們了解,如下圖:
最後我們來說說應用程式優化,這裡我們來說一下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表統計鎖定
八、總結
在這篇“性能優化概述”的博文中我隻是給大家講解一下具體的優化思路,幫助大家了解性能優化,這樣大家更容易了解一些,讓大家知道性能優化并不是傳說中的那麼難,難到不可動手去做,隻要我們掌握好方法,什麼難題都可以解決。
好了,說了這麼多。希望大家有所收獲吧。
作者:陳明乾
<b></b>
<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-03-31</b>