淘寶長(zhǎng)仁:JVM性能指標(biāo)的理論極限和衡量方法
原創(chuàng)其實(shí)很多人都知道淘寶目前有幾萬(wàn)臺(tái)Java應(yīng)用服務(wù)器,上千名Java工程師以及上百個(gè)Java應(yīng)用。為了應(yīng)付及保障整體性能的穩(wěn)定以及降低成本,在阿里巴巴核心系統(tǒng)研發(fā)部專(zhuān)用計(jì)算組的工作主要是專(zhuān)注于OpenJDK的優(yōu)化及定制,根據(jù)自己的業(yè)務(wù)、應(yīng)用特點(diǎn)及開(kāi)發(fā)者需要,提供穩(wěn)定,高效和深度定制的JVM版本:TaobaoJVM。目前已經(jīng)在淘寶、天貓上線(xiàn),全部替換了Oracle官方JVM版本,在性能,功能上都初步體現(xiàn)了它的價(jià)值。
在2013年阿里巴巴集團(tuán)主辦的ADC•阿里技術(shù)嘉年華這一場(chǎng)專(zhuān)屬于<互聯(lián)網(wǎng)工程師>的“技術(shù)盛宴”,倡導(dǎo)<干貨分享>的大會(huì)上,51CTO記者有幸采訪(fǎng)到了阿里巴巴核心系統(tǒng)部專(zhuān)用計(jì)算組負(fù)責(zé)人 王琤(長(zhǎng)仁)老師,基于Taobao JVM的各個(gè)基本性能指標(biāo)的理論極限和衡量方法介紹,以幫助大家認(rèn)識(shí)、評(píng)估自己的算法實(shí)現(xiàn)是否高效,進(jìn)一步指導(dǎo)優(yōu)化工作,以及介紹了淘寶的下一個(gè)項(xiàng)目:反圖像的搜索引擎技術(shù)iflake。
王琤(花名長(zhǎng)仁),阿里巴巴核心系統(tǒng)部專(zhuān)用計(jì)算組負(fù)責(zé)人。在阿里巴巴致力于專(zhuān)用計(jì)算的推廣及實(shí)踐,以追求最佳性能及性耗比為目的為特定應(yīng)用針對(duì)特定硬件架構(gòu)進(jìn)行算法及實(shí)現(xiàn)優(yōu)化。在圖像搜索、機(jī)器學(xué)習(xí)等領(lǐng)域,針對(duì)特定 CPU 微架構(gòu), GPGPU等不同體系結(jié)構(gòu)進(jìn)行關(guān)鍵算法及實(shí)現(xiàn)進(jìn)行優(yōu)化并獲得了指數(shù)級(jí)的性能提升。同時(shí)負(fù)責(zé)淘寶JVM的開(kāi)發(fā)工作,基于OpenJDK VM 為淘寶定制、優(yōu)化更加貼近應(yīng)用需求的專(zhuān)用JVM。
以下是采訪(fǎng)實(shí)錄:
記者:對(duì)于Taobao JVM我們都知道目前淘寶產(chǎn)品全部都替換了原來(lái)的Oracle官方版本,那么Taobao JVM在這方面的性能提升比較大還是基于自己的產(chǎn)品比較放心?
長(zhǎng)仁:我們之前在線(xiàn)上推廣taobao JVM,其實(shí)性能方面是次要的。因?yàn)樾阅鼙萇racle官方的版本肯定是要提升,但提升不是特別大,除非它應(yīng)用會(huì)利用到taobao JVM的某一個(gè)性能特性,它可能獲得十倍的提升,這是有可能的。但是在通常情況下,線(xiàn)上的應(yīng)用是各種各樣的。當(dāng)各種各樣的應(yīng)用在淘寶時(shí),如果看到GC,那么我們可能有提升20%到30%左右,但是從性能角度來(lái)說(shuō),整體性能跟官方的產(chǎn)品領(lǐng)先幅度不是非常的大。
我們?yōu)槭裁匆瞿??其?shí)主要是從運(yùn)維上考慮。我們成立了一個(gè)版本,并且這個(gè)版本是淘寶自己來(lái)維護(hù)的,這樣在將來(lái)我們一旦出現(xiàn)問(wèn)題后,因?yàn)檫@是我們自己版本,所以我們直接就可以找到相應(yīng)版本的代碼來(lái)檢查,到底問(wèn)題出在哪兒?這樣我們解決問(wèn)題會(huì)很快,同時(shí)我們的支持力度會(huì)很好。同一個(gè)版本,在升級(jí)這些方面運(yùn)維成本會(huì)很低。同時(shí)我們有一個(gè)很好的支持,就是我們可以更好地幫助運(yùn)維同時(shí)來(lái)解決系統(tǒng)出現(xiàn)的問(wèn)題。這是最大的考慮。
記者:主要還是說(shuō)自己的產(chǎn)品比較放心,運(yùn)維這塊成本比較低。
長(zhǎng)仁:是的。這個(gè)東西是我們做的,出了問(wèn)題,有一個(gè)專(zhuān)門(mén)旺旺群,會(huì)在那里面報(bào)一下他們的號(hào),我們就幫他們?nèi)ブг?,就是這樣,很方便。
記者:你目前在做一下淘寶性能優(yōu)化,性能方面有沒(méi)有遇到哪些瓶頸?比較困難的。
長(zhǎng)仁:性能方面最大的問(wèn)題就是需求,對(duì)于我們來(lái)說(shuō),如果有需求,你把性能提上去,這不是一個(gè)大問(wèn)題,因?yàn)檫@是技術(shù)問(wèn)題。最大的問(wèn)題是什么?我們不了解應(yīng)用的話(huà),我們不能直接的一個(gè)渠道應(yīng)用就告訴我們哪兒有問(wèn)題,第一,比如說(shuō)我的系統(tǒng),假如說(shuō)現(xiàn)在不知道究竟這個(gè)是高是低?有可能說(shuō)120,最高的極限。有可能500是極限,但是誰(shuí)也不知道。一般的程序員覺(jué)得自己的程序沒(méi)有問(wèn)題的,很多程序員都會(huì)這么認(rèn)為,性能也沒(méi)有問(wèn)題,符合我們的設(shè)計(jì),其實(shí)這樣就夠了。所以我們可能沒(méi)有很多的機(jī)會(huì)去真正接觸到一線(xiàn)的應(yīng)用,來(lái)看它們里面還有什么提升?對(duì)于這些來(lái)說(shuō),其實(shí)應(yīng)用方面和開(kāi)發(fā)者來(lái)說(shuō),覺(jué)得現(xiàn)在性能夠用了。我們真正面對(duì)的問(wèn)題都是出現(xiàn)了性能不夠用的時(shí)候,上線(xiàn)不了,性能沒(méi)達(dá)標(biāo)。這個(gè)時(shí)候就會(huì)接觸,這種機(jī)會(huì)不多的。
對(duì)于我們來(lái)說(shuō),我們能夠把性能做到極致,必須有一個(gè)前提,就是說(shuō)我們要針對(duì)確定的應(yīng)用來(lái)做,究竟是哪兒有問(wèn)題你來(lái)做。假如說(shuō)讓我們做一個(gè)產(chǎn)品,放在任何的應(yīng)用上都可以跑的很快,那就是Oracle的產(chǎn)品,那已經(jīng)做了。所有Oracle的人做的工作都是給你一個(gè)平臺(tái),跑什么都OK,不是最快,但是已經(jīng)應(yīng)該滿(mǎn)足它的需求了。
我們做通用性能提升,這個(gè)是我們做不了的,因?yàn)槭裁???duì)于通用性能提升,我們能改,大家想到的能改的東西,其實(shí)Oracle的人已經(jīng)做了。我們做的點(diǎn),其實(shí)你看我們做通用性能提升,我們現(xiàn)在的patch。唯一的就是編譯級(jí)的優(yōu)化,能夠把這些性能提升。第二點(diǎn),比如說(shuō)我們?cè)僮鲆恍┪⒄{(diào),也能把性能稍微再提升。但是也就這些,再說(shuō)給一個(gè)通用的東西做到,用之四海而皆準(zhǔn),這些東西是非常難。因?yàn)橛心菢拥臇|西,Oracle的人肯定也想到,也做了。我們的特點(diǎn)是確定應(yīng)用,你有特定的需求,我針對(duì)你的特點(diǎn)做優(yōu)化,這是我們擅長(zhǎng)的,在專(zhuān)的情況下我們才有機(jī)會(huì)。
記者:我們都知道TaobaoJVM是基于OpenJDK HotSpot VM深度定制的,您認(rèn)為T(mén)aobao JVM的天花板是否還是取決于OpenJDK HotSpot VM?
長(zhǎng)仁:從通用的角度來(lái)說(shuō),我們會(huì)給它做的好一點(diǎn),但是不會(huì)好的非常多,從專(zhuān)用的角度來(lái)說(shuō),我們肯定能夠突破它,舉個(gè)例子像Hadoop的優(yōu)化,在做taobao JVM我們用一種新的指令,把它能提高將近十倍的性能。這些在Oracle的JVM是不提供這個(gè)支持的。對(duì)于我們來(lái)說(shuō),我們就完全把這個(gè)做出來(lái),做出來(lái)以后線(xiàn)上就用,這個(gè)就是確定領(lǐng)域的話(huà),能給它確定需求、確定應(yīng)用,我們可以針對(duì)它的特點(diǎn),做出很不一樣的東西。
記者:之前咱們聊的時(shí)候,我記得您說(shuō)做一個(gè)關(guān)于JVM優(yōu)化的一些工具。
長(zhǎng)仁:我們現(xiàn)在確實(shí)是在做一個(gè),做一個(gè)是有關(guān)JVM的診斷優(yōu)化系統(tǒng)。最主要的目的是什么?就是說(shuō)我們其實(shí)剛才講了,我們有一個(gè)旺旺群,在這個(gè)群上我們會(huì)回答運(yùn)維同行、開(kāi)發(fā)同行的各種問(wèn)題。其中很多的問(wèn)題就是,我們線(xiàn)上的應(yīng)用很大,不是現(xiàn)在的所有都用淘寶這邊的業(yè)務(wù),還有Oracle版本出現(xiàn)。JVM Crash,或者說(shuō)GC有點(diǎn)異常,這個(gè)時(shí)間很長(zhǎng),他們可以問(wèn)問(wèn)題,這個(gè)問(wèn)題我們上層有一套數(shù)據(jù)流程,我們上層去做一些診斷,看一些Crash log,GC log,然后來(lái)排查問(wèn)題,究竟哪兒出了問(wèn)題,這么一個(gè)過(guò)程。
很多運(yùn)維、開(kāi)發(fā)同行說(shuō),貌似這個(gè)東西,我們自己解決不了,只能靠你們。希望我們的支持能夠固化下來(lái),提供一個(gè)東西,能把一些基礎(chǔ)的問(wèn)題、簡(jiǎn)單問(wèn)題,幫助我們排查出來(lái),我們其實(shí)也覺(jué)得很累。我們?nèi)ツ暌荒晏幚淼木€(xiàn)上的Crash問(wèn)題是52起,平均一周一起,平均處理一次的時(shí)間大概一到三天。所以你看光是一個(gè)快速問(wèn)題,我們自己也非常想有一個(gè)工具。出了問(wèn)題,你先用這個(gè)系統(tǒng)查一下,它會(huì)告訴你,我們經(jīng)常碰到一些簡(jiǎn)單問(wèn)題,就告訴你基本的原因,假如說(shuō)有一些詭異的我們?cè)賾?yīng)用系統(tǒng),這個(gè)系統(tǒng)其實(shí)就叫JVM診斷系統(tǒng)。大名JVM故障排查系統(tǒng),小名還沒(méi)起好,這個(gè)東西已經(jīng)快做好了。
記者:怎樣工作,它的主要功能?
長(zhǎng)仁:就是說(shuō)到時(shí)候線(xiàn)下那臺(tái)機(jī)器出問(wèn)題了,GC問(wèn)題,還是說(shuō)JVM Crash,你只要在我的系統(tǒng)里告訴我這個(gè)機(jī)器IP是什么?你點(diǎn)一個(gè)鈕,你上去就把Crash log,GC log還是我們其他的一些日志抓下來(lái)。抓下來(lái)以后,我們有一個(gè)分析系統(tǒng),大致地就告訴你,一個(gè)簡(jiǎn)單問(wèn)題就能告訴你,你這個(gè)Crash是因?yàn)槭裁磫?wèn)題?GC頻度有多少?有什么問(wèn)題?潛在有什么問(wèn)題?應(yīng)該朝哪個(gè)方向去想?等等就告訴你這些簡(jiǎn)單的,這樣運(yùn)維同學(xué)就很愿意使,我自己有些簡(jiǎn)單問(wèn)題,我也能解決,我依靠那個(gè)系統(tǒng)去。所以我們來(lái)說(shuō),我們相當(dāng)于用這個(gè)系統(tǒng)過(guò)濾了一些簡(jiǎn)單問(wèn)題,剩下復(fù)雜的我們?cè)俳鉀Q。就是這個(gè)東西,這個(gè)東西馬上就要開(kāi)放了。我們現(xiàn)在淘寶的內(nèi)部先使,以后很有可能要開(kāi)放出去,我們自己使好了,肯定要開(kāi)放出去。
#p#
記者:恩,那么能否介紹一下你們目前在做的反圖像的搜索引擎iflake,這是一個(gè)什么樣的東西?主要應(yīng)用在哪一塊?
長(zhǎng)仁:最好回答這個(gè)的話(huà)是我們圖像組的回答是最合適的,我們的了解對(duì)于它,以及這個(gè)應(yīng)用,我們了解都是很片面的。片面的我介紹一下,阿里集團(tuán)有一個(gè)世界一流的圖像搜索。
這個(gè)跟其他的圖片搜索是不一樣的,比如你現(xiàn)在使用哪張圖,那些東西很多人使用。它是基于神經(jīng)網(wǎng)絡(luò),我對(duì)這些方面不了解,但是圖像組的雷音跟我說(shuō),目前基于神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確率只能達(dá)到大約百分之三四十,雷音他們用的實(shí)際上是更傳統(tǒng)的方法。它的準(zhǔn)確率能夠到百分之八九十。
我們淘寶有一個(gè)重要業(yè)務(wù),比如盜圖,你拍了一張照片放到淘寶上,別的商家就盜你的圖,他就不用拍了。我們就要找到這個(gè)圖片跟這個(gè)是不是一個(gè)圖,它在這里面做剪裁,或者是說(shuō)里面打上幾個(gè)字,我也要能區(qū)別出這幾個(gè)是不是一個(gè)圖片。圖像搜索,一個(gè)應(yīng)用方面就是應(yīng)用在這兒。用在這兒以后,它可以打相似的圖片搜索,具體的實(shí)現(xiàn)方式是算法問(wèn)題。我們IC的是什么?其實(shí)就是整個(gè)系統(tǒng)一部分,這一部分要做什么?其實(shí)就是要把圖像最終提取完特征點(diǎn)以后,它實(shí)際上跟傳統(tǒng)搜索基本上一樣,都是有DAO。包括影像。每個(gè)DAO上的ID,ID之間根據(jù)你的要求進(jìn)行ID的合并。
我們主要做的話(huà)就是這個(gè)優(yōu)化,為什么要做這個(gè)?是因?yàn)樵瓉?lái)淘寶的這個(gè)圖的規(guī)模,圖片的規(guī)模,分到不同機(jī)器上,每一臺(tái)機(jī)器是千萬(wàn)張信息,一千萬(wàn)張圖片。在這個(gè)規(guī)模下,原來(lái)的計(jì)算實(shí)現(xiàn)的算法可以做什么?基本上會(huì)做到一臺(tái)機(jī)器QPS十幾,就是說(shuō)我們每秒鐘能處理十幾次的這種請(qǐng)求來(lái)進(jìn)行合并,這個(gè)結(jié)果就出來(lái)了。當(dāng)我們的規(guī)模擴(kuò)到億量級(jí),從千萬(wàn)到一億擴(kuò)大十倍以后,一臺(tái)機(jī)器的話(huà),基本上一秒才能處理一次請(qǐng)求。這個(gè)完完全全的不能符合上線(xiàn)的預(yù)期,這個(gè)性能太差了。那怎么辦?增加十倍的機(jī)器可以解決問(wèn)題,但是這個(gè)開(kāi)銷(xiāo)很大。
我們組就介入了,我們來(lái)看一看這個(gè)東西怎么來(lái)優(yōu)化,優(yōu)化的結(jié)果就是,同樣的機(jī)器的話(huà),我們把性能提升10倍,但原來(lái)的千萬(wàn)量級(jí),我的QBS能上百,到億量級(jí)的話(huà),我也能保證跟原來(lái)是一樣的。相當(dāng)于你不用加十倍的機(jī)器了,現(xiàn)在你數(shù)據(jù)量提高十倍以后,我整個(gè)的性能跟原來(lái)差不多,還是滿(mǎn)足你需求的,我們做的是這個(gè)。
記者:我想了解除了商家積極地應(yīng)用這個(gè)技術(shù)以外,像用戶(hù),我看到的這個(gè)東西,我不知道它是什么,通過(guò)這個(gè)圖片去搜索出來(lái)。
長(zhǎng)仁:對(duì),以圖找圖也是它的應(yīng)用的典型之一,你看到這個(gè)東西,我想把它買(mǎi)下來(lái),我拿手機(jī)一拍,淘寶上這一類(lèi)的,這個(gè)東西在淘寶上列出來(lái),這也是應(yīng)用之一。應(yīng)用很多,圖像搜索在淘寶的應(yīng)用,以后會(huì)越來(lái)越多。
記者:畢竟在淘寶上圖片占用的比例是比較大的,還有一個(gè)就是,一般來(lái)講,通過(guò)什么樣的設(shè)施和手段知道他們的極限性能在哪里?
長(zhǎng)仁:方法很多。對(duì)于我們來(lái)說(shuō),接觸到一個(gè)系統(tǒng),首先做一個(gè)整體的profiling,先看最后,你們會(huì)看到,算的最慢的那部分在哪兒?那一部分占整體計(jì)算時(shí)間的80%,舉個(gè)例子,那我們?nèi)?yōu)化它,優(yōu)化好了這個(gè)收益就會(huì)很好。比如說(shuō)我有80%,CPU都耗在80%那一塊,我把它提升了20%,那相當(dāng)于議程是16的差異。如果優(yōu)化了20%,我假如說(shuō)能快一倍,占的比例由于很小,所以整體提升很大。所以我們第一步就是,起碼最弱的部分找到,找到以后,然后看究竟是由于什么原因造成它跑的慢,是算法的問(wèn)題、實(shí)現(xiàn)的問(wèn)題,還是說(shuō)各種各樣的問(wèn)題,我們會(huì)把這一部分進(jìn)行優(yōu)化。優(yōu)化完了以后就會(huì)上線(xiàn)測(cè)試。
記者:這個(gè)還是通過(guò)你剛才說(shuō),很多方法。你們?cè)谧鎏詫歑86平臺(tái)優(yōu)化的時(shí)候,你們碰到過(guò),剛剛說(shuō)過(guò)的天花板,就是一個(gè)極限。這個(gè)極限,能不能突破這個(gè)極限?
長(zhǎng)仁:可以突破的,第一我們換正適合的硬件。天花板就可以,它天然的不同的硬件上,它的天花板是不同高度的,有的話(huà)它自然就高了,這是有可能來(lái)獲得突破的。第二個(gè)點(diǎn),假如硬件固定了,天花板在那兒,有可能天花板那兒是因?yàn)槟銓?shí)現(xiàn)的原因,你非要這么算,天花板這么高。你換一種算法,實(shí)現(xiàn)方式改變了之后,沒(méi)準(zhǔn)天花板就變得更高了。這樣的話(huà),你就更有可能突破。舉個(gè)例子比如從計(jì)算量,假如說(shuō)A的算法的實(shí)踐,我們計(jì)算量需要什么?假如說(shuō)需要一百萬(wàn)次。換一個(gè)算法實(shí)現(xiàn)的話(huà),發(fā)現(xiàn)A計(jì)算量只需要五十萬(wàn)次。這樣的話(huà),相當(dāng)于無(wú)形中就高了,那我就能往上更走一步。
記者:對(duì)于天花板來(lái)說(shuō),一般是做到滿(mǎn)足自己的應(yīng)用需求,不會(huì)去說(shuō)盲目把性能提高,你們隊(duì)這個(gè)性能的點(diǎn)是如何理解的。
長(zhǎng)仁:這是非常重要的一個(gè)問(wèn)題,優(yōu)化到什么程度結(jié)束?滿(mǎn)足剛才講的曲線(xiàn),工作曲線(xiàn)有一部分是花的時(shí)間比較少,但是性能提升會(huì)很明顯。那一部分其實(shí)就是我們所謂的工作的甜點(diǎn)區(qū),這一部分花的時(shí)間不用很多就能提到很高,如果這個(gè)時(shí)候用戶(hù)已經(jīng)滿(mǎn)足了需求,OK,就到此為止了。為什么?因?yàn)榧热粦?yīng)用已經(jīng)滿(mǎn)足需求了,我們花的時(shí)間再把它進(jìn)一步提升的話(huà),對(duì)于應(yīng)用方來(lái)說(shuō),他覺(jué)得這個(gè)部分沒(méi)有太大的改善。而且越往上的話(huà)會(huì)越難做,這是肯定的。所以這樣的話(huà),如果達(dá)到應(yīng)用需求,我們可能去做其他的項(xiàng)目,接著做另外的東西。這一部分只要用戶(hù)滿(mǎn)足需求了,我們就可以適可而止,這樣也節(jié)約我們的時(shí)間。我們不是為了一定要尋求一個(gè)極致來(lái)去做,因?yàn)閷で笠粋€(gè)極致,有的應(yīng)用要求水平很高,要求達(dá)到一個(gè)什么,那時(shí)候必須要到極致才可能達(dá)到。但是很多應(yīng)用,我們現(xiàn)有的機(jī)器,規(guī)模一變的話(huà),你也能滿(mǎn)足我了,他們就滿(mǎn)意了。滿(mǎn)意以后,這個(gè)就適可而止。
記者:如果說(shuō)這部分的性能天花板特別高的,但是說(shuō)你們只要優(yōu)化一點(diǎn)點(diǎn),優(yōu)化一些,就能提升數(shù)十倍。就是說(shuō)你們還可以通過(guò)這些小小的優(yōu)化,還可以把性能再一次提高。但是不需要浪費(fèi)太多的時(shí)間,這種優(yōu)化你們會(huì)不會(huì)考慮去做?
長(zhǎng)仁:有時(shí)候會(huì)考慮,我舉個(gè)例子iflack,剛才講了能提高十倍。實(shí)際上它再提升50%,十倍假如是1的話(huà),再提高到1.5其實(shí)也是可能的。這個(gè)花的時(shí)間我也估計(jì)過(guò),其實(shí)我們這邊做的工作很少,不多。但是整體的為了這50%,原始做的那些東西要進(jìn)行重新索引。這樣的話(huà)對(duì)于工程方面、運(yùn)維方面會(huì)有一個(gè)成本,這個(gè)成本是我們估計(jì)不了的。但是這個(gè)成本我們知道,比我們的成本高很多。為了這50%有沒(méi)有必要?我們也不知道,所以我們要征求應(yīng)用方的意見(jiàn)。其實(shí)iflack做十倍,其實(shí)根本就不是極限,還能再做。我們也知道該怎么做能再提升50%,但是由于各種各樣的因素,因?yàn)椴皇蔷臀覀冏约?,我們是一個(gè)整體。有應(yīng)用方、運(yùn)維方,都要考慮到他們相應(yīng)的成本付出了多少,必須把這個(gè)考慮進(jìn)去。權(quán)衡之下來(lái)決定,我們做不做?什么時(shí)候做?這不是我們決定的。