不知不覺亡哄,一月份就已經(jīng)過去了赵抢。想想似乎這一個月,并沒有做什么事情腮出。
這一個月幻妓,讀了幾本書蹦误。
通讀了一遍《Programming Scala》。因?yàn)镾cala就是基于Java的,所以還算比較順利强胰。不過尚镰,就在我寫這篇總結(jié)的時候,回頭翻看這本書的目錄哪廓,發(fā)現(xiàn)好多內(nèi)容都沒有印象了。當(dāng)時也沒有做筆記初烘。幸運(yùn)的是涡真,畢竟只是一門編程語言,二月份開始肾筐,要用Scala寫Spark哆料,可以鞏固一下對Scala的理解。
通讀了一遍《Programming Hive》吗铐。但是發(fā)現(xiàn)書中主要介紹的就是跟SQL相關(guān)的部分东亦,只有自定義函數(shù)部分比較新鮮,于是就沒有仔細(xì)閱讀了唬渗,只是大體看了一下這部分典阵,留下了一個印象,日后用的時候镊逝,能夠知道參考哪部分資料壮啊。
閱讀了《Kafka: The Definitive Guide》。這個月撑蒜,由于家里有事情歹啼,回家了一個星期。這一個星期座菠,忙完了之后狸眼,沒有什么事情可以做,就開始了這本書的閱讀浴滴。這本書拓萌,主要是精讀了前半部分,后半部分關(guān)于性能調(diào)優(yōu)巡莹,部署等的內(nèi)容就沒有細(xì)看司志。
目前為止,看過三本The Definitive Guide系列的書降宅,《Hadoop: The Definitive Guide》骂远,《HBase: The Definitive Guide》以及這本《Kafka: The Definitive Guide》。這個系列的書確實(shí)挺不錯腰根,從一些基礎(chǔ)的內(nèi)容激才,比如客戶端的使用,到一些比較深入的內(nèi)容都有介紹。書中都會介紹這個項(xiàng)目的架構(gòu)瘸恼,如何進(jìn)行優(yōu)化等方面的內(nèi)容劣挫。
項(xiàng)目的架構(gòu),有論文的參考論文东帅,可以理解的更加透徹压固。而優(yōu)化方面的內(nèi)容,實(shí)際上并不是很詳細(xì)靠闭,只能說給一個大體的方向帐我,具體的優(yōu)化方法,還得根據(jù)實(shí)際的應(yīng)用場景進(jìn)行選擇愧膀。
除了技術(shù)方面的書籍拦键,還閱讀一些其他方面的書籍。
先是閱讀完了《史蒂夫喬布斯傳》檩淋,從書中可以了解到Apple公司的興衰芬为。書中的視角還算比較公正,對喬布斯的缺陷蟀悦,沒有偏袒媚朦。
后來打算培養(yǎng)一下自己的藝術(shù)氣息,就讀了一部分《藝術(shù)的故事》熬芜。后來發(fā)現(xiàn)莲镣,似乎對藝術(shù)的感覺并不是那么強(qiáng)烈。
于是就閱讀其他的書籍涎拉,開始閱讀《未來簡史》瑞侮,閱讀了三分之一左右,確實(shí)是蠻不錯的書籍鼓拧,能夠引發(fā)對人類的本質(zhì)的思考半火。
后來,在搜索書籍的時候季俩,偶然發(fā)現(xiàn)了一本叫做《編程大師訪談錄》的書籍钮糖,目前正在讀這本書。這本書以對話的方式酌住,記錄了一些大牛對編程的思索店归,以及其編程的習(xí)慣方式等。這本書的出版時間比較早酪我,所以書中很多大牛的預(yù)測消痛,在今天早已經(jīng)實(shí)現(xiàn)了。這本書目前也讀了三分之一都哭。從書中可以看到秩伞,所有大牛在當(dāng)時都預(yù)測個人計(jì)算機(jī)將會非常普及逞带。在當(dāng)時大型機(jī)當(dāng)?shù)溃霈F(xiàn)的少量小型機(jī)也只有程序員這一個用戶群體纱新,這樣一個時代展氓,他們就有如此先見。今天脸爱,我們驗(yàn)證了他們的預(yù)言遇汞。
在讀完這本書之后,再接著閱讀《未來簡史》簿废。不過我估計(jì)二月份能夠讀完這兩本書就不錯了勺疼,因?yàn)闀r間不太多。
除了閱讀了一些書籍捏鱼,還閱讀了一篇論文,《Bigtable: A distributed storage system for structured data》酪耕。由于之前已經(jīng)通過《HBase: The Definitive Guide》這本書有了一個大體的了解导梆,所以,閱讀起來還算是比較輕松迂烁。閱讀完論文就可以發(fā)現(xiàn)看尼,HBase是嚴(yán)格按照這個論文來實(shí)現(xiàn)的。
除此之外盟步,還閱讀了Hadoop中關(guān)于MapReduce以及YARN的源碼藏斩。對一個Job是如何Run,ResourceManager以及NodeManager是如何處理的却盘,有了一個比較清晰的認(rèn)識狰域。但是,由于閱讀的時間其實(shí)并不長黄橘,當(dāng)前只是注重于處理的流程兆览,對一些比較重要的內(nèi)容并沒有深入了解。比如:
- YARN中塞关,幾種Scheduler的實(shí)現(xiàn)
- YARN中抬探,幾種實(shí)現(xiàn)Container的方式
- MapReduce中,Reducer階段的幾種merger的實(shí)現(xiàn)
- YARN在啟動Container的時候帆赢,如何按照數(shù)據(jù)的存儲位置來決定Container的位置小压,從而減少數(shù)據(jù)的傳輸
- ApplicationMaster如何確定接下來要運(yùn)行MapTask還是ReduceTask
這一個月,我也一直在探索椰于,如何去獲取業(yè)界怠益,以及學(xué)術(shù)界最新的進(jìn)展。因?yàn)榱幔翱窗⒗锏募夹g(shù)直播時溉痢,在介紹阿里內(nèi)部實(shí)現(xiàn)的一個負(fù)載均衡器SLB(好像是這個名字)的時候僻造,主講人介紹說,由于是在TCP/IP協(xié)議棧的第四層進(jìn)行的負(fù)載均衡孩饼,以及用到了很多硬件方面的新進(jìn)展髓削,所以,基本上這個負(fù)載均衡器的性能就是硬件的性能镀娶。具體是那些進(jìn)展立膛,我現(xiàn)在也記不起來了。只記得當(dāng)時在看的時候梯码,就非潮Ρ茫苦惱,為什么我就沒有地方獲取這種最新的進(jìn)展呢轩娶?
仔細(xì)想想儿奶,猛然發(fā)現(xiàn),其實(shí)鳄抒,我學(xué)習(xí)的東西闯捎,看到的東西,都已經(jīng)是非常老许溅,非常穩(wěn)定的了瓤鼻。即使也會嘗試一些業(yè)界出現(xiàn)的新技術(shù),但是并不是這種底層的東西贤重。不是底層的新的東西茬祷。而底層的進(jìn)化,對于性能優(yōu)化并蝗,有很大的幫助祭犯。
于是,我就一直在思索滚停,也在探索盹憎,如何獲取業(yè)界和學(xué)術(shù)界的最新的進(jìn)展。
想到之前在哪看到過铐刘,某某算法陪每,或者某某技術(shù),它們的論文镰吵,是最先發(fā)表在IEEE檩禾,或者ACM上面的。于是疤祭,就想著盼产,或許可以從這里入手。也去IEEE或者ACM的Transactions或者Journal上勺馆,查看最新的論文集戏售,來獲取學(xué)術(shù)界最新的進(jìn)展侨核。
后來,咨詢老師灌灾,也獲取到了另外一種途徑搓译。就是查看對應(yīng)領(lǐng)域都有某些頂級會議,然后通過查看這些會議收錄的論文集锋喜,來獲取最新的進(jìn)展些己。
遺憾的是,雖然找到了獲取最新進(jìn)展的方法嘿般,但是段标,由于目前是處于工業(yè)界中,并沒有太多的時間炉奴,讓我來仔細(xì)閱讀這些論文逼庞。
而且,很多領(lǐng)域瞻赶,似乎并沒有頂級會議往堡。我搜索了大數(shù)據(jù)方面以及分布式系統(tǒng)方面的頂級會議,但是共耍,沒有搜索到。而關(guān)于數(shù)據(jù)挖掘吨瞎,人工智能的倒是很多痹兜。不過幸好IEEE中都有對應(yīng)的Transactions.
閱讀了上面的那些社科類,傳記類的書籍之后颤诀,我也意識到字旭,社交圈子對一個人的影響真的很大。
美國著名物理學(xué)家費(fèi)曼先生崖叫,在大學(xué)以及研究生的期間遗淳,其導(dǎo)師也是當(dāng)時世界著名的物理學(xué)家。
比爾蓋茨雖然是中途輟學(xué)心傀,但是屈暗,他就讀的是,哈佛大學(xué)脂男,他的父親是國會議員养叛,母親是IBM董事會成員。所以他有機(jī)會跟IBM合作宰翅,結(jié)識各種優(yōu)秀的人弃甥。
我羨慕甚至嫉妒那些在Standford,麻省理工大學(xué)等有著世界上著名CS專業(yè)汁讼,有著世界上最優(yōu)秀的科學(xué)家淆攻,有著世界上最優(yōu)秀的導(dǎo)師阔墩,在這些大學(xué)的學(xué)生。
這些學(xué)生瓶珊,也走在了相關(guān)領(lǐng)域的最前沿啸箫。
我羨慕他們,因?yàn)樗麄兛梢陨僮吆芏鄰澛芳瓒尽K麄兛梢垣@取到最新的知識筐高,最權(quán)威的知識。他們可以學(xué)習(xí)到世界頂級科學(xué)家的工作方式丑瞧,學(xué)習(xí)到很多我所學(xué)不到的東西柑土。而我,自認(rèn)為已經(jīng)非常努力了绊汹,每天有效率地工作和學(xué)習(xí)接近十三個小時稽屏,卻也只能在世界的CS學(xué)生中,處于中等位置西乖。
我自認(rèn)如果我也能獲取到這些資源狐榔,必然不會比他們差,甚至?xí)人麄兏谩?/p>
但是我沒有這些資源获雕。所以我經(jīng)常會提醒自己薄腻,你只是一個渣渣,你完全可以做的更好届案。
在閱讀Hadoop的源碼的時候庵楷,從網(wǎng)上看到的關(guān)于優(yōu)化Hadoop的方法,我就在想楣颠,為什么要這么優(yōu)化尽纽?他們怎么知道要這么優(yōu)化的?我從哪里也可以學(xué)習(xí)到這些關(guān)于優(yōu)化的方法童漩?
就在今晚弄贿,我突然有點(diǎn)想明白了。
性能調(diào)優(yōu)的目的矫膨,就是為了提高性能差凹。
那么我們怎樣提高性能?
- 讓程序使用更少的內(nèi)存
- 減少寫磁盤的次數(shù)侧馅,或者往磁盤寫的字節(jié)數(shù)直奋,因?yàn)榇疟P的速度跟內(nèi)存的速度差了兩個數(shù)量級
- 減少上下文切換的次數(shù),以及內(nèi)核態(tài)和用戶態(tài)之間轉(zhuǎn)換的次數(shù)
- 減少程序的步驟施禾。每一個步驟脚线,都是對性能的消耗。所以弥搞,能夠用更少的步驟做出來邮绿,就盡量用更少的步驟
- 優(yōu)化網(wǎng)絡(luò)傳輸渠旁,比如,調(diào)節(jié)緩沖區(qū)大小船逮,減少傳輸?shù)淖止?jié)數(shù)顾腊,選用合適的協(xié)議,UDP協(xié)議性能比TCP要好挖胃,因?yàn)樗淮嬖谌挝帐诌@些額外的開銷杂靶,但是它需要忍受一些包丟失的狀況
- 阻塞和非阻塞
我認(rèn)為,性能調(diào)優(yōu)可以從三個方面進(jìn)行:
- 針對業(yè)務(wù)進(jìn)行調(diào)優(yōu)
- 針對代碼進(jìn)行調(diào)優(yōu)
- 針對操作系統(tǒng)酱鸭,內(nèi)核等調(diào)優(yōu)
第一條吗垮,針對業(yè)務(wù)進(jìn)行調(diào)優(yōu)。之前在一個群里凹髓,討論開源軟件的問題烁登。有一位朋友就說,開源軟件蔚舀,性能都很差饵沧,跟大公司內(nèi)部實(shí)現(xiàn)的,性能方面根本沒有可比性赌躺。
我認(rèn)為這種說法其實(shí)是不正確的狼牺。我不知道他是如何得出性能方面沒有可以性這一個結(jié)論的。但是礼患,一款軟件是钥,不管是開源的還是大公司內(nèi)部的,假設(shè)我們只是拿過來使用讶泰,而不清楚它到底是為了什么而設(shè)計(jì)的,適應(yīng)于哪些應(yīng)用場景拂到。你應(yīng)該如何調(diào)節(jié)它讓它適應(yīng)你的場景的話痪署,那它的性能應(yīng)該都不會達(dá)到最好的狀態(tài)。在大數(shù)據(jù)的處理過程中兄旬,假設(shè)我們不考慮數(shù)據(jù)傾斜的情況狼犯,而只是瞎分區(qū),那么领铐,數(shù)據(jù)處理的效率必然不高悯森,木桶效應(yīng)嘛。在MapReduce中绪撵,Mapper會將結(jié)果進(jìn)行排序瓢姻,然后輸出。假設(shè)我們有20MB的輸出數(shù)據(jù)音诈,而緩沖區(qū)只有10M幻碱,那必然就會導(dǎo)致往磁盤讀寫數(shù)據(jù)绎狭,性能必然會有損失。
所以褥傍,在使用一款開源軟件的時候儡嘶,我們至少應(yīng)當(dāng)先根據(jù)我們的業(yè)務(wù)場景,對它做一些調(diào)整恍风。大公司內(nèi)部實(shí)現(xiàn)的工具蹦狂,未必就比這些好,只是他們充分考慮到了他們的需求朋贬,他們的業(yè)務(wù)場景凯楔,進(jìn)行了針對性設(shè)計(jì)。而開源軟件則是針對大眾需求的兄世。所以開源軟件的性能啼辣,可能看起來比不上大公司內(nèi)部的軟件。
第二條御滩,針對代碼進(jìn)行調(diào)優(yōu)鸥拧。就拿JVM舉例,我們都知道削解,一般情況下富弦,對象都是分配在堆內(nèi)存上。一個對象在分配時氛驮,可能會導(dǎo)致Minor GC, Major GC腕柜。而且,一個對象在創(chuàng)建時矫废,并不是簡單的在堆內(nèi)存上分配內(nèi)存就可以了盏缤,還要對對象進(jìn)行初始化。所以我們?nèi)绻梢灾赜靡粋€對象蓖扑,而不是每次都重新new一個對象唉铜,既可以避免可能產(chǎn)生的GC,又能不必重新初始化律杠,效率必然高一些潭流。所以,現(xiàn)在有很多重用的技術(shù)柜去,比如灰嫉,數(shù)據(jù)庫連接池,對象池嗓奢,線程池讼撒,還有JVM復(fù)用等。在MapReduce中,JVM復(fù)用對于性能優(yōu)化椿肩,有著不一樣的意義瞻颂。因?yàn)镴VM的創(chuàng)建相對來說還是比較重量級的,而每個Container啟動時都要創(chuàng)建一個JVM郑象。另外贡这,Hadoop中,也會根據(jù)數(shù)據(jù)所在的位置等信息厂榛,為Task分配Container盖矫,這樣就能減少很多不必要的數(shù)據(jù)傳輸。這些都是在代碼層面的優(yōu)化击奶。
代碼層面的優(yōu)化還有很多辈双,比如,在閱讀《Kafka: The Definitive Guide》時柜砾,作者提到了他們利用zero-copy來提高性能湃望。zero-copy減少了數(shù)據(jù)傳輸?shù)臅r候,用戶態(tài)和內(nèi)核態(tài)切換的次數(shù)痰驱,復(fù)制的次數(shù)更少证芭,因此,能夠提高性能担映。還有我們知道废士,NIO能夠減少線程的使用,既然線程的使用少了蝇完,需要進(jìn)行互斥官硝,同步的可能性就小了,我們使用鎖的幾率就小了短蜕。而且氢架,上下文切換的次數(shù)就少了。性能自然高一些朋魔。很多其他的小細(xì)節(jié)岖研,對于性能,都有一些或多或少的影響铺厨。
第三條缎玫,針對操作系統(tǒng)硬纤,內(nèi)核進(jìn)行調(diào)優(yōu)解滓。比如,調(diào)整操作系統(tǒng)交換區(qū)的大小筝家,盡量避免換頁操作等洼裤,調(diào)節(jié)緩沖區(qū)的大小等。
如果能從這三個方面進(jìn)行優(yōu)化溪王,我想腮鞍,在使用這款開源軟件的過程中值骇,應(yīng)該不會有什么性能問題。
就算開源軟件有的地方在設(shè)計(jì)的時候確實(shí)不符合我們的業(yè)務(wù)移国,我們也是可以修改的嘛吱瘩。
我們可以看到,這些優(yōu)化的地方迹缀,其實(shí)都是跟操作系統(tǒng)密切相關(guān)的使碾。我們必須理解操作系統(tǒng)的工作原理,如何讀寫數(shù)據(jù)祝懂,如何進(jìn)行運(yùn)算等票摇,在優(yōu)化的時候,才有理可依砚蓬。
第三條那里矢门,我寫的很少。因?yàn)槲乙膊磺宄彝埽槍Σ僮飨到y(tǒng)祟剔,針對內(nèi)核,針對硬件缕允,如何進(jìn)行優(yōu)化峡扩。實(shí)際上,目前障本,我之前最多只是在代碼層面進(jìn)行過優(yōu)化教届。對Linux操作系統(tǒng),內(nèi)核方面驾霜,硬件方面案训,不是很熟悉,自然也就沒有機(jī)會進(jìn)行優(yōu)化粪糙。
而且强霎,上面說的那些優(yōu)化的點(diǎn),在進(jìn)行Web開發(fā)的時候蓉冈,可能并沒有什么城舞。但是,如果我們要開發(fā)一款中間件寞酿,一款作為基石的產(chǎn)品家夺,就必須要考慮這些因素了。
根據(jù)各種性能測試工具伐弹,發(fā)現(xiàn)性能瓶頸拉馋,進(jìn)行針對性優(yōu)化。
一月份總結(jié)完了,那么二月份煌茴,除了正常的工作随闺,我要做什么呢?
- 深入閱讀MapReduce和YARN的源碼蔓腐,理解上面我提到的幾個方面
- 挖掘MapReduce和YARN可以進(jìn)行性能優(yōu)化的地方
- 修改Hadoop的源碼矩乐,目前想到的有:
- 在Reducer階段,可以根據(jù)Value進(jìn)行排序
- 讓Hadoop可以輸入不同Job的結(jié)果到相同的目錄回论,即如果Job的輸出目錄已經(jīng)存在的話绰精,也可以輸出,并不會報錯
- 總結(jié)MapReduce和YARN的源碼透葛,并寫成文章發(fā)表出來
- 對Hadoop進(jìn)行性能測試
- 閱讀《Linux Performance and Tuning Guidelines》笨使,加深對Linux的理解,增強(qiáng)對Linux進(jìn)行性能調(diào)優(yōu)的能力
- 閱讀完《編程大師訪談錄》