1. 程式人生 > >系統技術非業餘研究 » Erlang R15最大的賣點Native Process

系統技術非業餘研究 » Erlang R15最大的賣點Native Process

R15最激動人心的東西就是這個Native Process,請參看Rickard Green寫的Future Extensions to the Native Interface:看 這裡

我來blabla下。 做過Erlang規模程式的人都知道有個痛, Erlang的公平排程引起的痛。 舉個例子,比如說日誌服務。當我們的系統有成千上萬的程序需要日誌服務的時候,我們通常會把日誌的內容發給一個日誌程序由它來負責持久化。這是個典型的模組劃分方法,我們之前的c程式也都是這麼幹的。但是在erlang下這樣很容易有問題。大家知道Erlang講究公平,程序排程是公平的,port排程是公平的,bif使用是公平的,甚至ets這樣的模組使用也是公平的。那麼我們就可以這麼理解。如果一個系統裡面有N個程序需要服務,那麼總程序數目是N+1, 平均來分配時間片。反過來說就是這個日誌程序只能分的整個系統的1/(N+1)的cpu計算能力,但是要幹N個活。後果就是這個程序忙不過來,導致訊息佇列不停的加大,訊息佇列需要堆記憶體,這個記憶體需求越來越大,最後系統分配不出記憶體,最終vm掛掉了。

這個典型的設計問題是幾乎每個剛做erlang程式的人都會碰到的。 那我們如何來解決呢?一個解決方案就是加大日誌服務程序的數目,來多分點CPU。還有一個方案就是繞過公平排程的原則。 Erlang的每個程序執行的時候是分配一定的時間片,每執行一個函式就消耗一個時間片,當時間片消耗完畢的時候,程序就被搶佔排程。那麼知道了這個工作原理,我們就可以耍賴來在函式執行的時候不減掉時間片,這樣這個程序就可以無限制的執行。這也是我過去繞開這個問題的解決方案,缺點是你需要對vm很熟悉,並且知道如何改。

這時候Native Process來救助了。我們知道目前的版本是支援nif的,也即是說使用者可以自己寫函式來處理邏輯。但是nif有限制的,它只是被動的被排程器來執行,主控是由排程器來完成的。如果排程器在合適的事件上把相應的鉤給我們,那我們就有可能能夠影響排程器的運作。

Native Process就是這個思路。

Native Process程序本身是個和原來相容的程序,不影響系統原理的語義。在hook後自己進入自己的事件迴圈,來獨立處理IO時間或者執行計算,在必要的時候再變成原來的程序。

通過暴露更多的鉤給nif, 使用者可以自己定義自己的事件處理邏輯來干預排程器的行為。比如說在排程器切出一個程序的時候,允許使用者對程序的時間片計數器修改,這樣就可以繞過PREEMPTABLE NIF and Driver。由於Erlang是程序間完全隔離的,那我們也可以繞過這個限制,可以直接修改程序的資料,達到在VM裡面共享狀態的目的。hook使得這些事情都變得可能。

具體如何使用請參考ppt。

我們來總結下,它的適用場景是:

  • Optimizing
  • Access functionality not available in Erlang
  • Operating System services
  • Third party libraries

他能夠解決下面的問題:

  • Native processes make drivers obsolete
  • Will be able to handle any protocol
  • Possible to minimize the need for native code
  • Will have access to the same functionality as ordinary processes
  • More efficient
  • Distribution transparent
  • Share implementations

期待 otp團隊給力!

祝玩得開心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

相關推薦

系統技術業餘研究 » Erlang R15賣點Native Process

R15最激動人心的東西就是這個Native Process,請參看Rickard Green寫的Future Extensions to the Native Interface:看 這裡 我來blabla下。 做過Erlang規模程式的人都知道有個痛, Erlang的公平排程引起的痛。 舉個例子

系統技術業餘研究 » Erlang R15的記憶體delayed dealloc特性對訊息密集型程式的影響

在新的NUMA體系結構下,每個CPU都有自己的本地記憶體,如果要訪問其他CPU的記憶體,那算remote了,要走CPU之間的QPI通道,通常這樣速度會有40%的下降。 那麼對於多執行緒的程式來講,這個硬體的變化對軟體也有很大的影響。在多執行緒程式裡面,通常一個執行緒會為一個物件分配記憶體,然後把這

系統技術業餘研究 » Erlang 17.5引入+hpds命令列控制程序預設字典大小

Erlang 17.5釋出引入控制程序預設字典大小的命令列引數: Erlang/OTP 17.5 has been released Written by Henrik, 01 Apr 2015 Some highlights of the release are: ERTS: Added co

系統技術業餘研究 » Erlang R16B03釋出,R17已發力

Erlang R16B03釋出了,通常03版本是bug fix版本,進入生產版本,官方的說明如下: OTP R16B03 is a service release with mostly a number of small corrections and user contributions. B

系統技術業餘研究 » Erlang R13B04 Installation

R13B04後erlang的原始碼編譯為了考慮移植性,就改變了編譯方式,以下是官方wiki上的安裝文件: 1. Cloning Here are the basic steps to build Erlang/OTP in the Git repository. Start by cloning:

系統技術業餘研究 » Erlang R17新特性淺評

