梁思率, 王 臻, 楊樹國
(1. 清華大學 計算機與信息管理中心, 北京 100084; 2. 清華大學 實驗室與設備處, 北京 100084)
?
清華大學儀器共享平臺性能優(yōu)化實踐
梁思率1, 王臻1, 楊樹國2
(1. 清華大學 計算機與信息管理中心, 北京100084; 2. 清華大學 實驗室與設備處, 北京100084)
清華大學儀器設備共享平臺在學校提供的負載均衡硬件架構F5以及開源負載均衡軟件架構shiro + ehcache + quartz的session同步、緩存同步、定時任務分布式調度管理下,綜合運用各種數(shù)據(jù)庫優(yōu)化技術、服務端優(yōu)化技術、前端優(yōu)化技術提升了系統(tǒng)訪問速度。實踐證明,這套方案是有效的。
儀器設備管理; 負載均衡;物化視圖; SQL優(yōu)化
清華大學儀器設備共享系統(tǒng)的用戶數(shù)量級是5萬個左右,包括來自校內200多個實驗室的用戶以及部分校外用戶,管理大型儀器設備數(shù)千臺,每年要進行一次設備效益評價統(tǒng)計工作。此外,還要開發(fā)手機端應用,以滿足未來更多用戶的需求。因此,對系統(tǒng)性能的要求就提升到了一個很重要的層面。不同于一般業(yè)務系統(tǒng),它要求快速響應,對于大數(shù)據(jù)的處理和查詢要做到盡可能實時,是一個典型的性能優(yōu)化案例。通常,負載均衡是一個好的策略,此外,還要根據(jù)性能瓶頸的來源,逐個進行優(yōu)化。
我們主要對Web系統(tǒng)進行優(yōu)化,這里面比較重要的指標包括響應時間、吞吐率、資源利用率等。響應時間是其中最重要的一個指標,它直接面向用戶,關系到用戶體驗。對于一個等待時間較長的頁面,用戶是沒有耐心去使用的。因此,我們先對響應時間建立模型[1-3]:
(1)
T表示系統(tǒng)響應時間由網(wǎng)絡傳輸時間Tweb、客戶端響應時間Tc和服務器響應時間Ts3部分組成。對它進一步進行細化得出影響因子模型如下[4]:
T≈payload/bandwidth+RTT×n/portNum+
(2)
其中:payload是數(shù)據(jù)傳輸量,bandwidth是網(wǎng)絡帶寬,它們是Tweb的部分;RTT是網(wǎng)絡延時和建立連接耗時,n是資源請求數(shù)量(這里的資源指js、css、image等靜態(tài)資源),portNum是并行端口數(shù),T渲染是頁面渲染時間,它們是Tc的部分;Nvu是每臺服務器的并發(fā)用戶數(shù),Tsql是數(shù)據(jù)庫操作耗時,Tserver是服務器緩存及代碼的執(zhí)行時間,它們是Ts的部分。這就為我們進一步優(yōu)化提供了依據(jù)。
由公式(2)可見,Tweb部分的bandwidth是由網(wǎng)絡環(huán)境決定的,它不由我們控制,在清華大學采用的就是清華校園網(wǎng),而payload部分是可控的,我們可以通過壓縮靜態(tài)文本資源、壓縮圖片、設置瀏覽器緩存的方式減少數(shù)據(jù)下載量,相關優(yōu)化技術可參考前端優(yōu)化。
Tc部分的RTT可通過設置HTTP的Keep-Alive功能加以減少,n可通過合并js、css文件、將小圖片集成到一張大圖中的方式加以減少,portNum和瀏覽器解析域名有關,一般不加以調整,T渲染可通過頁面靜態(tài)化技術、ajax技術加以減少。
Ts部分的Nvu可通過負載均衡技術加以減少,Tsql可通過各種數(shù)據(jù)庫優(yōu)化技術加以減少,Tserver可通過服務器緩存、程序代碼優(yōu)化技術、前端計算代替服務端計算的方式加以減少,此外,Tsql和Tserver還可以通過跟蹤用戶使用習慣有針對性的加以優(yōu)化。
對于分布式文件存取和數(shù)據(jù)挖掘一般采用計算集群,如spark,而對于高校內部的業(yè)務系統(tǒng)一般采用Web集群,如開源的shiro + ehcache + quartz框架,或者商業(yè)的Terracotta框架。由于預算的原因,我們采用的是開源框架。其中,集群緩存同步策略是采用Ehcache[5-8],關于它的配置已經(jīng)有了大量的說明。而集群定時任務調度則是采用Quartz[9],它可以避免重復執(zhí)行已經(jīng)執(zhí)行過的定時任務,同時保證定時任務均勻地分配到各臺服務器上,達到負載均衡,關于它的設置也有說明。而用戶session同步則是采用Shiro權限框架,通過一定的spring配置,將session放到Ehcache緩存中進行管理,而Ehcache是有集群同步策略的,這就使session也實現(xiàn)了同步。
由于會話保持技術的存在,一個用戶一般只能登錄一臺服務器,除非長時間登錄,否則session同步在大部分時間里是不需要的。此外,如果沒有在用戶之間共享全局緩存讀寫,緩存同步也是不需要的,只需要定期從數(shù)據(jù)庫同步即可。對于這樣的系統(tǒng),一般只存在定時任務的同步,如果單獨上一個quartz框架可能需要在運維的時候按一定順序執(zhí)行不同服務器上的不同java函數(shù),這樣的操作是繁瑣的,有一種替代的辦法是讀寫配置文件,不同服務器設置不同的開關參數(shù),控制定時任務的執(zhí)行與禁止,使得定時任務只被一臺服務器執(zhí)行,而損失的只是負載分配和調度的功能,這對少量的服務器集群(2~4臺)是可以接受的。
3.1壓縮圖片、css、js文件的大小
文本資源壓縮一般采用Gzip算法,這在傳輸時可以節(jié)省大量的帶寬,對于圖片、文件、css、js都可以采用這種方式傳輸,此外還有將多張小圖片集成到一張大圖,盡可能傳輸壓縮后的小圖而讓大圖在詳細頁展示,用工具將js進行壓縮和混淆,精簡合并css等[4],這已被谷歌等互聯(lián)網(wǎng)巨頭大量采用,并且已成為前端開發(fā)的流行規(guī)范,有助于降低瀏覽器加載時間。
3.2頁面靜態(tài)化
這和緩存的思路是類似的,對于經(jīng)常訪問但又變化不大的頁面,如果內容較多、有較多的數(shù)據(jù)庫訪問,則采用頁面靜態(tài)化并定期更新不失為一個好的思路,這可以減少瀏覽器渲染的時間。
3.3Ajax
Ajax技術是一種比較成熟的技術,對于我們開發(fā)的前端系統(tǒng),基本90%以上的服務器訪問都是采用這種技術,除了少量的大表單提交。局部刷新技術可以有效緩解頁面刷新帶來的數(shù)據(jù)傳輸壓力,減少了數(shù)據(jù)傳輸量,降低了網(wǎng)絡傳輸時間。
除了負載均衡框架保證了分布式系統(tǒng)邏輯上的正確性,以及多個服務器帶來的性能提升以外,對程序本身的優(yōu)化也是非常重要的。對于Java后臺程序,常見的優(yōu)化措施有很多種,對程序的編碼要求也很高,經(jīng)過我們測試,真正影響性能的有如下幾種。
4.1緩存
我們在判斷上機預約權限(也包括送樣預約和直接登記預約)的時候采用了大量多維度的權限驗證,這些驗證操作要訪問大量的數(shù)據(jù)庫,如查黑名單、白名單、儀器規(guī)則設置、實驗室規(guī)則設置、校內外主用戶余額等,如果能將這些計算提前計算好放在用戶session里,或者一次計算處處采用下次判斷能從session里及時獲得以前的計算結果,則性能將大大提升。實際上,我們是將一部分權限計算放在了登錄環(huán)節(jié),還有一部分權限計算雖然放在了各個權限判斷的調用函數(shù)里,但都做了session緩存,下次同一個用戶再進行預約的時候就不需要重復進行計算了。此外,在某臺儀器的預約日歷載入的時候,一般我們是從數(shù)據(jù)庫一次性載入1周的日歷,數(shù)量級在500個左右,有時用戶量大的時候每個人都做這樣的操作,會導致性能下降。我們可以做一個啟動定時任務,將所有儀器設備(大約2 000臺)的當前周日歷全部放在緩存中,當周切換的時候及時更新這些數(shù)據(jù),如果有用戶做了預約的增刪改查操作也及時地更新緩存里的數(shù)據(jù),這樣就可以使性能提升。而需要注意的是在集群下一定要做緩存同步,避免數(shù)據(jù)不一致。
4.2For循環(huán)
For循環(huán)是一個很容易被人忽略的環(huán)節(jié),而這個地方往往是大量消耗性能的。比如在For循環(huán)里再寫sql、new變量、反復調用同一個函數(shù)而不是將它的返回結果提前儲存起來等等。循環(huán)寫sql是非常消耗資源的,應極力避免,一般得通過一定的轉化變?yōu)橐粭lsql。循環(huán)New變量是一個編程習慣問題,會導致GC大量的被調用最后造成內存溢出,類似不關閉connection、不關閉io這樣的問題,應統(tǒng)一放在循環(huán)外面,只調用一個變量。循環(huán)中用到的重復函數(shù)結果也應該提前存儲在變量里,避免額外的開銷。此外,try-catch模塊也不能放在循環(huán)里,必須放在外面。總之,對循環(huán)的優(yōu)化是java優(yōu)化的重要環(huán)節(jié),畢竟它涉及到復雜度的問題。
4.3前端計算
我們可以把大量繁瑣的計算放在前端js里,即富客戶端,讓每個客戶的瀏覽器去執(zhí)行,這有效的緩解了服務器的計算壓力,這種優(yōu)化方式跳出了純粹優(yōu)化服務端的思維定勢,是一種比較有效的辦法。比如日歷控件的月、周、日視圖切換就可以采用這種技術,服務器1次加載1個月的日歷,由前端瀏覽器js根據(jù)當前視圖時間范圍決定顯示的范圍。
4.4跟蹤用戶使用習慣
在我們還不太了解用戶使用習慣的時候需要采用一定的辦法去實時地跟蹤用戶的使用情況[9],這樣可以做到有的放矢,有針對性的優(yōu)化那些熱門的模塊和功能。我們采用的是用一個filter攔截器記錄所有的用戶訪問url次數(shù)和執(zhí)行時間,對于桌面端和手機端都做這樣的跟蹤,從中我們可以看出哪些是需要馬上進行優(yōu)化的,哪些使用的用戶量少可以先放一放。此外,對于Java內存泄漏還可以采用Jprofiler工具進行跟蹤,壓力測試可以采用開源的Jmeter或者商業(yè)的Loadrunner工具進行。
數(shù)據(jù)庫優(yōu)化則更是一個被討論了無數(shù)次的話題[10-12],但真正能用好卻不容易,我們在實踐中總結了以下幾點,作為重點考慮的策略。
5.1物化視圖
有一種特殊的視圖是物化視圖[2],它可以生成物理表,當引用的表數(shù)據(jù)有更新的時候,它也可以觸發(fā)更新,或者定時更新。對于數(shù)據(jù)變化量不大而又有大量聯(lián)立操作的視圖比如人員、儀器、定制的組合列表頁面等,可以采用物化視圖。物化視圖的sql語句并不復雜,一般10個以內的物化視圖都不會影響數(shù)據(jù)庫性能,這就大大降低了我們系統(tǒng)的數(shù)據(jù)庫負載,提高了訪問速度。
5.2分割歷史表
在高校往往積累了10幾年的業(yè)務系統(tǒng)數(shù)據(jù),這些數(shù)據(jù)在io的時候不可能從所有的數(shù)據(jù)中進行查詢,而要區(qū)分最新數(shù)據(jù)(當年或當月)和歷史數(shù)據(jù),分別存放在不同的表內,這樣才能提高檢索性能。對于預約數(shù)據(jù)也得采用這樣的策略,當歷史數(shù)據(jù)積累得多了以后,比如10年以上,對數(shù)據(jù)的檢索就必須采用歷史表和當前表的方式。
5.3取消聯(lián)立大表
視圖或sql中往往無意識地聯(lián)立了一些大表,比如人員表(清華有幾十萬人員的歷史數(shù)據(jù)),有時還聯(lián)立了不止1次,比如預約視圖調用了從用戶的聯(lián)系方式和主用戶的聯(lián)系方式。這些相對不重要的數(shù)據(jù)可以在頁面端實時獲得,比如通過點擊ajax展示詳細頁獲取聯(lián)系方式,這種時間上分散加載的方式也能大大提高系統(tǒng)性能。
5.4設置冗余字段
對于人員數(shù)據(jù)、儀器數(shù)據(jù)這樣的字段每個表幾乎都要用,如果都采用聯(lián)立的方式獲得勢必造成大量的數(shù)據(jù)庫性能消耗,因此對于較穩(wěn)定的字段比如用戶名、用戶姓名等可以作為冗余字段放在表里,而不需要再去聯(lián)立獲得了,雖然這不符合數(shù)據(jù)庫范式,但卻提高了系統(tǒng)的相應速度,是一種靈活的策略。
5.5設置索引
索引的重要性毋庸置疑,對于where語句、連接語句中大量用到的字段要做索引,索引的總數(shù)每個表不易超過5個,但這也不絕對,對于有大量字段的復雜表一般我們最多使用6~7個應該也沒有問題。對于會繞開索引的sql語句要極力避免,比如is null/is not null要用非空或default字段代替,or要用union代替,<>要用>或<代替,盡量少用like和sql函數(shù),因為它們不會使用索引。
5.6避免*查詢
這是一個經(jīng)常被忽略的問題,但是在實際應用中我們發(fā)現(xiàn),它造成了很大的性能損耗。比如我們的預約表有40多個字段,用*查詢會大量消耗性能,如果只對需要的字段單獨構造視圖,則會減少好幾倍的查詢時間。
5.7SQL優(yōu)化
對于sql優(yōu)化的討論已有大量的說明,而在我們的系統(tǒng)中應用也起到了立竿見影的效果。比如統(tǒng)計模塊,需要從多個維度、多個角色、多個字段對一個主題進行統(tǒng)計,這時查詢的性能就顯得尤為重要。否則一個統(tǒng)計操作就需要好幾分鐘甚至1小時,就不符合系統(tǒng)的需要。統(tǒng)計主要是面向系統(tǒng)管理員、實驗室管理員、儀器管理員、主用戶、從用戶查閱自己管理范圍的數(shù)據(jù)匯總或測試記錄明細。系統(tǒng)的難點在于要同時返回針對多個查詢項(儀器、實驗室、主用戶或從用戶)的幾十個數(shù)據(jù)匯總時,交叉起來可能會到上萬個數(shù)據(jù)量級的計算結果的獲得。為了減少查詢時間,在寫sql的時候盡量用一條sql語句返回多條結果,包括多個查詢項的和多個數(shù)據(jù)匯總項的結果,可以多用group by,在遇到實驗室繼承的情況時還得巧用start with,避免遞歸循環(huán)次數(shù)過多,可以將每次查詢時間控制在幾秒以內。對于繼承或非繼承、不同的角色和匯總/明細的組合、開始時間和結束時間約束的組合還得寫多份sql。這里面涉及到很多sql組合的技巧,只能在實踐中慢慢體會,而比較基本的包括:用exists替換in、where語句將縮減范圍作用大的放在前面、直接用字符串名稱定義規(guī)則代替遞歸查詢、用group by代替distinct等。
采用了負載均衡和各種前后端優(yōu)化技術后的清華大學儀器設備共享系統(tǒng)性能有了很大提高。我們對系統(tǒng)架構進行了升級,使得其能夠支持緩存和session同步,以及定時任務的分布式調度,滿足了大部分的要求。進一步根據(jù)業(yè)務系統(tǒng)開發(fā)積累下來的經(jīng)驗,對程序代碼進行了深度優(yōu)化,主要包括Java后臺程序和數(shù)據(jù)庫操作兩個方面。經(jīng)過我們的優(yōu)化,系統(tǒng)各個模塊能夠順利運行,并且絕大部分都能在短時間內返回應有的結果,提高了用戶體驗。這也便于進一步的手機端開發(fā)等需要快速響應的場合,在什么都需要短平快的今天,儀器共享系統(tǒng)也通過它的不斷實踐朝著這個方向邁進。
References)
[1] 張紅光. 基于軟件性能測試的Web系統(tǒng)響應時間優(yōu)化研究[D]. 北京: 北京林業(yè)大學, 2010
[2] 劉乃嘉, 彭宇, 王鑫, 等. 清華大學網(wǎng)上選課性能優(yōu)化研究與實踐[J]. 實驗技術與管理, 2011, 28(5), 247-278
[3] 王鑫, 苗春雨, 袁芳. Web應用性能評測的研究與應用[J]. 實驗技術與管理, 2008, 25(8), 15-19.
[4] 王成, 李少元, 鄭黎曉, 等. Web前端性能優(yōu)化方案與實踐[J]. 計算機應用與軟件, 2014, 31(12), 89-147
[5] 蘇昊. JavaEE網(wǎng)站性能優(yōu)化技術研究[D]. 北京: 北京郵件大學, 2014
[6] 宗蓮松, 潘華, 肖毅. 可擴展式教務信息系統(tǒng)的設計與實現(xiàn)[J]. 實驗技術與管理, 2010, 27(12), 128-132
[7] 李社河. Apache shiro集群實現(xiàn) [EB/OL]. (2015-04-23). http://blog.csdn.net/ lishehe/article/details/45218251.
[8] 劉柄成. 深入探討在集群環(huán)境中使用 EhCache 緩存系統(tǒng)[EB/OL]. (2010-04-01). http:// www.ibm.com/developerworks/cn/java/j-lo-ehcache/.
[9] 百度文庫. Quartz集群配置[EB/OL].(2012-04-03). http://wenku.baidu.com/.
[10] 老K. 數(shù)據(jù)庫性能優(yōu)化一:數(shù)據(jù)庫自身優(yōu)化(大數(shù)據(jù)量)[EB/OL].(2012-12-25). http://www. cnblogs.com/AK2012/archive/2012/12/25/2012-1228.html.
[11] 老K. 數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化[EB/OL]. (2012-12-28). http://www.cnblogs.com/ AK2012/archive/2012/12/28/2012-122802.html.
[12] 老K. SQL索引一步到位(此文章為“數(shù)據(jù)庫性能優(yōu)化二:數(shù)據(jù)庫表優(yōu)化”附屬文章之一)[EB/OL].(2013-01-04). http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html.
Practice of performance optimization for Tsinghua University instrument sharing platform
Liang Sishuai1, Wang Zhen1, Yang Shuguo2
(1. Center of Computer and Information Management, Tsinghua University, Beijing 100084, China;2. Office of Laboratories and Facilities, Tsinghua University, Beijing 100084, China)
Tsinghua University instrument sharing platfom uses F5 as load balancing hardware architecture and shiro + ehcache + quartz as load balancing software architecture, which realizes session synchronization, cache synchronization and timed task distributed scheduling, and uses all kinds of database, server and client optimization technology to promote the access speed. This scheme has proved that it is effective in practice.
management of instruments and equipment; load balancing; materialized view; SQL optimization
DOI:10.16791/j.cnki.sjg.2016.04.066
2015- 09- 06
梁思率(1984—),男,浙江杭州,碩士,工程師,研究方向:高校信息化.
E-mail:liangss@tsinghua.edu.cn
G482;TP311.1
B
1002-4956(2016)4- 0235- 04