您當(dāng)前的位置是:  首頁 > 資訊 > 國內(nèi) >
 首頁 > 資訊 > 國內(nèi) >

環(huán)信CTO:“過早的性能優(yōu)化是魔鬼”

2021-04-20 10:08:13   作者:   來源:CTI論壇   評論:0  點(diǎn)擊:


  以此文致敬“ Zen and the Art of Motorcycle Maintenance — An Inquiry into Values ”(中文名:禪與摩托車維修藝術(shù),另譯名:萬里任禪游)一書。“擦車”一詞,純屬戲謔,只因”cache”一詞的漢語拼音和“擦車”一毛一樣,又意附了原作“摩托車”的主題,實(shí)則和擦車沒有任何關(guān)系,權(quán)當(dāng)是標(biāo)題黨的又一次苦心積慮吧。禪與摩托車維修藝術(shù) – 經(jīng)典閃回
  這本書寫于上個(gè)世紀(jì) 70 年代,經(jīng)歷 126 次被各大出版社拒絕后,由一個(gè)不抱任何盈利念頭的編輯最終付梓出版,成為那個(gè)時(shí)代最為暢銷的書籍:
  • 累計(jì)銷量已經(jīng)超過 1000 萬冊,相信這一數(shù)據(jù)會持續(xù)攀升
  • 《吉尼斯世界紀(jì)錄》稱它是”世界上被拒稿次數(shù)最多的暢銷書”
  • 《時(shí)代》周刊評選 20 世紀(jì)十本最有影響力的書之一
  • 而最好的名人推介可能就算下面這個(gè)了(印在封面上以吸引讀者的目光):
  我因?yàn)閷懥艘徊咳藗儼阉?《禪與摩托車維修藝術(shù)》相比較的書而感到甚受恭維。我希望拙作(《時(shí)間簡史》)和本書一樣使人們覺得,他們不必自處于偉大的智慧及哲學(xué)的問題之外。
  —-著名物理學(xué)家 史蒂芬·霍金
  這是一部“哲學(xué)小說”,書中內(nèi)容由交替穿插的兩種文體組成,一度讓讀者莫名其妙不知身在何處:一半是游記,記錄了自己和兒子歷經(jīng) 17 天的摩托車之旅,橫穿美國大陸從明尼蘇達(dá)州直到加州海岸的行程;另一半則是哲學(xué)討論,作者從旁觀者的角度介紹曾經(jīng)的自己(Phaedrus,斐德洛,精神分裂患者)不斷苦苦思索,最終參透“良質(zhì)”(不是良知,英文為“quality/good”)才是一切的源頭和本質(zhì)。
  這絕對不是一本易讀的書,書中的某些段落甚至是一句話,都需要我們反復(fù)體會其中深意。全書共分為四個(gè)部分,由淺入深,從表象到形而上學(xué)層層推進(jìn),帶領(lǐng)讀者漸次攀登到思想山峰的最高處。書中的后半部分逐漸趨向于形而上學(xué)的討論,要真正的理解還需要做更多的功課;而前半部分僅涉及表象和實(shí)用主義層面的討論,對于從事技術(shù)工作的人們卻有著直接的啟發(fā)。本文的下半部分就以此為參照,談?wù)勎覀儜?yīng)該如何在技術(shù)挑戰(zhàn)的過程中更加“投入”,達(dá)到“心流”的狀態(tài)。
  對 Cache 的執(zhí)念
  《禪與摩托車維修藝術(shù)》通過作者自己親身的經(jīng)歷,給我們展示了一組“粗魯”、“輕率”、邊聽音樂邊工作的不合格的摩托車維修技師的形象,他們帶給了作者一場真正的噩夢。也是因?yàn)檫@不好的維修體驗(yàn),讓作者痛定思痛,再不將自己心愛的摩托交給別人維修,而是通過不斷鉆研摩托車的表象構(gòu)造和運(yùn)行機(jī)理,從摩托車維修手冊到各種零配件一應(yīng)俱全的配齊,在何種惡劣的條件下和突發(fā)情況下都能游刃有余的處理事件,都不會“卡住”。
  作為一個(gè)軟件工程師,你究竟多“關(guān)心”你自己的代碼,又投入了多少的“熱情”在你日常的設(shè)計(jì)和編碼工作中呢?當(dāng)你認(rèn)同“一個(gè)人應(yīng)該關(guān)心并全情投入自己熱愛的工作”時(shí),又該如何持續(xù)的保持這份熱情呢?相信每一個(gè)和我類似的“碼農(nóng)”讀完這本書后,都會情不自禁的問自己這樣的問題。即使暫時(shí)還搞不懂“良質(zhì)就是佛陀”這形而上學(xué)的終極思辨。
  作為一個(gè)軟件工程師,你究竟多“關(guān)心”你自己的代碼,又投入了多少的“熱情”在你日常的設(shè)計(jì)和編碼工作中呢?當(dāng)你認(rèn)同“一個(gè)人應(yīng)該關(guān)心并全情投入自己熱愛的工作”時(shí),又該如何持續(xù)的保持這份熱情呢?相信每一個(gè)和我類似的“碼農(nóng)”讀完這本書后,都會情不自禁的問自己這樣的問題。即使暫時(shí)還搞不懂“良質(zhì)就是佛陀”這形而上學(xué)的終極思辨。
  如果一個(gè)人在工作的時(shí)候,能夠看到良質(zhì),而且感覺到它的存在,那么他就是一個(gè)關(guān)心工作的人。如果一個(gè)人關(guān)心自己所看到的和手中所做的,那么他一定有某些良質(zhì)的特性。
  P311
  前些日子做了一些系統(tǒng)本地緩存的優(yōu)化工作,比起一些新的產(chǎn)品線拓展來說,并不見得有多少創(chuàng)造性,甚至有人會覺得不就是在既有系統(tǒng)上做的一些小小改動,無足輕重。但恰恰從其中讓我體會到:如果你“關(guān)心”自己的工作,其實(shí)無時(shí)無刻都會被“良質(zhì)”驅(qū)使,不斷去專注的思考和踐行,也能達(dá)到知微見著的哲學(xué)體驗(yàn)。
  重新讓思考進(jìn)入到計(jì)算機(jī)的維度
  緩存是互聯(lián)網(wǎng)應(yīng)用中最常見的組件,幾乎每一個(gè)從業(yè)人員都耳熟能詳。當(dāng)大家談?wù)撈鹁彺鏁r(shí),也大都會提到 Redis,它已經(jīng)成為緩存領(lǐng)域的通用組件,你幾乎可以在絕大多數(shù)的互聯(lián)網(wǎng)產(chǎn)品架構(gòu)設(shè)計(jì)中看到它的身影。于是,Cache=Redis 的烙印深深植入了每一個(gè)程序員的心里,大家也理所當(dāng)然的認(rèn)為Redis是解決緩存問題的終極方案,放一個(gè) Redis 在系統(tǒng)架構(gòu)中甚至成了一個(gè)下意識的動作。
  當(dāng)經(jīng)歷過幾年的迭代,我們的系統(tǒng)架構(gòu)中Redis也成為了最重要的信息存儲組件,它的價(jià)值和系統(tǒng)的成本自然也成比例的與日俱增?墒牵(dāng)我們把目光轉(zhuǎn)向性能提升的時(shí)候,才發(fā)現(xiàn)Redis竟然成了性能的瓶頸,不得不要繼續(xù)深入到緩存的密林深處,繼續(xù)挖掘我們可以利用的機(jī)器資源來實(shí)現(xiàn)更高效的數(shù)據(jù)分布、更快的數(shù)據(jù)訪問,進(jìn)而提升系統(tǒng)的吞吐量和并發(fā)數(shù)。在這個(gè)過程中,你的思考方式需要逐漸從人的直覺體驗(yàn)轉(zhuǎn)化為計(jì)算機(jī)的直覺體驗(yàn),那股“心流”會讓你與機(jī)器混為一體,你突然發(fā)現(xiàn)自己的思考時(shí)空尺度進(jìn)入了一個(gè)更微小和高頻的世界。
  先來看下這個(gè) Latency Numbers Every Programmer Should Know,你能夠猜到一個(gè) Redis 的跨網(wǎng)絡(luò)查詢調(diào)用和本地緩存的延遲差距嗎?目前常見云服務(wù)商同一個(gè)機(jī)房中兩個(gè)虛擬機(jī)之間的延遲為 1ms 左右,假設(shè) Redis 內(nèi)存訪問和本地緩存的內(nèi)存訪問時(shí)間一致,均在 100ns 數(shù)量級,因此兩者間的差距主要在于網(wǎng)絡(luò)延遲,也就是 1ms(這個(gè)是理論簡化數(shù)字,實(shí)際上我們觀測到的 Redis緩存訪問時(shí)延在5ms左右),因此兩者之間的數(shù)量級差異=1ms/100ns=1*1000*1000ns/100ns=10000。如果你以人自身的絕對體驗(yàn)尺度來衡量這1ms,也許它短的不值一提,畢竟人的一次眨眼都要花掉100ms+的時(shí)間。
  但當(dāng)我們將兩者的相對差異放大到人的體驗(yàn)時(shí)間尺度后,就不顯得那么不值一提了:
  4分鐘:11 天!這意味著如果你把機(jī)器的每次執(zhí)行邏輯當(dāng)成人的一秒,那通過本地緩存訪問只需要4分鐘完成的事情,通過 Redis 緩存訪問需要 10 個(gè)工作日!要注意的是,這只是一次緩存訪問帶來的時(shí)間差異,如果你的緩存訪問代碼不斷的被調(diào)用,那產(chǎn)生的時(shí)間差異真的會變成天壤之別(以人的時(shí)空尺度體驗(yàn)為參考):假設(shè)連續(xù)調(diào)用 1000 次,那相當(dāng)于 2 個(gè)月:30 年的差異。
  緩存技術(shù)的本質(zhì)
  除了時(shí)間尺度上的比較,緩存技術(shù)真正的挑戰(zhàn)在于如何在時(shí)間、空間、成本之間進(jìn)行仔細(xì)的規(guī)劃,達(dá)成全局最優(yōu)化的目標(biāo)。“事難兩全”:在計(jì)算機(jī)架構(gòu)中,越是高速的數(shù)據(jù)存儲介質(zhì)(如 CPU L1、L2 Cache),單位成本越是高;而計(jì)算設(shè)備一定要在總經(jīng)濟(jì)成本的約束下來進(jìn)行設(shè)計(jì),因此整個(gè)計(jì)算機(jī)硬件配置中高速存儲都是稀缺的,而海量數(shù)據(jù)的存儲介質(zhì)一定是訪問速度最慢的。
  如果把緩存的合理使用當(dāng)成一個(gè)動態(tài)規(guī)劃的問題,系統(tǒng)應(yīng)該存在一定限制約束條件和特定計(jì)算問題前提下的最優(yōu)解。如何讓緩存系統(tǒng)動態(tài)的適應(yīng)不同計(jì)算問題,使得數(shù)據(jù)能夠在不同層級緩存中(L1,L2,Memory,Network,Disk,etc.)根據(jù)優(yōu)化目標(biāo)的要求進(jìn)行自由的流動、重新部署是緩存架構(gòu)的終極挑戰(zhàn)。
  特別的,數(shù)據(jù)在不同緩存介質(zhì)中的這種流動,是應(yīng)該基于數(shù)據(jù)本身的大小、被使用的頻度、利用價(jià)值的存在周期等參數(shù)/反饋來進(jìn)行動態(tài)計(jì)算的。理想中的(動態(tài))緩存管理系統(tǒng)應(yīng)該能夠自適應(yīng),根據(jù)起始輸入?yún)?shù)/數(shù)據(jù)集不斷進(jìn)行反饋調(diào)整,最終達(dá)到動態(tài)的最優(yōu)分布。
  近年來開始有更多的關(guān)于Dynamic Cache Management1,2的討論,后續(xù)我們也將持續(xù)關(guān)注相關(guān)理論和技術(shù)的進(jìn)展。
  在機(jī)器思維和人類思維間切換
  軟件工程師始終是在以計(jì)算機(jī)思維考慮問題。但是由于我們開發(fā)的系統(tǒng)基本是為人服務(wù)的,隨著你工作經(jīng)驗(yàn)的積累,越來越多的業(yè)務(wù)、產(chǎn)品層面的思考會不自覺的將你重新拉回到客戶/用戶的思考維度,這會讓你的架構(gòu)設(shè)計(jì)、代碼實(shí)現(xiàn)不自覺的又回升到人普遍感知的時(shí)空尺度;乜催^去幾十年軟件設(shè)計(jì)的發(fā)展過程,面向?qū)ο螅∣bject Oriented Design)、軟件重用(Software Reuse)、領(lǐng)域規(guī)范語言(Domain Specific Language)、微服務(wù)設(shè)計(jì)(Micro-service Design)等等,都是在用業(yè)務(wù)、場景來引導(dǎo)我們的編碼,我們早已習(xí)慣了用人類可讀(Human Readable)的邏輯、語言來指導(dǎo)軟件的設(shè)計(jì)和開發(fā)工作。
  這一切都無可厚非,軟件、互聯(lián)網(wǎng)行業(yè)多年以來的蓬勃發(fā)展也證明了它的方向大致正確。軟件行業(yè)會繼續(xù)沿著“機(jī)器計(jì)算為人類服務(wù)”的方向不斷演進(jìn)變化。近年來風(fēng)頭正勁的“低代碼”平臺、AI Code to Coding等技術(shù)也在試圖抹平人類和機(jī)器思維之間的鴻溝,讓普通人也可以通過最善于流暢表達(dá)的人類思維模式來指導(dǎo)計(jì)算機(jī)滿足自己的需求。另外,“過早的性能優(yōu)化是魔鬼”這句業(yè)內(nèi)格言也告訴我們,優(yōu)先采用人類的思維,基于業(yè)務(wù)的結(jié)構(gòu)來指導(dǎo)軟件的編寫是大的原則。
  當(dāng)我們?yōu)榱颂嵘浖到y(tǒng)的性能時(shí),或靠著“良質(zhì)”的驅(qū)使去不斷調(diào)整軟件系統(tǒng)以使所有的計(jì)算資源都不斷逼近它們的極致狀態(tài)時(shí),不要忘了重新回到機(jī)器思維。在這個(gè)特有的機(jī)器時(shí)空維度上,我們會“錙銖必較”,算計(jì)每一個(gè)字節(jié)的存儲、訪問優(yōu)化,每一類資源的合理利用和全局最優(yōu),以達(dá)到單位資源上更大規(guī)模的業(yè)務(wù)負(fù)載或者在指定業(yè)務(wù)負(fù)載前提下不斷降低對資源的消耗,實(shí)現(xiàn)“綠色計(jì)算”的目的。
  結(jié)語
  《禪和摩托車維修藝術(shù)》是一本好書,卻不是一本容易讀懂的書。大道至簡,但是作者通過了經(jīng)年的冥思苦想才悟到了這一真諦,卻是費(fèi)盡了周折,讀此書就如同跟作者一起回憶了整個(gè)思想形成的過程,雖辛苦但也算是小有收獲。如果有機(jī)會能進(jìn)一步研讀,隨著作者的行文脈絡(luò)一并了解古今、東西方眾多哲學(xué)先賢的著作及思想精髓,幸甚!

【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點(diǎn)判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

相關(guān)閱讀:

專題

CTI論壇會員企業(yè)