Erlang R17RC2 原始碼已經就緒, 參見 這裡 後續版本的釋出時間,官方的時間安排參見 這裡,摘抄如下: Preliminary dates for the upcoming release: Release: erts, emu,comp |Code stop

系統技術業餘研究 » Erlang R16支援帶顏色的控制檯

Erlang通過fix tty驅動的過濾,在R16版本支援帶顏色的控制檯,這個特性在我們做各種監控工具高亮非常有幫助,參見R16的Readme: Support ANSI in console Unix platforms will no longer filter control sequenc

系統技術業餘研究 » erlang coredump問題

早上成立濤同學問道: : :)我們最近發生了幾次宕機。。節點無緣無故就沒有了。也沒有crash dump,也不知道任何線索。 我們知道erlang的VM在正常運作的時候,如果發現erlang程式的異常或者虛擬機器資源不夠如記憶體不夠的時候,會產生erl_crash.dump檔案,裡面把crash的

系統技術業餘研究 » Erlang open_port極度影響效能的因素

Erlang的port相當於系統的IO,打開了Erlang世界通往外界的通道,可以很方便的執行外部程式。 但是open_port的效能對整個系統來講非常的重要,我就帶領大家看看open_port影響效能的因素。 首先看下open_port的文件: {spawn, Command} Star

系統技術業餘研究 » Erlang節點重啟導致的incarnation問題

今天晚上mingchaoyan同學在線上問以下這個問題: 152489 =ERROR REPORT==== 2013-06-28 19:57:53 === 152490 Discarding message {send,<<19 bytes>>} from <0.8

系統技術業餘研究 » Erlang port巧用環境變數

Erlang與外面世界的互動主要通過port來進行的,特別是和外部程式的協作,通常是通過管道進行的。 基本上有2種方法可以呼叫外部程式: 1. os:cmd 2. erlang:open_port, 這二種方式各有利弊,先看文件: os:cmd的文件參見這裡 cmd(Command) ->

系統技術業餘研究 » Erlang新新增選項 +zerts_de_busy_limit 控制節點間通訊的資料量

erlang節點間通訊預設是通過tcp通道進行的, 而且每對節點間只有一個tcp連結,所有的rpc和內建的類似monitor這樣的訊息也都是通過這個通道進行的. 當資料量過大的時候, 系統就會發出 busy distribution port警告, 同時限制資料的吞吐. 這個值預設是128k. 現

系統技術業餘研究 » Erlang程式碼反編譯以及檢視彙編碼

Erlang的程式碼是先翻譯成abstract_code,再到目的碼的,如果有符號資訊很容易恢復原始碼,通常我們部署系統的時候需要把符號資訊去掉,reltool就可以幹這個事情! 我們演示下: $ cat server.erl -module(server). -compile(export

系統技術業餘研究 » Erlang Shell實用小技巧

Erlang Shell下有很多內建的命令,在平時互動的時候很好用,文件裡面都是一行帶過,大家可能沒什麼感覺。 我來重點講解和演示下: $ erl Erlang R14B04 (erts-5.8.5) [/source] [smp:2:2] [rq:2] [async-threads:0] [h

系統技術業餘研究 » ”Erlang supervisor 極其白痴的 Bug“的澄清

2008-05-26的時候, 著名的Trustno1發表了這篇文章 http://www.iteye.com/topic/197097 抱怨Erlang supervisor 極其白痴的一個bug. 今天 @淘李福 同學重新提起這個事情: 翻到一個老帖子: http://www.iteye.com

系統技術業餘研究 » Erlang叢集RPC通道擁塞問題及解決方案

Erlang的叢集預設情況下是全聯通的,也就是當一個節點加入叢集的時候,介紹人會推薦叢集裡面所有的節點主動來和新加入的節點建立聯絡, 效果如下圖: 我們這次不講如何避免全聯通而是來講這個節點間通道的問題。 我們知道erlang的訊息傳送是透明的,只要呼叫Pid!Msg, 虛擬機器和叢集的基礎設

系統技術業餘研究 » Erlang match_spec引擎介紹和應用

match_spec是什麼呢? A “match specification” (match_spec) is an Erlang term describing a small “program” that will try to match something (either the para

系統技術業餘研究 » Erlang虛擬機器基礎設施dtrace探測點介紹和使用

最新的Erlang虛擬機器(R15B01)很大的一個改進就是加入了對dtrace探測點的支援了, 具體參見這裡, 主要目標是方便在生產實踐中定位複雜的效能問題。 目前Erlang的虛擬機器的探測點支援Linux的systemtap和freebsd的dtrace,我們剛好能夠享受的到。 作者Scot

系統技術業餘研究 » erlang的abstract code

erlang的abstract code是編譯的中間程式碼,很多工具如 erl_pp lint什麼的都是根據這個做調整的。還有進一步的parse_transform也是基於它的。 所以,瞭解它非常重要。 erts user guide裡面詳細了描述了它的定義。我這裡展示的是如何獲取到某個模組的ab

系統技術業餘研究 » Erlang原始碼彙編格式

我們在編碼的時候, 通常會好奇, 這時候需要觀察erl原始碼生成的VM opcode. Erlang的VM是register based的VM, 生產的opcode很容易理解. 生成彙編格式有2種方式: 1. 從原始碼生成抽象碼. erlc +”‘S'” mod.erl, 生成mod.S 2.