大綱:php
1、概述html
2、什麼是性能調優?(what)前端
3、爲何須要性能調優?(why)mysql
4、何時須要性能調優?(when)linux
5、什麼地方須要性能調優?(where)ios
6、什麼人來進行性能調優?(who)nginx
7、怎麼樣進行性能調優?(How)sql
8、總結 數據庫
注,硬件配置:CUP Xeon E5620 x 2 8核心, 內存 16G , 硬盤 RAID 10,操做系統: CentOS 6.4 x86_64(64位)。apache
1、概述
原本呢,這篇博文上個星期就應該寫好了,但最近項目比較緊,晚上總是加班,因而我利用加班的一點時間進行了一些總結。主要內容是針對近三個月的項目實踐總結。最後,領導讓開個項目總結會,作一下團隊分享。這篇博文就是團隊分享中我和同事的一些實踐經驗的總結,如今寫出來與你們分享一下。於由前面的博客中關於集羣、負載均衡、緩存服務器、LAMP平臺搭建、MySQL集羣等諸多內容都有講解,就是沒有關於性能調優的詳細內容,在這個專題中我和你們來講一說性能調優的話題。
在這篇博文中,我不想用一些抽象的概念去說性能調優的問題,只想用最通俗的語言儘可能來準確的表達個人想法。因爲本人小平有限,有什麼不對或者不清楚的地方歡迎你們交流指正。爲了更能通俗易懂的理解咱們即將要的性能調優的話題,我在這裏簡單的和你們說一下我寫這篇文章的寫做方法 「5w+1h」方法。
注,5w+1h 就是對所作工做進行科學的分析,對某一工做在調查研究的基礎上,就其工做內容(What)、責任者(Who)、工做崗位(Where)、工做時間(When)、怎樣操做(How)以及爲什麼這樣作(Why),即"5W"、"1H"進行書面描述,並按此描述進行操做,達到完成職務任務的目標。(來源「百度百科」)
2、什麼是性能調優?(what)
在說什麼是性能調優以前咱們先來講一下,計算機的體系結構。如上圖,簡單來講包括三塊:硬件、操做系統、應用程序。其實,性能調優就是調節這些內容,包括硬件、操做系統、應用程序。其中,這三大方面中又包含了若干的內容。硬件包括 CPU、內存、磁盤、網卡、其它……,操做系統包括 進程、虛擬內存、文件系統、網絡、其它……,應用程序我就不用說了你們都懂,常見的有Apache、MySQL、Nginx、Memcahed等。那什麼是性能調優呢?性能調優就是對計算機硬件、操做系統和應用有至關深刻的瞭解,調節三者之間的關係,實現整個系統(包括硬件、操做系統、應用)的性能最大化,並能不斷的知足現有的業務需求。這就是咱們說的性能調優,客官你懂了嘛?
3、爲何須要性能調優?(why)
下面咱們來講一說爲何須要性能調優,其實說到底就兩緣由:一是爲了得到更好的系統性能(就是你現有的系統運行的還不錯,但優化一下能夠運行的更好)。二是經過性能調優來知足不斷增長的業務需求。爲了更直觀的幫助你們來理解爲何要性能調優?咱們分別從三個方面來講:
硬件選型(根據服務器應用類型來選購服務器)
操做系統發行版本 (選擇發行版本)
應用程序 (Nginx、MySQL等)
硬件選型
無論你是租服務器也好仍是本身買服務器也好都要遇到一個問題,咱們選擇什麼樣硬件配置的服務器。通常咱們是根據應用類型來選擇服務器,由於你不可能一種硬件配置來知足全部的應用需求,由於每一個應用的具體需求不同。下面咱們來看一下在項目實施中有哪些應用類型:
負載均衡:性能要求相對較低,由於只負責轉發數據,但要保證選一性能突出的網卡便可。(推薦配置: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 MinSpareServers 5 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編譯選項,配置文件優化等,具體的調優咱們在這裏先不細說。經過咱們上面的講解,咱們分別從硬件、操做系統、應用程序,這三個方面入手和你們談談爲什麼須要性能調優,相信你們已經知道並瞭解,相信你們都火燒眉毛了吧。嘿嘿,咱們先不急還有不少問題沒有說清楚,下面咱們和你們來講說,何時須要性能調優?
4、何時須要性能調優?(when)
通常分爲兩個時間段:
上線前(基本優化)
上線後(持續優化)
爲何這樣說呢,通常咱們在項目實施到項目上線這段時間,不但要準備硬件服務器、安裝操做系統、環境搭建,還有個很重要的問題就是進行性能優化,包括操做系統優化和應用環境優化等,我稱上線前的優化爲基本優化也稱爲經驗優化。根據你作過的項目和你工做中的經驗對上線前的服務器或架構進行基本的性能優化來知足業務需求。再有就是項目上線後的優化,在上線前咱們已經通過基本的性能優化,解決大部分的性能問題,但畢竟上線前的因此測試都是模擬測試並進行相關的性能優化,與上線後的真實環境仍是有至關大的區,咱們首先要作的就是對上線後的項目進行性能監控包括服務器性能監控和服務性能監控,其中服務器性能監控包括CPU使用率、CPU負載、內存使用率、磁盤I/O、磁盤空間使用率、網絡流量、系統進程等,服務性能監控包括apache、nginx、mysql等架構中全部的服務都須要進行性能監控,一但發現有問題咱們都得去進行性能優化,在這個過程當中我稱爲持續優化也稱爲監控優化。下面咱們來具體的說一下,具體什麼地方須要性能調優?
5、什麼地方須要性能調優?(where)
在上面咱們說性能調優只說一些大的方面,包括硬件、操做系統、應用程序這三大塊,其實還有一塊就是程序自己的優化,開發人員根據需求開發出來的程序自己就須要性能優化,但對於咱們運維人員來講接觸的比較少而已。下面咱們就來看看這三大塊:
硬件 (CPU、內存、磁盤、網卡)
操做系統(進程、文件系統、內核 ……)
應用程序(Nginx、MySQL ……)
1.硬件
硬件優化通常也包括兩塊:
上線前(硬件選型)
上線後(硬件擴展)
通常項目搭建時都須要根據具體的應用進行硬件配置選型,在這方面須要必定的運維經驗剛接觸的朋友能夠在這方面有點欠缺,但沒事通常作過一兩個項目之後,對硬件配置選型也就會了,嘿嘿。但有個不成文的經驗,硬件配置仍是越高越好(別說是我說的)。咱們爲何說須要根據具體的應用來選型呢,一方是什麼樣的應用須要什麼樣的硬件配置,還有點很重要就是節約成本,錢得要在刀刃上不應花的錢咱們不能亂花,也是爲公司節約成本,實現資源利用最大化。
上面咱們說的是項目搭建初期,你運氣比較好項目一開始你就在這邊。通常有經驗的運維工程師在硬件選型是不會有問題的,因此咱們在性能優化時就不考慮硬件這塊,從理論上講咱們服務器硬件配置通常不會出如今這種性能問題上。可是呢,因爲咱們業務作的愈來愈好,項目建立初期沒有考慮到會有這麼大的性能須要(訪問量),如今有的硬件不能知足業務需求,所咱們這時須要更換更好的CPU、更大的內存和更快的磁盤。至於如何找出硬件是性能瓶頸咱們先在這裏不細說,在後面的文章中咱們將會細說。最後咱們來看一張硬件架構圖,能幫你更好的理解硬件優化,以下圖(Dell R 710 架構):
2.操做系統
下面咱們來講操做系統,其實絕大部分的優化都在操做系統和應用程序的優化,除了上線前的硬件選型和上線後的硬件擴展,下面咱們就來看看操做系統優化包括哪些:
操做系統安裝優化
系統初始化
進程調優
內存調優
IO 調優
文件系統調優
網絡調化
……
下面咱們來看一張圖,能夠更直觀的幫且咱們理解,以下圖:
3.應用程序
最後咱們來講說應用程序優化,這裏咱們來講一下MySQL優化例子,讓你們更直觀的瞭解。
MySQL 編譯安裝優化
MySQL 配置文件優化
索引優化
MySQL 引擎優化
查詢緩存優化
SQL 語句優化
優化表類型(MyISAM或InnoDB)
鎖機制優化
MySQL 服務器優化(換SSD)
……
通達上面的對硬件、操做系統、應用程序的具體說明相信,你們對性能優化有了更深層次的瞭解,下面咱們來講一個重要的問題,什麼人來進行性能優化?
6、什麼人來進行性能調優?(who)
一提及性能優化咱們第一個想到的是運維工程師,他們來進行優化。其實我想說,這麼說是片面的性能優化不只僅是運維工程師的事。其實呢,性能優化是一個團隊的事。我爲何這麼說呢?下面咱們就來講一下,你們想啊一公司須要作一項目,咱們就拿最多見的電子商務中商城的項目來講吧,公司確認因爲業務須要咱們須要在網上作一個建材商城,那項目的具體流程是什麼呢?可能不是很詳細,但大致過程是樣的:
運營提出需求
產品整理需求
開發開發具體的業務應用
運維搭建開發環境
QA 進行項目測試
運維進行項目上線
監控進行項目監控
……
開發一個具體的應用須要運營部、產品部、開發部、運維部、QA (測試)、監控等因此有部門的參加,一樣的一個項目(業務)存在性能問題,不會只是運維部門須要性能調優而是因此部門一塊兒解決這個性能問題,這是缺一不可的。可能出如今產品,也可能出如今程序上(*.php),也多是業務須要自己就有問題,也多是運維的環境搭建有問題。但參加性能調優的更多的是開發、運維、測試和監控。
7、怎麼樣進行性能調優?(How)
下面進入正題了咱們說一說怎麼進行性能調優,具體步驟以下:
性能指標 –> 確認衡量標準
性能測試 –> 驗證性能指標
性能分析 –> 找出性能瓶頸
性能調優 –> 解決性能問題
性能監控 –> 檢驗調優效果
1.性能指標
上面咱們說了,咱們優化的目的是爲了得到更好的性能,那麼性能指標是什麼呢?咱們怎麼樣來衡量,通常衡量一個項目(這裏指的網站)的指標有三個:
吞吐量 –> 是單位時間內完成的用戶或系統的請求數量。
併發數 –> 同時能接受多少用戶的訪問請求
響應時間 –> 用戶發出請求到收到響應的時間間隔。
2.性能測試
咱們作產品或者說項目(更直白的說是網站)目的是爲了讓用戶使用,咱們得先站在用戶的角度分析一下,用戶須要關注哪些性能,對於用戶來講,當點擊一個按鈕、連接或發出一個操做指令,到系統把請求處理好發給用戶並用網頁的形式展示出來爲止,這個過程當中所消耗的時間是用戶對這個網站性能的直觀印象。也就是咱們所說的響應時間,當響應時間較小時,用戶體驗相對來講就會好,固然用戶體驗的響應時間包括我的主觀因素和客觀響應時間。在網站開發與搭建時,咱們就須要考慮到如何更好地結合這兩部分達到用戶最佳的體驗。用戶關注的是用戶操做的相應時間。其次,咱們站在運維的角度考慮須要關注的性能點。再次,咱們得站在開發(設計)人員角度去考慮網站性能。最後,由QA測試與反饋咱們網站性能。 通過上述的說明,咱們來測試系統的性能,須要咱們收集系統的吞吐量、併發數、響應時間這三個重要的指標。具體步驟是:
確認吞吐量、併發數、響應時間這三個值
找到或開發相應的性能測試工具
進行性能測試
反饋結果並提交測試報告
結果,有兩個一種是達到咱們預期的性能目標,這樣咱們就不須要性能優化任務完成能夠交給運維上線,只須要進行相關的性能監控,方便上線後進行性能優化。另外一種是沒有達到咱們預期的目標,咱們要查找性能瓶頸並進行性能優化。
3.性能分析
經過上面的性能測試,咱們發現網站沒有達到咱們預期定義的性能目標,這時咱們須要作的就是對現有的系統(服務器)進行監控,包括硬件與軟件監控,爲性能調優提供有效的性能監控數據。下面咱們重點來講一下,用什麼工具能找出性能瓶頸:
硬件:
用vmstat、sar、iostat檢測是不是CPU瓶頸
用free、vmstat檢測是不是內存瓶頸
用iostat檢測是不是磁盤I/O瓶頸
用netstat檢測是不是網絡帶寬瓶
……
操做系統:
進程
文件系統
SWAP 分區
內核參數調整
……
應用程序(MySQL等):
mysqlreport 性能分析報告
mysqlsla 慢查詢日誌分析
……
4.性能調優
肯定調優目標
具體調優步驟
檢測調優結果
(1). 肯定調優目標
咱們性能優化的目標是網站性能提升10%仍是20%,不能老大說今天你給我優化一下網站性能,你就能使用網站性能翻一倍。首先,你要問他咱們須要達到一個怎麼的目標。而後,咱們要了解一下整個環境(架構)包括代碼(固然你須要瞭解一下業務邏輯,大體瞭解一下,確定沒壞處),有時間多和開發溝通一下,問問代碼中有多少坑要填,這很重要。每每他們優一下代碼中的SQL查詢,比你優化系統多少天都來的有效果,哈哈。
(2). 具體調優步驟
若是你不懂系統的參數,你千萬不要對系統的參數進行隨意的改動,否則你會後悔。
每次只對一種系統資源進行系統調試,如CPU、或內存、磁盤。
每次改動儘可能少的參數設置,推薦每次修改一個設置。
分析一項系統資源時,使用多種工具,每每有意想不到的結果。
不及勝於過之(寧願少作一點,不要作過頭了,性能已達到要求就不要隨意亂動,作好你的監控)。
(3). 檢測調優結果
每次性能調優後必須對性能進程檢測,如Web服務器的ab工具,就是一個很好的檢測工具,每次調優後都能看到具體的變化。
5.性能監控
性能監控這個很重要,具體包括服務器性能監控和具體服務的性能監控。下面咱們說一說具體有哪些性能監控指標:
(1).服務器的性能監控
CPU 使用率
CPU負載
內存使用率
磁盤I/O
網絡流量
磁盤空間
系統進程
……
(2).服務的性能監控(MySQL)
MySQL查詢吞吐率,包括Change DB、Select、Insert、Update、Delete
MySQL持久鏈接利用率
MySQL查詢緩存空間使用率
MySQL查詢緩存命中率
MySQL緩存查詢數
MySQL索引緩存命中率
MySQL索引讀取統計
MySQL鏈接吞吐率
MySQL鏈接緩存命中率
MySQL併發鏈接數,包括最大容許鏈接數、實際最大鏈接數、當前鏈接數、活躍鏈接數、緩存鏈接數
MySQL流量統計
MySQL表統計鎖定
具體的監控工具備不少包括開源的監控工具 Cacti、Nagios、Zabbix等,還有一些收費的監控工具如「監控寶」等。
8、總結
在這篇「性能優化概述」的博文中我只是給你們講解一下具體的優化思路,幫助你們理解性能優化,這樣你們更容易理解一些,讓你們知道性能優化並非傳說中的那麼難,難到不可動手去作,只要咱們掌握好方法,什麼難題均可以解決。可是,在這篇博文中沒有講到具體的優化過程,至於具體的優化過程咱們會再下面的文章中和你們講解。好了,說了這麼多。但願你們有所收穫吧^_^……