一,什么是性能調(diào)優(yōu)?
在說什么是性能調(diào)優(yōu)之前,我們先來說一下,計算機(jī)的體系結(jié)構(gòu)。
如上圖,簡單來說包括三塊:硬件、操作系統(tǒng)、應(yīng)用程序。其實,性能調(diào)優(yōu)就是調(diào)節(jié)這些內(nèi)容,包括硬件、操作系統(tǒng)、應(yīng)用程序。其中,這三大方面又包含了若干的內(nèi)容。
- 硬件包括:CPU、內(nèi)存、磁盤、網(wǎng)卡、其它……,
- 操作系統(tǒng)包括 進(jìn)程、虛擬內(nèi)存、文件系統(tǒng)、網(wǎng)絡(luò)、其它……,
- 應(yīng)用程序我就不用說了大家都懂,常見的有Apache、MySQL、Nginx、Memcahed等。
內(nèi)核資料直通車:最新Linux內(nèi)核源碼資料文檔+視頻資料
學(xué)習(xí)直通車:Linux內(nèi)核源碼/內(nèi)存調(diào)優(yōu)/文件系統(tǒng)/進(jìn)程管理/設(shè)備驅(qū)動/網(wǎng)絡(luò)協(xié)議棧
那什么是性能調(diào)優(yōu)呢?
性能調(diào)優(yōu)就是對計算機(jī)硬件、操作系統(tǒng)和應(yīng)用有相當(dāng)深入的了解,調(diào)節(jié)三者之間的關(guān)系,實現(xiàn)整個系統(tǒng)(包括硬件、操作系統(tǒng)、應(yīng)用)的性能最大化,并能不斷的滿足現(xiàn)有的業(yè)務(wù)需求。這就是我們說的性能調(diào)優(yōu),客官你懂了嘛?
二,為什么需要性能調(diào)優(yōu)?
下面我們來說一說為什么需要性能調(diào)優(yōu),其實說到底就兩個原因:一是為了獲得更好的系統(tǒng)性能(就是你現(xiàn)有的系統(tǒng)運行得還不錯,但優(yōu)化一下可以運行的更好)。二是通過性能調(diào)優(yōu)來滿足不斷增加的業(yè)務(wù)需求。為了更直觀地幫助大家來理解為什么要性能調(diào)優(yōu)?我們分別從三個方面來說:
- 硬件選型(根據(jù)服務(wù)器應(yīng)用類型來選購服務(wù)器)
- 操作系統(tǒng)發(fā)行版本 (選擇發(fā)行版本)
- 應(yīng)用程序 (Nginx、MySQL等)
1.硬件選型
不管你是租服務(wù)器也好還是自己買服務(wù)器也好都要遇到一個問題,我們選擇什么樣硬件配置的服務(wù)器。
一般我們是根據(jù)應(yīng)用類型來選擇服務(wù)器,因為你不可能一種硬件配置來滿足所有的應(yīng)用需求,因為每個應(yīng)用的具體需求不一樣。下面我們來看一下在項目實施中有哪些應(yīng)用類型:
- 負(fù)載均衡:性能要求相對較低,因為只負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù),但要保證選一性能突出的網(wǎng)卡即可。(推薦配置:CPU E5620 x 1 內(nèi)存 8G 硬盤 500G(RAID5))
- Web 服務(wù)器:一般只處理一些靜態(tài)頁面或者圖片等,因此要求也不是很高,主流的服務(wù)器都可以使用。(推薦配置:CPU E5620 x 1 內(nèi)存 16G 硬盤 500G(RAID5))
- 應(yīng)用服務(wù)器:一般應(yīng)用程序服務(wù)器,他承擔(dān)網(wǎng)站功能的實現(xiàn),在架構(gòu)中占有比較重的位置,特別是網(wǎng)站架構(gòu)中只有一臺應(yīng)用服務(wù)器,對CPU、內(nèi)存、磁盤要求都比較高。(推薦配置:CPU E5620 x 2 內(nèi)存 32G 硬盤 500G(RAID10))
- 緩存服務(wù)器:分為前端頁面緩存與后面數(shù)據(jù)緩存,他們典型的應(yīng)用分別是Varnish與Memcached,對內(nèi)存的要求比較大,一般我們配置服務(wù)器時使用較大有內(nèi)存。(推薦配置:CPU E5620 x 1 內(nèi)存 32G 硬盤 500G(RAID10))
- 數(shù)據(jù)庫服務(wù)器:數(shù)據(jù)服務(wù)器對CPU、內(nèi)存、磁盤的要求都很高,一但某個硬件是短板都會帶來性能問題。(推薦配置:CPU E5620 x 2 內(nèi)存 64G 固態(tài)硬盤 500G(RAID10))
- 備份服務(wù)器:備份服務(wù)器一般就沒有什么要求,但有點可以肯定是必須有足夠大的硬盤空間。(推薦配置:CPU E5620 x 1 內(nèi)存 4G 硬盤 2TB(RAID5))
- 監(jiān)控服務(wù)器:一般也沒什么需要,普通的PC服務(wù)器就可以。(推薦配置:CPU E5620 x 1 內(nèi)存 4G 硬盤 500(RAID5))
- 其它服務(wù)器:至于其它服務(wù)器就看各位的具體需要具體分析了。
這下各位知道什么是硬件的性能調(diào)優(yōu)了吧,根據(jù)你具體的應(yīng)用,進(jìn)行具體分析特別是像MySQL這樣的服務(wù)器,對CPU、內(nèi)存、磁盤要求都比較高。
所以,對硬件的性能調(diào)優(yōu)我們必須做到選擇合適的硬件配置。這是網(wǎng)站架構(gòu)或者項目實施首先要解決的問題!
2.操作系統(tǒng)
有本書叫《Linux Performance Tuning》(Linux 性能調(diào)優(yōu))這本書是老外寫的,作者是 Fernando Apesteguia 。
為什么我們需要性能調(diào)優(yōu)?他得出的結(jié)論是這樣的:
“當(dāng)一個發(fā)行版打包發(fā)送到客戶手中的時候,它是為了完全兼容市場中大部分計算機(jī)而設(shè)計的。這是一個相當(dāng)混雜的硬件集合(硬盤,顯卡,網(wǎng)卡,等等)。
所以Red Hat,SUSE,Mandriva,Ubuntu和其他的一些發(fā)行版廠商選擇了一些保守的設(shè)置來確保安裝成功?!?/p>
簡單說,你的操作系統(tǒng)已經(jīng)運行得不錯了,但是你可以調(diào)節(jié)它獲得更高的性能,比如你有個高性能的磁盤,但你的操作系統(tǒng)中一些選項參數(shù)默認(rèn)沒有啟動,就不能實現(xiàn)這些高級功能來提高硬盤性能。
還有我想說就是對操作系統(tǒng)發(fā)行版選擇的問題,RedHat或CentOS這些操作系統(tǒng)在項目實施或網(wǎng)站架構(gòu)中用的比較多,主要針對企業(yè)應(yīng)用而開發(fā)的操作系統(tǒng)。
而Ubuntu之類的操作系統(tǒng)對桌面支持的比較好,所以選擇發(fā)行版本時得注意。(一般企業(yè)中用的比較多的是CentOS)再有就是我們一般不要選擇最新的發(fā)行版,因為剛出來的發(fā)行版相對來說bug還比較多,不要先當(dāng)“小白鼠”了,
比如:剛剛出來CentOS 7 等過一段時間穩(wěn)定了再使用,目前我們可以選擇 CentOS 6.4 或 6.5即可。
(但新版本也有很多好處,新版本中加入了很多新功能,去掉一些已知bug,對于一些不重要的應(yīng)用,可嘗試使用新的操作系統(tǒng))
3.應(yīng)用程序
最后,我們得來說說應(yīng)用程序了,我們先來簡單看到一下Apache的MPM配置文件:
prefork 模型:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
大家可以從上面的配置文件中可以看出,apache 開始啟動時啟用 8個進(jìn)程,最小 5個進(jìn)程,最大20個進(jìn)程,每個進(jìn)程限制請求數(shù)為256個,最多可以接受請求 4000個,超過這個限制數(shù)自動銷毀。
worker 模型:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
再看一下,worker模型的配置文件,默認(rèn)啟動2個進(jìn)程,每個進(jìn)程可以接受的請求為150個,每個進(jìn)程中最小線程數(shù)25個,最大線程數(shù)為75個,默認(rèn)線程數(shù)25個,每個線程可以接受的請求沒有限制為0。
好了,大家看完上面的配置文件,可以看出默認(rèn)的Apache配置文件,設(shè)置的比較保守,只適于一些中小網(wǎng)站,想要獲得高性能的Apache服務(wù)器還必須進(jìn)行性能調(diào)優(yōu),包括apache編譯選項,配置文件優(yōu)化等,具體的調(diào)優(yōu)我們在這里先不細(xì)說。
通過我們上面的講解,我們分別從硬件、操作系統(tǒng)、應(yīng)用程序,這三個方面入手和大家談?wù)劄楹涡枰阅苷{(diào)優(yōu),相信大家已經(jīng)知道并了解,相信大家都迫不及待了吧。
嘿嘿,我們先不急還有很多問題沒有說清楚,下面我們和大家來說說,什么時候需要性能調(diào)優(yōu)?
三,什么時候需要性能調(diào)優(yōu)?
一般分為兩個時間段:
- 上線前(基本優(yōu)化)
- 上線后(持續(xù)優(yōu)化)
為什么這樣說呢,一般我們在項目實施到項目上線這段時間,不但要準(zhǔn)備硬件服務(wù)器、安裝操作系統(tǒng)、環(huán)境搭建,還有個很重要的問題就是進(jìn)行性能優(yōu)化,包括操作系統(tǒng)優(yōu)化和應(yīng)用環(huán)境優(yōu)化等,我稱上線前的優(yōu)化為基本優(yōu)化也稱為經(jīng)驗優(yōu)化。
根據(jù)你做過的項目和你工作中的經(jīng)驗對上線前的服務(wù)器或架構(gòu)進(jìn)行基本的性能優(yōu)化來滿足業(yè)務(wù)需求。
再有就是項目上線后的優(yōu)化,在上線前我們已經(jīng)經(jīng)過基本的性能優(yōu)化,解決大部分的性能問題,但畢竟上線前的所以測試都是模擬測試并進(jìn)行相關(guān)的性能優(yōu)化,與上線后的真實環(huán)境還是有相當(dāng)大的區(qū).
我們首先要做的就是對上線后的項目進(jìn)行性能監(jiān)控包括服務(wù)器性能監(jiān)控和服務(wù)器性能監(jiān)控。
服務(wù)器性能監(jiān)控包括:
CPU使用率、CPU負(fù)載、內(nèi)存使用率、磁盤I/O、磁盤空間使用率、網(wǎng)絡(luò)流量、系統(tǒng)進(jìn)程等,服務(wù)性能監(jiān)控包括apache、nginx、mysql。
以上架構(gòu)中所有的服務(wù)都需要進(jìn)行性能監(jiān)控,一旦發(fā)現(xiàn)有問題我們都得去進(jìn)行性能優(yōu)化,在這個過程中我稱為持續(xù)優(yōu)化也稱為監(jiān)控優(yōu)化。下面我們來具體地說一下,具體什么地方需要性能調(diào)優(yōu)?
四,什么地方需要性能調(diào)優(yōu)?
在上面我們說性能調(diào)優(yōu)只說一些大的方面,包括硬件、操作系統(tǒng)、應(yīng)用程序這三大塊。
其實還有一塊就是程序本身的優(yōu)化,開發(fā)人員根據(jù)需求開發(fā)出來的程序本身就需要性能優(yōu)化,但對于我們運維人員來說接觸的比較少而已。下面我們就來看看這三大塊:
- 硬件 (CPU、內(nèi)存、磁盤、網(wǎng)卡)
- 操作系統(tǒng)(進(jìn)程、文件系統(tǒng)、內(nèi)核 ……)
- 應(yīng)用程序(Nginx、MySQL ……)
1.硬件
硬件優(yōu)化一般也包括兩塊:
- 上線前(硬件選型)
- 上線后(硬件擴(kuò)展)
一般項目搭建時都需要根據(jù)具體的應(yīng)用進(jìn)行硬件配置選型,在這方面需要一定的運維經(jīng)驗剛接觸的朋友可以在這方面有點欠缺,但沒事一般做過一兩個項目以后,對硬件配置選型也就會了,嘿嘿。
但有個不成文的經(jīng)驗,硬件配置還是越高越好(別說是我說的)。
我們?yōu)槭裁凑f需要根據(jù)具體的應(yīng)用來選型呢,一方面是什么樣的應(yīng)用需要什么樣的硬件配置,還有點很重要就是節(jié)約成本,錢得要在刀刃上不該花的錢我們不能亂花,也是為公司節(jié)約成本,實現(xiàn)資源利用最大化。
上面我們說的是項目搭建初期,你運氣比較好的項目一開始你就在這邊。
一般有經(jīng)驗的運維工程師在硬件選型上是不會有問題的,所以我們在性能優(yōu)化時就不考慮硬件這塊,從理論上講我們服務(wù)器硬件配置一般不會出現(xiàn)在這種性能問題上。
但是呢,由于我們業(yè)務(wù)做得越來越好,項目創(chuàng)建初期沒有考慮到會有這么大的性能需要(訪問量),現(xiàn)在有的硬件不能滿足業(yè)務(wù)需求,所我們這時需要更換更好的CPU、更大的內(nèi)存和更快的磁盤。
至于如何找出硬件是性能瓶頸我們先在這里不細(xì)說,在后面的文章中我們將會細(xì)說。最后我們來看一張硬件架構(gòu)圖,能幫你更好的理解硬件優(yōu)化,如下圖(Dell R 710 架構(gòu)):
3.應(yīng)用程序
最后我們來說說應(yīng)用程序優(yōu)化,這里我們來說一下MySQL優(yōu)化例子,讓大家更直觀的了解。
- MySQL 編譯安裝優(yōu)化
- MySQL 配置文件優(yōu)化
- 索引優(yōu)化
- MySQL 引擎優(yōu)化
- 查詢緩存優(yōu)化
- SQL 語句優(yōu)化
- 優(yōu)化表類型(MyISAM或InnoDB)
- 鎖機(jī)制優(yōu)化
- MySQL 服務(wù)器優(yōu)化(換SSD)
通達(dá)上面的對硬件、操作系統(tǒng)、應(yīng)用程序的具體說明相信,大家對性能優(yōu)化有了更深層次的了解,下面我們來說一個重要的問題,什么人來進(jìn)行性能優(yōu)化?
五,什么人來進(jìn)行性能調(diào)優(yōu)?
一說起性能優(yōu)化我們第一個想到的就是運維工程師,他們來進(jìn)行優(yōu)化。
其實我想說,這么說是片面的性能優(yōu)化不僅僅是運維工程師的事。
其實呢,性能優(yōu)化是一個團(tuán)隊的事。我為什么這么說呢?
下面我們就來說一下,大家想哪一公司需要做一項目,我們就拿最常見的電子商務(wù)中商城的項目來說吧,公司確認(rèn)由于業(yè)務(wù)需要我們需要在網(wǎng)上做一個建材商城,那項目的具體流程是什么呢?可能不是很詳細(xì),但大體過程是這樣的:
- 運營提出需求
- 產(chǎn)品整理需求
- 開發(fā)開發(fā)具體的業(yè)務(wù)應(yīng)用
- 運維搭建開發(fā)環(huán)境
- QA 進(jìn)行項目測試
- 運維進(jìn)行項目上線
- 監(jiān)控進(jìn)行項目監(jiān)控
開發(fā)一個具體的應(yīng)用需要運營部、產(chǎn)品部、開發(fā)部、運維部、QA (測試)、監(jiān)控等所有部門的參加。
同樣的一個項目(業(yè)務(wù))存在性能問題,不會只是運維部門需要性能調(diào)優(yōu)而是所以部門一起解決這個性能問題,這是缺一不可的。
可能出現(xiàn)在產(chǎn)品,也可能出現(xiàn)在程序上(*.php),也可能是業(yè)務(wù)需要本身就有問題,也可能是運維的環(huán)境搭建有問題。但參加性能調(diào)優(yōu)的更多的是開發(fā)、運維、測試和監(jiān)控。
六,怎么樣進(jìn)行性能調(diào)優(yōu)?
下面進(jìn)入正題了我們說一說怎么進(jìn)行性能調(diào)優(yōu),具體步驟如下:
- 性能指標(biāo) –> 確認(rèn)衡量標(biāo)準(zhǔn)
- 性能測試 –> 驗證性能指標(biāo)
- 性能分析 –> 找出性能瓶頸
- 性能調(diào)優(yōu) –> 解決性能問題
- 性能監(jiān)控 –> 檢驗調(diào)優(yōu)效果
1.性能指標(biāo)
上面我們說了,我們優(yōu)化的目的是為了獲得更好的性能,那么性能指標(biāo)是什么呢?我們怎么樣來衡量,一般衡量一個項目(這里指的網(wǎng)站)的指標(biāo)有三個:
- 吞吐量 –> 是單位時間內(nèi)完成的用戶或系統(tǒng)的請求數(shù)量。
- 并發(fā)數(shù) –> 同時能接受多少用戶的訪問請求
- 響應(yīng)時間 –> 用戶發(fā)出請求到收到響應(yīng)的時間間隔。
2.性能測試
我們做產(chǎn)品或者說項目(更直白的說是網(wǎng)站)目的是為了讓用戶使用,我們得先站在用戶的角度分析一下,用戶需要關(guān)注哪些性能。
對于用戶來說,當(dāng)點擊一個按鈕、鏈接或發(fā)出一個操作指令,到系統(tǒng)把請求處理好發(fā)給用戶并用網(wǎng)頁的形式展現(xiàn)出來為止,這個過程中所消耗的時間是用戶對這個網(wǎng)站性能的直觀印象。
也就是我們所說的響應(yīng)時間,當(dāng)響應(yīng)時間較小時,用戶體驗相對來說就會好,當(dāng)然用戶體驗的響應(yīng)時間包括個人主觀因素和客觀響應(yīng)時間。
在網(wǎng)站開發(fā)與搭建時,我們就需要考慮到如何更好地結(jié)合這兩部分達(dá)到用戶最佳的體驗。用戶關(guān)注的是用戶操作的相應(yīng)時間。
其次,我們站在運維的角度考慮需要關(guān)注的性能點。再次,我們得站在開發(fā)(設(shè)計)人員角度去考慮網(wǎng)站性能。最后,由QA測試與反饋我們網(wǎng)站性能。
經(jīng)過上述的說明,我們來測試系統(tǒng)的性能,需要我們收集系統(tǒng)的吞吐量、并發(fā)數(shù)、響應(yīng)時間這三個重要的指標(biāo)。具體步驟是:
- 確認(rèn)吞吐量、并發(fā)數(shù)、響應(yīng)時間這三個值
- 找到或開發(fā)相應(yīng)的性能測試工具
- 進(jìn)行性能測試
- 反饋結(jié)果并提交測試報告
結(jié)果,有兩個一種是達(dá)到我們預(yù)期的性能目標(biāo),這樣我們就不需要性能優(yōu)化任務(wù)完成可以交給運維上線,只需要進(jìn)行相關(guān)的性能監(jiān)控,方便上線后進(jìn)行性能優(yōu)化。
另一種是沒有達(dá)到我們預(yù)期的目標(biāo),我們要查找性能瓶頸并進(jìn)行性能優(yōu)化。
3.性能分析
通過上面的性能測試,我們發(fā)現(xiàn)網(wǎng)站沒有達(dá)到我們預(yù)期定義的性能目標(biāo),這時我們需要做的就是對現(xiàn)有的系統(tǒng)(服務(wù)器)進(jìn)行監(jiān)控,包括硬件與軟件監(jiān)控,為性能調(diào)優(yōu)提供有效的性能監(jiān)控數(shù)據(jù)。
下面我們重點來說一下,用什么工具能找出性能瓶頸:
硬件:
- 用vmstat、sar、iostat檢測是否是CPU瓶頸
- 用free、vmstat檢測是否是內(nèi)存瓶頸
- 用iostat檢測是否是磁盤I/O瓶頸
- 用netstat檢測是否是網(wǎng)絡(luò)帶寬瓶
操作系統(tǒng):
- 進(jìn)程
- 文件系統(tǒng)
- SWAP 分區(qū)
- 內(nèi)核參數(shù)調(diào)整
- 應(yīng)用程序(MySQL等):
- mysqlreport 性能分析報告
- mysqlsla 慢查詢?nèi)罩痉治?/li>
4.性能調(diào)優(yōu)
- 確定調(diào)優(yōu)目標(biāo)
- 具體調(diào)優(yōu)步驟
- 檢測調(diào)優(yōu)結(jié)果
確定調(diào)優(yōu)目標(biāo)
我們性能優(yōu)化的目標(biāo)是網(wǎng)站性能提高10%還是20%,不能老大說今天你給我優(yōu)化一下網(wǎng)站性能,你就能使用網(wǎng)站性能翻一倍。
首先,你要問他我們需要達(dá)到一個怎么的目標(biāo)。
然后,我們要了解一下整個環(huán)境(架構(gòu))包括代碼(當(dāng)然你需要了解一下業(yè)務(wù)邏輯,大致了解一下,肯定沒壞處),有時間多和開發(fā)溝通一下,問問代碼中有多少坑要填,這很重要。
往往他們優(yōu)一下代碼中的SQL查詢,比你優(yōu)化系統(tǒng)多少天都來的有效果,哈哈。
具體調(diào)優(yōu)步驟
- 如果你不懂系統(tǒng)的參數(shù),你千萬不要對系統(tǒng)的參數(shù)進(jìn)行隨意的改動,不然你會后悔的。
- 每次只對一種系統(tǒng)資源進(jìn)行系統(tǒng)調(diào)試,如CPU、或內(nèi)存、磁盤。
- 每次改動盡量少的參數(shù)設(shè)置,推薦每次修改一個設(shè)置。
- 分析一項系統(tǒng)資源時,使用多種工具,往往會有意想不到的結(jié)果。
- 不及勝于過之(寧愿少做一點,不要做過頭了,性能已達(dá)到要求就不要隨意亂動,做好你的監(jiān)控)。
檢測調(diào)優(yōu)結(jié)果
每次性能調(diào)優(yōu)后必須對性能進(jìn)程檢測,如Web服務(wù)器的ab工具,就是一個很好的檢測工具,每次調(diào)優(yōu)后都能看到具體的變化。
5.性能監(jiān)控
性能監(jiān)控這個很重要,具體包括服務(wù)器性能監(jiān)控和具體服務(wù)器的性能監(jiān)控。下面我們說一說具體有哪些性能監(jiān)控指標(biāo):
服務(wù)器的性能監(jiān)控
- CPU 使用率
- CPU負(fù)載
- 內(nèi)存使用率
- 磁盤I/O
- 網(wǎng)絡(luò)流量
- 磁盤空間
- 系統(tǒng)進(jìn)程
服務(wù)的性能監(jiān)控(MySQL)
- MySQL查詢吞吐率,包括Change DB、Select、Insert、Update、Delete
- MySQL持久連接利用率
- MySQL查詢緩存空間使用率
- MySQL查詢緩存命中率
- MySQL緩存查詢數(shù)
- MySQL索引緩存命中率
- MySQL索引讀取統(tǒng)計
- MySQL連接吞吐率
- MySQL連接緩存命中率
- MySQL并發(fā)連接數(shù),包括最大允許連接數(shù)、實際最大連接數(shù)、當(dāng)前連接數(shù)、活躍連接數(shù)、緩存連接數(shù)
- MySQL流量統(tǒng)計
- MySQL表統(tǒng)計鎖定
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209521 -
計算機(jī)
+關(guān)注
關(guān)注
19文章
7494瀏覽量
87961
發(fā)布評論請先 登錄
相關(guān)推薦
評論