陳洪雁+萬(wàn)俊偉
摘 要:為了解決長(zhǎng)期運(yùn)營(yíng)的企業(yè)網(wǎng)站面臨訪問(wèn)效率逐漸下降和綜合服務(wù)質(zhì)量差的問(wèn)題,從用戶(hù)角度出發(fā),以提高用戶(hù)網(wǎng)站訪問(wèn)體驗(yàn)值為目的,針對(duì)影響網(wǎng)站性能的諸多軟硬件因素如服務(wù)器、應(yīng)用服務(wù)、代碼和數(shù)據(jù)庫(kù)等,提出了一套系統(tǒng)的、實(shí)際可操作的基于Web服務(wù)的網(wǎng)站性能優(yōu)化解決方案,并列出了優(yōu)化前后網(wǎng)站訪問(wèn)性能的對(duì)比測(cè)試結(jié)果分析。
關(guān)鍵詞:Web服務(wù);性能優(yōu)化;數(shù)據(jù)庫(kù);碎片化
中圖分類(lèi)號(hào):TP393.027+.3;TP393.18 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2018)02-00-03
0 引 言
在“互聯(lián)網(wǎng)+”時(shí)代,用戶(hù)至上已經(jīng)被多數(shù)企業(yè)接受。網(wǎng)站訪問(wèn)速度及用戶(hù)訪問(wèn)體驗(yàn)值在企業(yè)網(wǎng)站運(yùn)營(yíng)的任何時(shí)期都至關(guān)重要,它是網(wǎng)站訪問(wèn)友好體驗(yàn)最基本的要素,否則后期所做的任何營(yíng)銷(xiāo)推廣和服務(wù)模式都有可能徒勞無(wú)功。由于客戶(hù)的耐心不高,加之網(wǎng)絡(luò)中客戶(hù)的選擇成本很低,一旦頁(yè)面訪問(wèn)時(shí)間超過(guò)6 s客戶(hù)就會(huì)離開(kāi),因此對(duì)于一些流量本就不高的企業(yè)網(wǎng)站來(lái)說(shuō)更是雪上加霜。
網(wǎng)站訪問(wèn)體驗(yàn)值深受用戶(hù)使用產(chǎn)品所有因素的影響,如從用戶(hù)發(fā)起對(duì)應(yīng)用的訪問(wèn),到收到該訪問(wèn)反饋的內(nèi)容,通常會(huì)經(jīng)過(guò)DNS查詢(xún)、網(wǎng)絡(luò)傳輸和接入轉(zhuǎn)發(fā)流程,以及Web服務(wù)、應(yīng)用服務(wù)、中間件、數(shù)據(jù)庫(kù)等應(yīng)用組件的信息處理,這些組件的性能優(yōu)劣會(huì)直接影響業(yè)務(wù)交互的實(shí)時(shí)性、準(zhǔn)確性和穩(wěn)定性。因此,當(dāng)企業(yè)網(wǎng)站面臨用戶(hù)體驗(yàn)值低下的情況時(shí),針對(duì)如此多的中間組件環(huán)節(jié),如何提出有效的系統(tǒng)網(wǎng)站性能優(yōu)化方案,成為了一個(gè)重要的研究課題。
本文從實(shí)踐經(jīng)驗(yàn)出發(fā),針對(duì)長(zhǎng)期運(yùn)營(yíng)的網(wǎng)站訪問(wèn)速度逐漸下降的情況,分別從服務(wù)器、應(yīng)用服務(wù)、程序和數(shù)據(jù)庫(kù)等對(duì)訪問(wèn)速度影響最大的幾個(gè)方面入手,本著優(yōu)先驗(yàn)證簡(jiǎn)單假設(shè)、從簡(jiǎn)單到復(fù)雜、從前端到后端、從外到內(nèi)、分步優(yōu)化的原則,提供了一套系統(tǒng)的、實(shí)際可操作、可有效提高用戶(hù)體驗(yàn)值的優(yōu)化網(wǎng)站性能方案,以及優(yōu)化后網(wǎng)站訪問(wèn)效果測(cè)試的對(duì)比分析。
1 性能優(yōu)化方案設(shè)計(jì)
1.1 服務(wù)器優(yōu)化
通常網(wǎng)站運(yùn)營(yíng)一段時(shí)間后,隨著業(yè)務(wù)的不斷增加、新系統(tǒng)應(yīng)用的不斷上線,對(duì)于網(wǎng)站服務(wù)器性能的要求也逐步提升,久而久之服務(wù)器運(yùn)行遇到性能瓶頸也是意料之中,因此在進(jìn)行網(wǎng)站調(diào)優(yōu)時(shí)首先應(yīng)考慮服務(wù)器調(diào)優(yōu)。
在不更換新服務(wù)器、不提升硬件配置以及不增加網(wǎng)絡(luò)帶寬等相關(guān)配置的情況下解決服務(wù)器性能瓶頸的問(wèn)題,可從兩方面入手:
(1)定期清除系統(tǒng)日志。垃圾系統(tǒng)日志文件會(huì)占用C盤(pán)太多空間,因此要定期刪除??煽紤]制作BAT或者cmd文件自動(dòng)清理,文件腳本如圖1所示。
(2)磁盤(pán)碎片整理。磁盤(pán)碎片過(guò)多會(huì)使系統(tǒng)在讀取文件時(shí)來(lái)回尋找,導(dǎo)致系統(tǒng)性能下降,因此需定期清理;
(3)清理備份文件??蓪:\Windows\winsxs\Backup一些備份文件刪除,節(jié)省磁盤(pán)空間;
(4)清理數(shù)據(jù)庫(kù)錯(cuò)誤日志文件。SQL2005數(shù)據(jù)庫(kù)由于對(duì)外開(kāi)放了1433端口,因此時(shí)常會(huì)有黑客嘗試破解SA密碼,導(dǎo)致產(chǎn)生大量錯(cuò)誤日志ERRORLOG文件,錯(cuò)誤日志路徑為C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG。
1.2 應(yīng)用服務(wù)優(yōu)化
實(shí)踐表明,用戶(hù)訪問(wèn)網(wǎng)頁(yè)的等待時(shí)間大部分發(fā)生在瀏覽器前端,尤其是加載頁(yè)面和加載頁(yè)面中的各種元素(圖片、CSS腳本、JavaScript代碼、Flash等)時(shí)。因此,相對(duì)于在艱苦而繁雜的程序上花費(fèi)大量時(shí)間和精力做改進(jìn),優(yōu)化Web前端能起到事半功倍的效果。
(1)禁止多余的Web服務(wù)擴(kuò)展。I2S支持多種服務(wù)擴(kuò)展,有些服務(wù)擴(kuò)展不但占用I2S資源影響性能,甚至存在安全漏洞,且對(duì)于Web運(yùn)行無(wú)意義,選擇禁止其啟動(dòng)。打開(kāi)I2S管理器,點(diǎn)擊“Web服務(wù)擴(kuò)展”,選中相應(yīng)的擴(kuò)展后點(diǎn)擊“禁用”即可;
(2)刪除無(wú)用的I2S擴(kuò)展名映射。I2S默認(rèn)支持.asp等多種擴(kuò)展名的映射,一些無(wú)用的擴(kuò)展會(huì)加重服務(wù)器的負(fù)擔(dān)且存在一定的安全隱患。刪除映射辦法:打開(kāi)I2S管理器中“默認(rèn)Web站點(diǎn)”中“屬性”選項(xiàng)卡,點(diǎn)擊“主目錄”,打開(kāi) “配置”窗口,選擇要?jiǎng)h除的擴(kuò)展名映射后點(diǎn)擊“刪除”即可;
(3)取消訪問(wèn)記錄。I2S默認(rèn)開(kāi)啟的Web訪問(wèn)記錄既龐雜又占用大量磁盤(pán)空間,嚴(yán)重影響了Web服務(wù)器性能。取消訪問(wèn)記錄的操作:打開(kāi)I2S管理器,找到具體的Web站點(diǎn),點(diǎn)開(kāi)“屬性”選項(xiàng)卡,在“主目錄”下取消對(duì)“記錄訪問(wèn)”的勾選即可;
(4)限制訪問(wèn)流量。打開(kāi)I2S管理器,定位到具體的Web站點(diǎn),打開(kāi)“屬性”窗口,選中“性能”標(biāo)簽與“啟用帶寬限制”,在 “最大網(wǎng)絡(luò)使用”設(shè)置中,設(shè)置帶寬的具體數(shù)值;
(5)讓W(xué)eb負(fù)載自由伸縮。操作步驟:在“Internet信息服務(wù)”管理器中應(yīng)用程序池的“屬性”對(duì)話框中打開(kāi)“性能”選項(xiàng)卡,在 “最大工作進(jìn)程數(shù)”輸入框中輸入進(jìn)程數(shù);
(6)清理緩存文件。手動(dòng)清理緩存文件C:\Winnt\I2S Temporary Compressed Files,當(dāng)I2S網(wǎng)站啟動(dòng)gzip功能時(shí),被訪問(wèn)的頁(yè)面會(huì)產(chǎn)生大量文件在C盤(pán),導(dǎo)致C盤(pán)被占滿(mǎn);
(7)建設(shè)獨(dú)立應(yīng)用程序池并設(shè)置為獨(dú)占方式訪問(wèn)。
1.3 程序優(yōu)化
通過(guò)優(yōu)化程序代碼和在數(shù)據(jù)庫(kù)的連接上加入一些技巧,就能讓程序更快地執(zhí)行,使應(yīng)用性能達(dá)到最佳。
1.3.1 網(wǎng)站腳本優(yōu)化
(1)將經(jīng)常使用的數(shù)據(jù)緩存在Web服務(wù)器上。如引用表、菜單項(xiàng)、擴(kuò)展標(biāo)記語(yǔ)言 (XML) 字符串、組合框列表、DHTML 碎片和站點(diǎn)配置變量(Internet 協(xié)議 (IP) 地址、包括數(shù)據(jù)源名稱(chēng)DSN和Web路徑)等;
(2)將經(jīng)常使用的數(shù)據(jù)緩存在Session 對(duì)象或Application中。Session 對(duì)象和ASP Application為在 HTTP 調(diào)用常用數(shù)據(jù)提供了方便的緩存容器;endprint
(3)定義私有變量。私有變量在運(yùn)行速度以及空間占用方面比全局變量速度更快。使用函數(shù)返回字符,同時(shí)避免使用變量,如果必須使用變量,那么盡量使用私有變量;
(4)在ASP程序行首放置<% option explicit%>,聲明VBScript變量,避免因服務(wù)器解析而影響服務(wù)器的響應(yīng)請(qǐng)求速度;
(5)使用case進(jìn)行條件選擇,避免使用if語(yǔ)句;
(6)避免在使用的global.asa文件中進(jìn)行對(duì)象定義;
(7)使用Response.Write生成HTML代碼,保持連貫的ASP代碼來(lái)提高性能,避免分散ASP代碼和HTML語(yǔ)言命令;
(8)使用< OBJECT >標(biāo)記代替Server.CreateObject。當(dāng)對(duì)象被首次引用時(shí)才創(chuàng)建< OBJECT >,而后者將立即創(chuàng)建對(duì)象,提高效率;
(9)打開(kāi)“Option Explicit”,明確定義變量選項(xiàng);
(10)慎用 Server.MapPath,明確的文字路徑建議使用MapPath;
(11)頁(yè)面執(zhí)行前使用Response.IsClientConnected以避免使用較長(zhǎng)時(shí)間加載頁(yè)面;
(12)在目錄 URL 中使用后斜杠“/”;
(13)盡量使用Server.Transfer而非Response.Redirect進(jìn)行優(yōu)化轉(zhuǎn)向鏈接。
1.3.2 數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化
(1)當(dāng)對(duì)象使用完畢后,首先使用Close方法釋放對(duì)象所占用的系統(tǒng)資源,然后設(shè)置對(duì)象值為“nothing”釋放對(duì)象占用的內(nèi)存;
(2)使用存儲(chǔ)過(guò)程訪問(wèn)數(shù)據(jù)庫(kù),配合ActiveX Data Objects(ADO)將會(huì)贏得很大的程序性能;
(3)當(dāng)只限取前面N條記錄時(shí),切勿使用 select *后再用ADO分頁(yè),若改為 select top N字段列表將會(huì)大大提高效率;
(4)統(tǒng)計(jì)記錄數(shù)時(shí)切勿用 select * from…,改用 select count(1) from…;
(5)盡量避免使用select * from table等SQL語(yǔ)句,避免程序從數(shù)據(jù)庫(kù)里讀取無(wú)用數(shù)據(jù),建議使用select 字段1,字段2 from table等形式,只從數(shù)據(jù)庫(kù)里讀取必要的數(shù)據(jù);
(6)勿用嵌套查詢(xún),使用sql = select a.id ,b.name from a left join b on b.id=a.id連表操作,并用具體的字段名代替 *;
(7)數(shù)據(jù)查詢(xún)時(shí)避免使用NOT IN(…)語(yǔ)句,可提高效率;
(8)去掉不必要的查詢(xún)使用語(yǔ)句如select *、Order by、group by等;
(9)刪除無(wú)意義的程序鎖;
(10)修改不合理擴(kuò)大查詢(xún)范圍語(yǔ)句,<>用<、>代替,not exists替代not in等;
(11)不用子查詢(xún);
(12)執(zhí)行語(yǔ)句避免對(duì)列的四則運(yùn)算;
(13)insert,update,delete等更改語(yǔ)句放在程序結(jié)束前執(zhí)行,以降低死鎖的可能性。
1.4 數(shù)據(jù)庫(kù)優(yōu)化
運(yùn)行中的站點(diǎn)隨著時(shí)間推移及應(yīng)用系統(tǒng)的頻繁使用,數(shù)據(jù)庫(kù)在日常使用過(guò)程中將不斷進(jìn)行insert,delete,update操作,導(dǎo)致表和索引出現(xiàn)碎片,從而成為影響網(wǎng)站反應(yīng)速度和性能的最主要因素。數(shù)據(jù)庫(kù)的碎片會(huì)導(dǎo)致系統(tǒng)性能減弱并浪費(fèi)大量表空間,因此優(yōu)化數(shù)據(jù)庫(kù)是提升用戶(hù)體驗(yàn)值的有效手段。
由于高水位線(HWL)下的許多數(shù)據(jù)塊都無(wú)數(shù)據(jù),但全表掃描時(shí)還需要掃描高水位線的數(shù)據(jù)塊,意味著Oracle要做許多無(wú)用功。因此Oracle提供了shrink space碎片整理功能。
(1)備份是整理碎片的前提,因此備份表A到備份表B。Oracle數(shù)據(jù)庫(kù)表備份命令操作截圖如圖2所示。
(2)分析待整理的表A,Oracle數(shù)據(jù)庫(kù)表分析結(jié)果如圖3所示。估算表在高水位線下還有多少空間可用,表使用率越接近高水位線,全表掃描所做的無(wú)用功也就越少。
(3)Oracle數(shù)據(jù)庫(kù)表碎片整理操作過(guò)程如圖4所示。
(4)如果該表之前建立過(guò)視圖,那么相關(guān)視圖需要重新編譯,然后重啟數(shù)據(jù)庫(kù)。至此碎片整理過(guò)程全部結(jié)束。
作為影響數(shù)據(jù)庫(kù)性能的一大因素,數(shù)據(jù)庫(kù)碎片應(yīng)當(dāng)引起網(wǎng)絡(luò)管理員的足夠重視,及時(shí)發(fā)現(xiàn)并清理碎片是網(wǎng)絡(luò)管理員維護(hù)工作的一項(xiàng)基本內(nèi)容。
1.5 其他優(yōu)化
(1)移動(dòng)設(shè)備優(yōu)先,單個(gè)數(shù)據(jù)對(duì)象小于 25 k。當(dāng)前階段,移動(dòng)互聯(lián)已成為主流,網(wǎng)站鏈接對(duì)象越小,加載速度就越快,移動(dòng)用戶(hù)的體驗(yàn)就越卓越;
(2)勿使用縮放圖片。制作合適的圖片,避免使用 ImageMagic 命令convert來(lái)拉伸或壓縮圖片;
(3)優(yōu)化圖片。相比GIF 、JPG及PNG格式圖片,應(yīng)盡可能使用擁有更多功能和更小尺寸的PNG格式圖片;
(4)控制第三方腳本。在關(guān)鍵頁(yè)面內(nèi)容之后加載第三方腳本,或放在頁(yè)面onLoad之后加載。
2 性能對(duì)比與分析
完成網(wǎng)站優(yōu)化后,重啟網(wǎng)站服務(wù)器即可看到明顯的優(yōu)化效果。通過(guò)Web性能測(cè)試工具進(jìn)行測(cè)試,測(cè)試結(jié)果如圖5、圖6所示。在獲取HTML文檔時(shí),優(yōu)化后花費(fèi)的時(shí)間不到優(yōu)化前總響應(yīng)時(shí)間的20%,首頁(yè)加載時(shí)間為365 ms,HTML頁(yè)生成的時(shí)間大大縮短,后臺(tái)運(yùn)行時(shí)間減少了50% (測(cè)試使用的是第三方Web測(cè)速工具,所有測(cè)試結(jié)果均在第三方瀏覽器本地0緩存的條件下進(jìn)行)。
對(duì)網(wǎng)站的首頁(yè)進(jìn)行一段時(shí)間的監(jiān)控后,其加載速度的測(cè)試結(jié)果如圖7所示。由圖可知,加載時(shí)間明顯縮短,網(wǎng)站整體實(shí)現(xiàn)了較大的性能提升。endprint
3 結(jié) 語(yǔ)
性能優(yōu)化是一個(gè)復(fù)雜的話題,牽涉廣泛,優(yōu)化過(guò)程中需考慮眾多因素。本文歸納總結(jié)的這些優(yōu)化方法對(duì)于一個(gè)中大型網(wǎng)站而言,可認(rèn)為是一個(gè)普遍高效的解決方案,但是落實(shí)到不同的業(yè)務(wù)時(shí),又會(huì)有自己的實(shí)現(xiàn)方式(實(shí)現(xiàn)方式指不同的方案組合和對(duì)應(yīng)的技術(shù)實(shí)現(xiàn)方式)。
性能因素是一個(gè)網(wǎng)站系統(tǒng)發(fā)展的重要推動(dòng)力,再細(xì)致的思考也難以兼容太多未知場(chǎng)景,因此不妨將目光投放在擴(kuò)展性和兼容性上,避免網(wǎng)站冷清的痛苦,更避免網(wǎng)站大熱的痛苦。
此外,在做任何優(yōu)化和操作前,需要做好網(wǎng)站和數(shù)據(jù)庫(kù)的備份工作。
參考文獻(xiàn)
[1]康長(zhǎng)安,陳玉紅.基于前端的Web性能優(yōu)化[J].電腦知識(shí)與技術(shù),2011,7(6):3811-3813.
[2]張正風(fēng),強(qiáng)承魁,袁劍鋒.Web性能優(yōu)化前端方案研究[J].軟件導(dǎo)刊,2013, 12(5):116-118.
[3]余以勝.移動(dòng)終端Web頁(yè)面的優(yōu)化處理研究[J].電子技術(shù)應(yīng)用,2014,40(7):126-129.
[4]陳宏君.基于Web標(biāo)準(zhǔn)的CSS樣式優(yōu)化分析[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2013(9):126-127.
[5]王政.Web前端開(kāi)發(fā)技術(shù)以及優(yōu)化研究[J].電腦知識(shí)與技術(shù),2013(8):5037-5038.
[6]李雨晨.Web系統(tǒng)前端性能優(yōu)化方法研究[D].長(zhǎng)沙:湖南大學(xué),2013.
[7]張開(kāi)敏.基于網(wǎng)頁(yè)結(jié)構(gòu)的自適應(yīng)Web緩存[J].中國(guó)科學(xué)技術(shù)大學(xué)學(xué)報(bào),2013,43(10):799-810.
[8]何中林.Web應(yīng)用系統(tǒng)的優(yōu)化與實(shí)踐[J].數(shù)字技術(shù)與應(yīng)用,2012(5):67-68.
[9]于海鵬,張旭陽(yáng).基于Web的應(yīng)用系統(tǒng)前端頁(yè)面性能優(yōu)化[J].福建電腦,2012,28(5):11-12.
[10]李鐵彬.網(wǎng)頁(yè)界面體驗(yàn)設(shè)計(jì)研究[D].哈爾濱:哈爾濱工程大學(xué),2011.
[11]張艷,石磊,衛(wèi)琳.Web緩存優(yōu)化模型研究[J].計(jì)算機(jī)工程,2009,35(8):85-87.
[12]劉柳.基于Web前端的性能優(yōu)化方案研究[D].武漢:華中科技大學(xué),2015.
[13]李蓉蓉,邱林潤(rùn).前端開(kāi)發(fā)技術(shù)與Web性能優(yōu)化探討[J].數(shù)字通信世界,2015(6):63-65.
[14]尹今朝.高并發(fā)訪問(wèn)下的Web性能優(yōu)化研究[J].城市建設(shè)理論研究(電子版),2013(16):48-49.endprint