全世界只有我們Erlang程序員是正確的
英文原文:Solving the wrong problem
全世界只有我們是正確的,其他的全錯了。我們(Erlang 程序員)找到了癥結并正確的解決了問題,所有的其他人(非 Erlang 人)都找錯了方向,解決了錯誤的問題。
全世界其他人想解決的問題是如何讓現存的程序能并行執行。2004 年之前,摩爾定律一直有效。每年我們的程序執行都會變得更快,我們不需要成為一個優秀的程序員,我們不需要掌握更優化的算法就能讓程序一年比一年更快。
芯片越來越大,時鐘速度越來越快,程序運行速度越來越快,每年大概以 15% 幅度的性能提升。
到了 2004 年,這些現象終止了。芯片已經足夠大,時鐘的速率已經快到在一個時鐘周期內時鐘脈沖不能到達芯片的所有部分。電路設計開始改變。多核處理器出現。
從 2004 年開始,芯片的體積仍然在增大,但時鐘的速率開始變小,每個芯片上的 CPU 數量開始增加。我們從每一個芯片只有一個超級處理器的時代進入到每個芯片有多個速度較慢、性能較弱的多核處理器時代。
由此開始,順序執行的程序顯得越來越慢,一年慢過一年,而并行執行的程序開始變得越來越快。
問題是,根本沒有并行執行的程序,有也是極少。
而 Erlang 是一種具有并發特征的編程語言,所以 Erlang 程序本質上在具有并行能力的計算機上運行時要比其它程序都快的多。而唯一能阻擋它運行的更快的問題就是 Erlang 程序中可能存在一些必須順序執行的瓶頸。
并行程序中有需要順序執行的部分,這正應驗了 Amdahl 定律。
假設你的程序中有 10% 是需要順序執行的(其余部分可以并行),可以并行的部分的執行時間可以壓縮近似0——只要有足夠的可以并行的處理器。但順序執行部分的時間無法縮減。
如果程序中含有 10% 的需要順序執行的代碼,你的程序執行速度最高能提高 10 倍。其中1/10 的程序的速度永遠無法提高,其它9/10 的程序的執行時間可以縮減至接近0。
所以,對于 Erlang 程序員來說,提高他們的程序的運行速度的技巧就是找出代碼中需要順序執行的部分。
而對于任何對于其他編寫順序執行程序的程序員來說,提高他們程序速度的方法是找出他們程序中可以并行執行的部分。
讓串行程序自動并行化的征途鋪滿荊棘,無法走通。(并不完全是這樣,在某些特殊環境中是可以實現的,但絕非易事)。
現在的數據中心了都排滿了酷炫的新型計算機,某些頂級的配置里擁有多達 24 核。但它們的性能呢?這些酷炫的新機器能快 24 倍嗎?
對某些程序來說是的,但對大多數程序來說不是。對大多數程序來說 24 個 CPU 中只有一個被利用。CPU 的低利用率成了一個嚴重的問題。這點正印證了 Alexander Gounares
Brilliant 在 Erlang factory 談到的問題。
Alexander 的演講讓我們隱約看到了未來。他開創 concurix 讓我們看到了未來的方向。他們正在開發工具能自動找出 Erlang 代碼中需要順序執行的瓶頸。
Concurix 使用這些工具來發現 Erlang 虛擬機中的瓶頸,在他們的測試中顯示了驚人的結果。他們找到了一個圖片處理應用中的瓶頸,它是 zlib 庫中的一個程序鎖,是用C寫成的。他們用 Erlang 重寫了它,用 Erlang 替換了C代碼。
這真是不可思議,C程序本應更快,事實也是,但它卻有個同步鎖。Erlang 程序相比之下要慢,但沒有狀態鎖,這賦予了它提升能力的機會。去掉了C代碼后,用 Erlang 寫成的圖片處理應用比原始的C程序快了很多。
我很吃驚——驚奇于這樣的好東西的出現。
當 Alexander 在 Erlang factory 的演講視頻出來之后,你們觀看時準備好驚奇吧。這是未來,未來就在下周舊金山。