任女爾+董長(zhǎng)青+陳辰
摘要:隨著J2EE軟件技術(shù)積累及其中間件技術(shù)的飛速發(fā)展,舊項(xiàng)目重構(gòu)、項(xiàng)目調(diào)優(yōu)等需求也逐漸增多。針對(duì)傳統(tǒng)研發(fā)模式的既有項(xiàng)目進(jìn)行調(diào)優(yōu),以低成本、短周期的演進(jìn)模式適應(yīng)變化的訪問(wèn)用戶數(shù)及高并發(fā)狀態(tài)下的快速響應(yīng)需求,成為大部分中小企業(yè)面臨的關(guān)鍵技術(shù)問(wèn)題。該文從中間件調(diào)優(yōu)、架構(gòu)調(diào)優(yōu)的工具、方法入手,提出了一系列分析和解決既有J2EE項(xiàng)目構(gòu)建高性能Web應(yīng)用的思路和解決方案。
關(guān)鍵詞:J2EE調(diào)優(yōu);中間件調(diào)優(yōu);性能優(yōu)化
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)32-0076-04
1 概述
J2EE技術(shù)經(jīng)過(guò)近十年的發(fā)展,以其跨平臺(tái)、可伸縮、靈活度高等特點(diǎn)得到了大規(guī)模應(yīng)用;在Sun、Oracle、IBM等公司及一些開源社區(qū)的演進(jìn)支持下,發(fā)展了多種多樣、靈活可配的插件、框架等,并不斷升級(jí)優(yōu)化。與此同時(shí),傳統(tǒng)行業(yè)以解決行業(yè)信息化問(wèn)題為主流手段的情況下,并未有效地跟進(jìn)互聯(lián)網(wǎng)行業(yè)技術(shù)迭代更新,引發(fā)了生產(chǎn)制造、信息管理隨著規(guī)模增大、用戶增多的情況下Web應(yīng)用的性能和高并發(fā)支撐問(wèn)題。
本文著手傳統(tǒng)技術(shù)調(diào)優(yōu)手段及新技術(shù)框架升級(jí)等方面,以方法、思路以及驗(yàn)證結(jié)果為主展示傳統(tǒng)J2EE項(xiàng)目的調(diào)優(yōu)過(guò)程。
2 傳統(tǒng)J2EE項(xiàng)目特點(diǎn)
傳統(tǒng)J2EE項(xiàng)目發(fā)展迅速,在企業(yè)級(jí)應(yīng)用構(gòu)建中普及率較高,應(yīng)用場(chǎng)景表現(xiàn)為使用人數(shù)百人到千人規(guī)模,包含一些基礎(chǔ)信息化管理功能,針對(duì)特定領(lǐng)域內(nèi)容有一定的計(jì)算和分析功能,針對(duì)消息、工作流、文件及圖片管理有特定的需求等。
2.1 框架技術(shù)及其演進(jìn)
在2005年左右開始大規(guī)模普及的SSH(Struts 2、Spring、Hibernate)框架技術(shù)最為常見(jiàn),逐步演進(jìn)的技術(shù)包含:
1) SpringMVC以更簡(jiǎn)易、更高性能逐步取代漏洞較多的Struts2;
2) Mybatis以原生sql便于使用的優(yōu)勢(shì)搶占Hibernate市場(chǎng),但由于后者方言支持、自動(dòng)化強(qiáng)、更關(guān)注業(yè)務(wù)等特點(diǎn)并未被取代;
3) 數(shù)據(jù)庫(kù)連接池技術(shù)由原來(lái)的DBCP、C3P0、Proxool等框架受到緩存策略更優(yōu)秀、監(jiān)控支持、擴(kuò)展支持、并發(fā)支持更好的Druid沖擊;
4) 隨著前后端分離技術(shù)的發(fā)展,Swagger等調(diào)試工具體現(xiàn)良好;
5) 性能監(jiān)控如Javamelody和JMetrics在高并發(fā)調(diào)試下逐步展露;
6) 其他框架如Dozer相對(duì)于BeanManager等。
相對(duì)于傳統(tǒng)框架技術(shù),逐步發(fā)展的微服務(wù)技術(shù)從架構(gòu)的角度從框架到調(diào)試工具、從運(yùn)作研發(fā)模式到運(yùn)維方式都更為靈活方便,是目前常用的互聯(lián)網(wǎng)架構(gòu),如Dubbo+zookeeper、SpringBoot+SpringCloud等可以高效地解決高并發(fā)應(yīng)用相關(guān)技術(shù)問(wèn)題,不在本文重點(diǎn)闡述范圍內(nèi)。
2.2 中間件技術(shù)
J2EE中間件技術(shù)在中小系統(tǒng)中輕便簡(jiǎn)單、跨平臺(tái)安裝的Tomcat普及率較高,此外在大型系統(tǒng)分布式構(gòu)建中常用中間件有Weblogic,此外還有Jboss和Websphere等。本文設(shè)計(jì)相關(guān)技術(shù)則以Tomcat和Weblogic技術(shù)為主進(jìn)行調(diào)優(yōu),數(shù)據(jù)庫(kù)以O(shè)racle為例進(jìn)行講解。
3 總體優(yōu)化策略及調(diào)優(yōu)團(tuán)隊(duì)及工具
J2EE項(xiàng)目調(diào)優(yōu)策略主要分為架構(gòu)和運(yùn)維兩個(gè)大的方向進(jìn)行。從架構(gòu)的角度來(lái)說(shuō),微服務(wù)為目前行業(yè)架構(gòu)的主流,因其改動(dòng)較多、重構(gòu)成本高,中小企業(yè)應(yīng)急式調(diào)優(yōu)只針對(duì)部門框架調(diào)整進(jìn)行。從運(yùn)維的角度來(lái)說(shuō),本文主要優(yōu)化策略包括:CND及Redis緩存、操作系統(tǒng)參數(shù)調(diào)優(yōu)、Java應(yīng)用JVM參數(shù)、Tomcat調(diào)優(yōu)、負(fù)載均衡等,此外,運(yùn)維調(diào)優(yōu)還包括多地域部署、DNS、公網(wǎng)及內(nèi)網(wǎng)鏈路等策略。從運(yùn)維的角度支持高并發(fā),主要為先針對(duì)單個(gè)中間件進(jìn)行調(diào)優(yōu)、測(cè)量,使服務(wù)器資源充分利用起來(lái),然后針對(duì)集群環(huán)境進(jìn)行部署并測(cè)試。
性能調(diào)優(yōu)的工具:系統(tǒng)性能有問(wèn)題最直接的表現(xiàn)是卡頓,如何判斷是網(wǎng)絡(luò)問(wèn)題還是應(yīng)用問(wèn)題,需要專業(yè)的工具來(lái)進(jìn)行測(cè)量:
1) nmon工具:用于直觀的檢測(cè)linux環(huán)境下CPU、內(nèi)存、網(wǎng)絡(luò)及磁盤等的使用情況信息,如圖1所示。
點(diǎn)擊“C”可以查看CPU,點(diǎn)擊“n”可以查看網(wǎng)絡(luò)如圖2所示。
2) GoAccess:實(shí)時(shí)分析web日志的分析工具。如圖3所示,可以查看每個(gè)文件對(duì)網(wǎng)絡(luò)的消耗情況。
圖3中可以看出,jquery.min.js文件在6分鐘網(wǎng)絡(luò)監(jiān)控匯總消耗了418MB網(wǎng)絡(luò)資源。
3) AWR報(bào)告及Druid結(jié)果:AWR為oracle提供的數(shù)據(jù)庫(kù)執(zhí)行情況報(bào)告可以直接導(dǎo)出查看;Druid為數(shù)據(jù)庫(kù)連接的技術(shù)框架,提供高可靠的數(shù)據(jù)庫(kù)連接池和連接控制服務(wù)。
4) Gzip測(cè)試:可以通過(guò)網(wǎng)址測(cè)試http://tool.chinaz.com/Gzips/。如下所示:
5) LoadRunner及Jmeter:LoadRunner對(duì)于web頁(yè)面壓測(cè)較為方便,Jmeter更輕量級(jí)適合接口級(jí)測(cè)試。本文重點(diǎn)使用LoadRunner,其中l(wèi)oadrunner腳本執(zhí)行可以設(shè)置循環(huán)次數(shù)、方法等,并可以選擇性設(shè)置是否緩存瀏覽器數(shù)據(jù)。
性能調(diào)優(yōu)的團(tuán)隊(duì):測(cè)試人員、運(yùn)維人員、開發(fā)人員、DBA等。其中測(cè)試人員主要只性能測(cè)試,需要這對(duì)各階段調(diào)試結(jié)果評(píng)估效果并提出問(wèn)題關(guān)鍵點(diǎn);運(yùn)維人員針對(duì)部署環(huán)境參數(shù)、中間件參數(shù)等進(jìn)行調(diào)優(yōu);開發(fā)人員將測(cè)試的慢應(yīng)用邏輯及慢sql等進(jìn)行調(diào)整;DBA調(diào)整數(shù)據(jù)庫(kù)環(huán)境參數(shù),并提出sql修改建議及意見(jiàn)。
3.1 現(xiàn)象及問(wèn)題分析
部署環(huán)境:初步部署環(huán)境簡(jiǎn)單隨意,主要審查應(yīng)用的基礎(chǔ)特點(diǎn);本文選用環(huán)境為oracle linux服務(wù)器兩臺(tái)分別做數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)器,為了檢測(cè)應(yīng)用對(duì)資源使用情況,服務(wù)器性能以低配為主。endprint
初步審查:查看系統(tǒng)首先將nmon啟動(dòng),隨時(shí)監(jiān)控服務(wù)器資源使用情況;啟動(dòng)“jstack 2260|more”(2260為當(dāng)次啟動(dòng)的java進(jìn)程),然后點(diǎn)擊應(yīng)用系統(tǒng)的響應(yīng)較慢的功能,觀察應(yīng)用現(xiàn)象及java進(jìn)程日志。(附圖 nmon進(jìn)程),jstack日志:
隨著查閱主要有幾個(gè)特征:應(yīng)用CPU利用率較低、數(shù)據(jù)庫(kù)CPU利用率稍高、頁(yè)面圖片加載速度慢、console輸出大量sql文日志、jstack日志的dump出現(xiàn)很多createconnect過(guò)程及Waiting on condition狀態(tài)。
現(xiàn)象表示,在低并發(fā)下,sql文都較長(zhǎng)消耗了較多的數(shù)據(jù)庫(kù)服務(wù)器資源,createconnect說(shuō)明數(shù)據(jù)庫(kù)連接池不足夠支撐應(yīng)用;Wariting on condition代表后臺(tái)可能因?yàn)檫壿嬏幚砘蚓W(wǎng)絡(luò)傳輸造成響應(yīng)速度慢,圖片因文件過(guò)大(最大124K)傳輸較慢,日志沒(méi)有合理關(guān)閉并且可能出現(xiàn)同步生成日志的情況。進(jìn)一步可以確認(rèn)可以從數(shù)據(jù)庫(kù)連接池、日志、sql調(diào)優(yōu)、圖片壓縮、中間件環(huán)境參數(shù)進(jìn)行調(diào)整。
3.2 調(diào)優(yōu)策略預(yù)估
調(diào)優(yōu)一般遵從先單機(jī)調(diào)試再集群調(diào)試、逐步調(diào)優(yōu)并結(jié)果驗(yàn)證的原則。當(dāng)單機(jī)調(diào)試可以支持系統(tǒng)利用服務(wù)器的80%左右資源時(shí)考慮集群調(diào)優(yōu),否則出現(xiàn)集群資源利用率上不去、并發(fā)性也上不去的現(xiàn)象。逐步驗(yàn)證結(jié)果旨在保證所做策略是行之有效的。在調(diào)優(yōu)策略中,通用的技術(shù)手段包含環(huán)境參數(shù)調(diào)優(yōu)、程序調(diào)優(yōu)及中間件調(diào)優(yōu)。環(huán)境參數(shù)主要將服務(wù)器資源充分釋放給應(yīng)用;程序調(diào)優(yōu)可以采用局部?jī)?yōu)化程序算法,進(jìn)一步通過(guò)緩存策略將數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)緩存及業(yè)務(wù)數(shù)據(jù)緩存,可以有效地避免重復(fù)復(fù)雜的邏輯計(jì)算。結(jié)合初步驗(yàn)證的應(yīng)用表現(xiàn)監(jiān)控現(xiàn)象,可以初步確定如下調(diào)優(yōu)方案進(jìn)行逐步驗(yàn)證:
4 調(diào)優(yōu)實(shí)踐及結(jié)果
第一步:測(cè)試環(huán)境準(zhǔn)備及執(zhí)行基礎(chǔ)參數(shù)測(cè)試。
測(cè)試環(huán)境準(zhǔn)備:首先制定了基礎(chǔ)測(cè)試環(huán)境準(zhǔn)備如下表所示。其中,首次準(zhǔn)備配置較高,網(wǎng)絡(luò)環(huán)境較差,無(wú)法匹配測(cè)試結(jié)果,因此降低配置(下表中為降低后的配置),將低配的服務(wù)器環(huán)境充分利用進(jìn)行評(píng)估。
基礎(chǔ)參數(shù)測(cè)試:準(zhǔn)備了一個(gè)登錄測(cè)試用例和一個(gè)業(yè)務(wù)的測(cè)試用例;然后根據(jù)基礎(chǔ)環(huán)境參數(shù)不調(diào)優(yōu)狀態(tài)下進(jìn)行測(cè)試;以每秒平均處理事務(wù)數(shù)作為調(diào)優(yōu)的基準(zhǔn)參考參數(shù)。
200并發(fā)用戶下不帶緩存TPS:
如圖所示,在基準(zhǔn)測(cè)試時(shí),200用戶并發(fā)時(shí),每秒事務(wù)處理數(shù)TPS,在帶和不帶緩存下分別是38和2.8。
第二步:環(huán)境和應(yīng)用調(diào)優(yōu)。根據(jù)一輪分析結(jié)果,需要調(diào)整環(huán)境和軟件參數(shù),包括日志切換為異步方式,數(shù)據(jù)庫(kù)連接池切換druid,Hibernate開啟二級(jí)緩存,操作系統(tǒng)開啟限制級(jí)別。
1) 日志切換,將同步生成日志改為異步:
2) 數(shù)據(jù)庫(kù)連接池從dbcp切換到Druid,并設(shè)置數(shù)據(jù)庫(kù)連接參數(shù),進(jìn)行監(jiān)控:
監(jiān)控可以直接查看各個(gè)點(diǎn)擊功能對(duì)數(shù)據(jù)庫(kù)操作的影響,并提供具體慢sql執(zhí)行時(shí)間,從而針對(duì)性優(yōu)化業(yè)務(wù)邏輯和算法實(shí)現(xiàn)。此外,從切換后jstack可以查看到持續(xù)創(chuàng)建數(shù)據(jù)庫(kù)連接的日志消失了,druid對(duì)該方面的控制能力更優(yōu)。
3) Hibernate開啟緩存和批量處理:一級(jí)、二級(jí)緩存開啟,查詢的批量處理: hibernate.jdbc.fetch_size=50,hibernate.jdbc.batch_size=30。
4) 系統(tǒng)級(jí)參數(shù):開啟系統(tǒng)級(jí)參數(shù)可以非常放開系統(tǒng)對(duì)單個(gè)用戶、應(yīng)用的資源限制,從而使應(yīng)用能夠充分利用硬件資源。
修改/etc/sysctl.conf,放開網(wǎng)絡(luò)限制:
5) 調(diào)整圖片和基礎(chǔ)壓縮。傳統(tǒng)web應(yīng)用中,頁(yè)面和圖片的大小都比較大,一般都在幾百KB甚至更高。前面每一步調(diào)整,均進(jìn)行相應(yīng)的測(cè)試,測(cè)試發(fā)現(xiàn),網(wǎng)絡(luò)環(huán)境受限,因此系統(tǒng)的CPU和內(nèi)存使用量無(wú)法偏低,無(wú)法達(dá)到合理利用的70%-80%范圍?;A(chǔ)能夠確認(rèn)方案要提升數(shù)據(jù)傳輸效率。因此根據(jù)訪問(wèn)的goaccess記錄結(jié)果,將大圖片進(jìn)行修正為web版式,再基于tomcat/nginx進(jìn)行傳輸數(shù)據(jù)的壓縮。
經(jīng)過(guò)前五部分調(diào)優(yōu)測(cè)試,測(cè)試結(jié)果提升到500用戶在線下平均3.32s完成數(shù)據(jù)響應(yīng)處理,較起始200并發(fā)下平均響應(yīng)時(shí)間59s有了大幅度提升。
第三步,中間件調(diào)優(yōu):一方面從memcached緩存入手(也可采用redis,性能差異較?。?,另一方面從tomcat I/O方式調(diào)優(yōu)。
緩存調(diào)優(yōu)主要通過(guò)將hibernate二級(jí)緩存防止到memcached中,如圖16分別測(cè)試了登錄帶緩存、不帶緩存,業(yè)務(wù)帶緩存和不帶緩存四個(gè)場(chǎng)景添加和不添加緩存下的磁盤IO狀態(tài)。
memcached緩存處理:IO處理能力提升2%,命中率在70%。
常用的中間件tomcat支持BIO、NIO及APR三種接收請(qǐng)求的處理方式。BIO為阻塞式,tomcat默認(rèn)I/O方式,但其對(duì)高并發(fā)靜態(tài)文件處理能力非常有限,線程處理數(shù)據(jù)阻塞狀態(tài)較多;NIO為非阻塞式,相對(duì)來(lái)說(shuō)很大程度上提升了并發(fā)處理能力;apr則從底層調(diào)用方式上進(jìn)行了徹底的改進(jìn),相當(dāng)于直接從操作系統(tǒng)級(jí)解決IO調(diào)用問(wèn)題,但是必然面臨著跨平臺(tái)性降低,需要在部署時(shí)專門針對(duì)APR模式安裝底層支持。APR模式大幅度提升了服務(wù)器的處理和響應(yīng)能力,是tomcat運(yùn)行高并發(fā)web應(yīng)用的最佳模式。Tomcat啟動(dòng)時(shí),可以通過(guò)啟動(dòng)的標(biāo)示看出以哪種I/O運(yùn)行,如下圖為BIO啟動(dòng)標(biāo)示。
最終調(diào)優(yōu)達(dá)到了500并發(fā)下,平均登錄耗時(shí)2.935s。
5 總結(jié)
綜合分析,本文通過(guò)中間件進(jìn)行圖片壓縮處理、通過(guò)圖片加工web樣式、軟件sql調(diào)優(yōu)等最終使得單tomcat應(yīng)用的性能大幅度提升,并發(fā)響應(yīng)支撐能力提升了2.5倍,響應(yīng)時(shí)間降低了25倍。基于該方案,可以進(jìn)一步進(jìn)行分布式部署:應(yīng)用級(jí)部署并發(fā)性與硬件、部署節(jié)點(diǎn)數(shù)成線性正比,數(shù)據(jù)庫(kù)需再進(jìn)行測(cè)試調(diào)整。整體方案在不需要大幅度調(diào)整軟件架構(gòu)的情況下達(dá)到了較為理想的效果,對(duì)傳統(tǒng)IT行業(yè)J2EE優(yōu)化具有重要的指導(dǎo)意義。endprint