基于Web應(yīng)用的性能分析及兩種優(yōu)化的案例

一、 基于動(dòng)態(tài)內(nèi)容為主的網(wǎng)站優(yōu)化案例
1.網(wǎng)站運(yùn)行環(huán)境說明
硬件環(huán)境:1臺(tái)IBM x3850服務(wù)器, 單個(gè)雙核Xeon 3.0G CPU,2GB內(nèi)存,3塊72GB SCSI磁盤。
操作系統(tǒng):CentOS5.4。
網(wǎng)站架構(gòu):Web應(yīng)用是基于LAMP架構(gòu),所有服務(wù)都在一臺(tái)服務(wù)器上部署。
2.性能問題現(xiàn)象及處理措施
現(xiàn)象描述
網(wǎng)站在上午10點(diǎn)左右和下午3點(diǎn)左右訪問高峰時(shí),網(wǎng)頁無法打開,重啟服務(wù)后,網(wǎng)站能在一段時(shí)間內(nèi)能正常服務(wù),但過一會(huì)又變得響應(yīng)緩慢,最后網(wǎng)頁徹底無法打開。
檢查配置
首先檢查系統(tǒng)資源狀態(tài),發(fā)現(xiàn)服務(wù)出現(xiàn)故障時(shí)系統(tǒng)負(fù)載極高,內(nèi)存基本耗盡,接著檢查Apache配置文件httpd.conf,發(fā)現(xiàn)“MaxClients”選項(xiàng)值被設(shè)置為2000,并且打開了Apache的KeepAlive特性。
處理措施
根據(jù)上面的檢查,初步判斷是Apache的”MaxClients“選項(xiàng)配置不當(dāng)引起的,因?yàn)橄到y(tǒng)內(nèi)存僅有2GB大小,而“MaxClients”選項(xiàng)被配置為2000,過多的用戶訪問進(jìn)程耗盡了系統(tǒng)內(nèi)存;然后,修改httpd.conf配置文件的“MaxClients”選項(xiàng),將此值由2000降到1500;繼續(xù)觀察發(fā)現(xiàn),網(wǎng)站還是頻繁宕機(jī),于是又將“MaxClients”選項(xiàng)值降到1024,觀察一段時(shí)間發(fā)現(xiàn),網(wǎng)站服務(wù)宕機(jī)時(shí)間間隔加長了,不像以前那么頻繁,但是系統(tǒng)負(fù)載還是很高,網(wǎng)頁訪問速度極慢。
3.第一次分析優(yōu)化
既然是由系統(tǒng)資源耗盡導(dǎo)致的網(wǎng)站服務(wù)失去響應(yīng),那么就深入分析系統(tǒng)資源的使用情況,通過uptime、vmstat、top、ps等命令的聯(lián)合使用,得出如下結(jié)論:
結(jié)論描述
系統(tǒng)平均負(fù)載很高,通過uptime輸出的系統(tǒng)“load average”值都在10以上,而CPU資源也消耗嚴(yán)重,這是造成網(wǎng)站響應(yīng)緩慢或長時(shí)間沒有響應(yīng)的主要原因,而導(dǎo)致系統(tǒng)資源消耗過高的主要依據(jù)是用戶進(jìn)程消耗資源嚴(yán)重。
原因分析
通過top命令發(fā)現(xiàn),每個(gè)Apache子進(jìn)程消耗將近6~8MB左右內(nèi)存,這是不正常的。根據(jù)經(jīng)驗(yàn),在正常情況下每個(gè)Apache子進(jìn)程消耗的內(nèi)存在1MB左右,結(jié)合Apache輸出日志發(fā)現(xiàn),網(wǎng)站首頁訪問頻率最高,也就是說首頁程序代碼可能存在問題。于是檢查首頁的PHP代碼,發(fā)現(xiàn)首頁的頁面非常大,圖片很多,并且由全動(dòng)態(tài)的程序組成,這樣每次用戶訪問首頁都要多次查詢數(shù)據(jù)庫,而查詢數(shù)據(jù)庫是個(gè)非常耗費(fèi)CPU資源的過程,并且首頁P(yáng)HP代碼也沒有相應(yīng)的緩存機(jī)制,每個(gè)用戶請(qǐng)求都要重新進(jìn)行數(shù)據(jù)庫查詢操作,數(shù)據(jù)庫查詢負(fù)荷有多高可想而知。
處理措施
修改首頁P(yáng)HP代碼,縮減頁面大小,并且對(duì)訪問頻繁的操作增加緩存機(jī)制,盡量減少程序?qū)?shù)據(jù)庫的訪問。
4.第二次分析優(yōu)化
通過前面簡單優(yōu)化,系統(tǒng)服務(wù)宕機(jī)現(xiàn)象出現(xiàn)次數(shù)減少很多,但是在訪問高峰時(shí)網(wǎng)站偶爾還會(huì)無法正常訪問。這次仍然從分析系統(tǒng)資源使用狀況入手,發(fā)現(xiàn)系統(tǒng)內(nèi)存資源消耗過大,并且磁盤I/O有等待問題,于是得出如下結(jié)論:
原因分析
內(nèi)存消耗過大,肯定是用戶訪問進(jìn)程數(shù)過多導(dǎo)致的,在沒有優(yōu)化PHP代碼之前,每個(gè)Apache子進(jìn)程消耗6~8MB內(nèi)存,如果設(shè)置Apache的最大用戶數(shù)為1024,那么內(nèi)存耗盡是必然的,當(dāng)物理內(nèi)存耗盡時(shí),虛擬內(nèi)存就會(huì)啟用,頻繁地使用虛擬內(nèi)存,肯定會(huì)出現(xiàn)磁盤I/O等待問題,最終導(dǎo)致CPU資源耗盡。
處理措施
通過上面對(duì)PHP代碼的優(yōu)化,每個(gè)Apache子進(jìn)程消耗的內(nèi)存資源基本維持在1~2MB左右,因此修改Apache配置文件httpd.conf中的”MaxClients”選項(xiàng)值為“600”,同時(shí)把Apache配置中的“KeepAlive”特性關(guān)閉,這樣Apache進(jìn)程數(shù)大量減少,基本維持在500~600之間,雖然偶爾也會(huì)使用虛擬內(nèi)存,但是Web服務(wù)正常了,服務(wù)宕機(jī)問題也很少出現(xiàn)了。
5.第三次分析優(yōu)化
經(jīng)過前兩次的優(yōu)化,網(wǎng)站基本運(yùn)行正常,但是在訪問高峰時(shí)偶爾還會(huì)出現(xiàn)站點(diǎn)無法訪問得現(xiàn)象,繼續(xù)進(jìn)行問題分析,通過命令查看系統(tǒng)資源,發(fā)現(xiàn)仍是CPU資源耗盡導(dǎo)致的,但是與前兩次又有所不同:
原因分析
通過觀察后臺(tái)日志,發(fā)現(xiàn)PHP程序有頻繁訪問數(shù)據(jù)庫的操作,大量的SQL語句中有where, order by等子句;同時(shí),數(shù)據(jù)庫查詢過多,大部分都是復(fù)雜查詢,一般都需要遍歷全表,而大量的表沒有建立索引,這樣的程序代碼導(dǎo)致MySQL數(shù)據(jù)庫負(fù)荷過高,而MySQL數(shù)據(jù)庫和Apache部署在同一臺(tái)服務(wù)器上,這也是導(dǎo)致服務(wù)器消耗CPU資源過高的原因。
處理措施
優(yōu)化程序中的SQL語句,增加where子句上的匹配條件,減少遍歷全部的查詢,同時(shí)在where和order by子句的字段上建立索引,并且增加程序緩存機(jī)制,通過這次優(yōu)化,網(wǎng)站運(yùn)行基本處于正常狀態(tài),再也沒有出現(xiàn)宕機(jī)的現(xiàn)象。
6.第四次優(yōu)化分析
通過前面三次優(yōu)化以后,網(wǎng)站在程序代碼、操作系統(tǒng)、Apache等方面的優(yōu)化空間越來越小,要避免出現(xiàn)服務(wù)氣宕機(jī)現(xiàn)象,并且保證網(wǎng)站穩(wěn)定、高效、快速地運(yùn)行,可以從網(wǎng)站結(jié)構(gòu)上進(jìn)行優(yōu)化,也就是將Web和數(shù)據(jù)庫分離部署,可以增加一臺(tái)專用的數(shù)據(jù)庫服務(wù)器,單獨(dú)部署MySQL數(shù)據(jù)庫。隨著訪問量的增加,如果前端無法滿足訪問請(qǐng)求,還可以增加多臺(tái)Web服務(wù)器,Web服務(wù)器之間進(jìn)行負(fù)載均衡部署,解決前端性能瓶頸;如果在數(shù)據(jù)庫端還存在讀寫壓力,還可以繼續(xù)增加一臺(tái)MySQL服務(wù)器,將MySQL進(jìn)行讀寫分離部署,這樣一套高性能、高可靠的網(wǎng)站系統(tǒng)就構(gòu)建起來了。
二、 基于動(dòng)態(tài)、靜態(tài)內(nèi)容結(jié)合的網(wǎng)站優(yōu)化案例
1.網(wǎng)站運(yùn)行環(huán)境說明
硬件環(huán)境:兩臺(tái)IBM x3850服務(wù)器, 單個(gè)雙核Xeon 3.0G CPU,4GB內(nèi)存,3塊72GB SCSI磁盤。
操作系統(tǒng):CentOS5.4。
網(wǎng)站架構(gòu):Web應(yīng)用是基于J2EE架構(gòu)的電子商務(wù)應(yīng)用,Web端應(yīng)用服務(wù)器是Tomcat,采用MySQL數(shù)據(jù)庫,Web和數(shù)據(jù)庫獨(dú)立部署在兩臺(tái)服務(wù)器上。
2.性能問題現(xiàn)象以及處理措施
現(xiàn)象描述
網(wǎng)站訪問高峰時(shí),網(wǎng)頁無法打開,重啟Java服務(wù)后,網(wǎng)站可以正常運(yùn)行一段時(shí)間,但過一會(huì)又變得響應(yīng)緩慢,最后網(wǎng)頁徹底無法打開。
檢查配置
首先檢查系統(tǒng)資源狀態(tài),發(fā)現(xiàn)服務(wù)出現(xiàn)故障時(shí)系統(tǒng)負(fù)載極高,CPU滿負(fù)荷運(yùn)行,Java進(jìn)程占用了系統(tǒng)99%的CPU資源,但內(nèi)存資源占用不大;接著檢查應(yīng)用服務(wù)器信息,發(fā)現(xiàn)只有一個(gè)Tomcat在運(yùn)行Java程序;接著查看Tomcat配置文件server.xml,發(fā)現(xiàn)server.xml文件中的參數(shù)都是默認(rèn)配置,沒有進(jìn)行任何優(yōu)化。
處理措施
server.xml文件的默認(rèn)參數(shù)需要根據(jù)應(yīng)用的特性進(jìn)行適當(dāng)?shù)男薷?,例如可以修?ldquo;connectionTimeout“、“maxKeepAliveRequests”、“maxProcessors”等幾個(gè)Tmcat配置文件的參數(shù),適當(dāng)加大這幾個(gè)參數(shù)值。修改參數(shù)值后,繼續(xù)觀察發(fā)現(xiàn),網(wǎng)站服務(wù)宕機(jī)時(shí)間間隔加長了,不像以前那么頻繁,但是Java進(jìn)程消耗CPU資源還是很嚴(yán)重,網(wǎng)頁訪問速度極慢。
3.第一次分析優(yōu)化
既然Java進(jìn)程消耗CPU資源嚴(yán)重,那么需要查看到底是什么導(dǎo)致Java消耗資源嚴(yán)重,通過lsof、netstat命令發(fā)現(xiàn)有大量的Java請(qǐng)求等待信息,然后查看Tomcat日志,發(fā)現(xiàn)大量報(bào)錯(cuò)信息、日志提示和數(shù)據(jù)庫連接超時(shí),最終無法連接到數(shù)據(jù)庫,同時(shí),訪問網(wǎng)站靜態(tài)資源,也無法訪問,于是得出如下結(jié)論:
原因分析
Tomcat本身就是一個(gè)Java容器,是使用連接/線程模型處理業(yè)務(wù)請(qǐng)求的,主要用于處理Jsp、servlet等動(dòng)態(tài)應(yīng)用,雖然它也能當(dāng)作HTTP服務(wù)器,但是處理靜態(tài)資源的效率很低,遠(yuǎn)遠(yuǎn)比不上Apache或Nginx。從前面觀察到的現(xiàn)象分析,可以初步判斷是Tomcat無法及時(shí)響應(yīng)客戶端的請(qǐng)求,進(jìn)而導(dǎo)致請(qǐng)求隊(duì)列越來越多,直到Tomcat徹底崩潰。對(duì)于一個(gè)正常的訪問請(qǐng)求來說,服務(wù)器接收到請(qǐng)求后,會(huì)把請(qǐng)求交給Tomcat去處理,Tomcat接著執(zhí)行編譯、訪問數(shù)據(jù)庫等操作,然后把信息返回給客戶端,客戶端接收到信息后,Tomcat就關(guān)閉這個(gè)請(qǐng)求鏈接,這樣一個(gè)完整的訪問過程就結(jié)束了。而在高并發(fā)訪問狀態(tài)下,很多的請(qǐng)求瞬間都交給Tomcat處理,這樣Tomcat還沒有完成第一個(gè)請(qǐng)求,第二個(gè)請(qǐng)求就來了,接著是第三個(gè),等等,這樣越積越多,Tomcat最終失去響應(yīng), Java進(jìn)程就會(huì)處于僵死狀態(tài),資源無法釋放,這就是根本原因。
處理措施
要優(yōu)化Tomcat性能,需要從結(jié)構(gòu)上進(jìn)行重構(gòu),首先,加入Apache支持,由Apache處理靜態(tài)資源,由Tomcat處理動(dòng)態(tài)請(qǐng)求,Apache服務(wù)器和Tomcat服務(wù)器之間使用Mod_JK模塊進(jìn)行通信。使用Mod_JK模塊的好處是:它可以定義詳細(xì)的資源處理規(guī)則,根據(jù)動(dòng)態(tài)、靜態(tài)網(wǎng)站的特點(diǎn),將靜態(tài)資源文件全部交給Apache處理,而動(dòng)態(tài)請(qǐng)求通過Mod_JK模塊傳給Tomcat去處理,通過Apache+JK+Tomcat的整合,可以大幅度提高Tomcat應(yīng)用的性能。
4.第二次分析優(yōu)化
經(jīng)過前面的優(yōu)化措施,Java資源偶爾會(huì)增高,但是一段時(shí)間后又會(huì)自動(dòng)降低,這屬于正常狀態(tài),而在高并發(fā)訪問情況下,Java進(jìn)程有時(shí)還會(huì)出現(xiàn)資源上升無法下降的情況,通過查看Tomcat日志,綜合分析得出如下結(jié)論:要獲得更高、更穩(wěn)定的性能,單一的Tomcat應(yīng)用服務(wù)器有時(shí)會(huì)無法滿足需求,因此要結(jié)合Mod_JK模塊運(yùn)行基于Tomcat的負(fù)載均衡系統(tǒng),這樣前端由Apache負(fù)責(zé)用戶請(qǐng)求的調(diào)度,后端又多個(gè)Tomcat負(fù)責(zé)動(dòng)態(tài)應(yīng)用的解析操作,通過將負(fù)載均分配給多個(gè)Tomcat服務(wù)器,網(wǎng)站的整體性能會(huì)有一個(gè)質(zhì)的提升。
以上就是基于Web應(yīng)用的性能分析及優(yōu)化案例,謝謝閱讀,希望能幫到大家,請(qǐng)繼續(xù)關(guān)注腳本之家,我們會(huì)努力分享更多優(yōu)秀的文章。
相關(guān)文章
寶塔面板屏蔽 Censys的配置方法(防止源站 IP 泄露)
Censys 搜索引擎很強(qiáng)大,Censys 每天都會(huì)掃描 IPv4 地址空間,以搜索所有聯(lián)網(wǎng)設(shè)備并收集相關(guān)的信息,并返回一份有關(guān)資源(如設(shè)備、網(wǎng)站和證書)配置和部署信息的總體報(bào)告2025-03-01使用高防服務(wù)器或者高防CDN后為什么還會(huì)出現(xiàn)源站IP被打
近來站長們應(yīng)該基本都遇到過 DDOS 攻擊,特別是 CC,如果放任不管,會(huì)導(dǎo)致服務(wù)器資源緊張,導(dǎo)致用戶無法正常訪問,有時(shí)間就算接入了高防服務(wù)器,源站 IP 還是被打,網(wǎng)站打不2025-03-01通過Censys引擎,教你繞過 CDN 精準(zhǔn)找到源站IP
當(dāng)我們談?wù)摾@過CDN查找真實(shí)IP的時(shí)候,不得不提到SSL證書,它確實(shí)是我們尋找真實(shí)IP的一大利器,至于為什么SSL證書會(huì)導(dǎo)致源站IP泄露?很多人或許沒有深入了解這個(gè)問題,目前好2025-03-01CloudFlare官方免費(fèi)CNAME接入配置教程
默認(rèn)CloudFlare都是讓大家通過dns接入,但大家因?yàn)橐呀?jīng)習(xí)慣了dnspod等解析方式,那么cname就比較方便大家使用了,下面為大家分享一下cname的接入方法,需要的朋友可以參考下2025-02-20旅途云 高防服務(wù)器活動(dòng)促銷(ddos、cc攻擊)
是否需要高防服務(wù)器呢,最近很多網(wǎng)站遭受ddos與cc攻擊,雙11之際旅途云特為大家提供了性價(jià)比更高的高防服務(wù)器套餐需要的朋友可以咨詢2023-11-12華為云優(yōu)惠券在哪里獲得?華為云優(yōu)惠券領(lǐng)取
在本篇文章里小編給大家整理的是關(guān)于華為云優(yōu)惠券領(lǐng)取的方法和入口,有此需要的朋友們可以領(lǐng)取下,希望對(duì)你有幫助。2020-03-12華為云優(yōu)惠券怎么用?華為云優(yōu)惠券使用方法
在本篇文章里小編給大家整理了關(guān)于華為云優(yōu)惠券使用方法和詳細(xì)步驟,有興趣的朋友們可以學(xué)習(xí)下。2020-03-12華為云優(yōu)惠券在哪能找到?華為云優(yōu)惠券領(lǐng)取教程
我們給大家?guī)砣绾斡脙?yōu)惠的方法購買華為云主機(jī)的方法以及給大家分享華為云的優(yōu)惠券和代金券,希望能夠幫助到大家。2020-02-26進(jìn)行https證書申請(qǐng)安裝和tomcat https證書安裝的方法
對(duì)于https證書,想必大家已經(jīng)非常熟悉了,這是一種可以保護(hù)網(wǎng)站安全的證書,以https開頭的網(wǎng)站都是具有這一證書的網(wǎng)站。今天給大家介紹怎樣進(jìn)行https證書申請(qǐng)安裝和tomcat2019-10-31庫店進(jìn)軍社交電商,揮斥重金燎原計(jì)劃迎戰(zhàn)雙十一
庫店創(chuàng)始人鄭劍豪,原寺庫商城總經(jīng)理,2010年聚劃算創(chuàng)始團(tuán)隊(duì)成員,5年時(shí)間幫助寺庫成功上市。庫店,是美國納斯達(dá)克上市企業(yè)寺庫旗下高品質(zhì)社交電商平臺(tái),獲京東與LVMH集團(tuán)旗下基2018-11-01