系統技術非業餘研究 » R14A新增新指令優化Ref訊息的接收
Erlang的慣用法之一就是在訊息匹配的時候,如果需要唯一性,通常會通過make_ref搞個唯一的Ref來作為訊息的一部分來匹配。這個慣用法用在gen_server:call或者demonitor這樣的使用頻度很高的函式裡面。由於erlang的訊息匹配是再訊息佇列裡面挨個遍歷來匹配,特別是訊息佇列特別長的時候,會有很大的效能瓶頸。於是新的優化出現了,以下是編譯器beam_receive.erl裡面的解釋,寫的很清楚:
%%% %%% In code such as: %%% %%% Ref = make_ref(), %Or erlang:monitor(process, Pid) %%% . %%% . %%% . %%% receive %%% {Ref,Reply} -> Reply %%% end. %%% %%% we know that none of the messages that exist in the message queue %%% before the call to make_ref/0 can be matched out in the receive %%% statement. Therefore we can avoid going through the entire message %%% queue if we introduce two new instructions (here written as %%% BIFs in pseudo-Erlang): %%% %%% recv_mark(SomeUniqInteger), %%% Ref = make_ref(), %%% . %%% . %%% . %%% recv_set(SomeUniqInteger), %%% receive %%% {Ref,Reply} -> Reply %%% end. %%% %%% The recv_mark/1 instruction will save the current position and %%% SomeUniqInteger in the process context. The recv_set %%% instruction will verify that SomeUniqInteger is still stored %%% in the process context. If it is, it will set the current pointer %%% for the message queue (the next message to be read out) to the %%% position that was saved by recv_mark/1. %%% %%% The remove_message instruction must be modified toinvalidate %%% the information stored by the previous recv_mark/1, in case there %%% is another receive executed between the calls to recv_mark/1 and %%% recv_set/1. %%% %%% We use a reference to a label (i.e. a position in the loaded code) %%% as the SomeUniqInteger. %%%
結論: 點滴優化成就高效能。
Post Footer automatically generated by wp-posturl plugin for wordpress.
相關推薦
系統技術非業餘研究 » R14A新增新指令優化Ref訊息的接收
Erlang的慣用法之一就是在訊息匹配的時候,如果需要唯一性,通常會通過make_ref搞個唯一的Ref來作為訊息的一部分來匹配。這個慣用法用在gen_server:call或者demonitor這樣的使用頻度很高的函式裡面。由於erlang的訊息匹配是再訊息佇列裡面挨個遍歷來匹配,特別是訊息佇列
系統技術非業餘研究 » Erlang R17新特性淺評
Erlang R17RC2 原始碼已經就緒, 參見 這裡 後續版本的釋出時間,官方的時間安排參見 這裡,摘抄如下: Preliminary dates for the upcoming release: Release: erts, emu,comp |Code stop
系統技術非業餘研究 » Linux下新系統呼叫sync_file_range
我們在做資料庫程式或者IO密集型的程式的時候,通常在更新的時候,比如說資料庫程式,希望更新有一定的安全性,我們會在更新操作結束的時候呼叫fsync或者fdatasync來flush資料到持久裝置去。而且通常是以頁面為單位,16K一次或者4K一次。 安全性保證了,但是效能就有很大的損害。而且我們更新
系統技術非業餘研究 » Erlang R14B 新增加引數 +swt 控制排程器的喚醒閥值
來自github上的otp原始碼提交訊息: Erlang R14B 新增加引數 +swt very_low|low|medium|high|very_high Set scheduler wakeup threshold. Default is medium The threshold dete
系統技術非業餘研究 » R14A實現了EEP31,添加了binary模組
Erlang的binary資料結構非常強大,而且偏向底層,在作網路程式的時候,很方便的能夠和二進位制協議對應起來。但是由於這個資料結構加入erlang語言的時間不是很長,相關的配套模組不是很多。 在binary的匹配,替換,修改就顯的非常麻煩。 於是有了EEP31 。 R14A昨天已經實現了這個功
系統技術非業餘研究 » gen_tcp呼叫程序收到{empty_out_q, Port}訊息奇怪行為分析
今天有同學在gmail裡面問了一個Erlang的問題,問題描述的非常好, 如下: 問題的背景是: 1、我開發了一個服務端程式,接收客戶端的連線。同一時刻會有多個客戶端來連線,連線後,接收客戶端請求後,再發送響應訊息,然後客戶端主動斷連。
系統技術非業餘研究 » Erlang新新增選項 +zerts_de_busy_limit 控制節點間通訊的資料量
erlang節點間通訊預設是通過tcp通道進行的, 而且每對節點間只有一個tcp連結,所有的rpc和內建的類似monitor這樣的訊息也都是通過這個通道進行的. 當資料量過大的時候, 系統就會發出 busy distribution port警告, 同時限制資料的吞吐. 這個值預設是128k. 現
系統技術非業餘研究 » Flashcache新新增驅逐空閒髒頁引數
我在之前的博文提過Flashcache的cache是以set為單位管理的,每個set預設2M。 當單個set裡面的髒頁數量超過dirty_thresh_pct的時候,就會啟動背景工作佇列來把超過設定的髒頁回寫到後備磁碟去。 這裡有別的同學對flashcache設計文件的翻譯. 參看dirty_th
系統技術非業餘研究 » 新的工作和研究方向
和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w
系統技術非業餘研究 » OTP R14A今天正式釋出了
點選這裡下載R14A 以下是這次釋出的亮點,沒有太大的效能改進, 主要是修理了很多BUG! — HIGHLIGHTS ———————————————————- OTP-8217 == erts stdlib compiler == The module binary from EEP31 (an
系統技術非業餘研究 » ETS新的壓縮特性
即將釋出的R14B01要支援ets的壓縮,更大程度的提高記憶體的利用率。 在github上可以看到這個分支,有興趣的同學可以下載下來看看。 壓縮的時候只壓縮value, key是不壓縮的。 value特別簡單型別的eterm也是不壓縮的,因為zip壓縮需要一定長度的內容,而且壓縮本身也要加入一點的
系統技術非業餘研究 » 如何找出異常所在的行(新思路)
在Erlang-china的郵件列表上看到這樣的問題: 我的服務經常發生這樣的錯誤,舉例: Error in process <0.33.0> with exit value: {badarg,[{erlang,’++’,[undefined,[{“37”}]]},{groups,do
系統技術非業餘研究 » Erlang叢集自動化新增節點指南
Erlang的叢集是由各個節點組成的,一個節點有一個名字來標識,而不管這個節點在網路的物理位置,所以在部署Erlang叢集的時候就很方便。只要在叢集裡新啟動一個節點,給個相對固定的引導的節點,讓新節點和這個引導節點取得聯絡,由引導節點把新節點介紹入叢集就OK了。 在實踐中,新採購的機器上通常配置好
系統技術非業餘研究 » trace機制新增exception_trace
我們在使用Erlang的時候,經常會發現exception被靜悄悄得忽略掉了,這點對於診斷問題非常的不友好。R14B04新新增exception_trace幫助使用者在異常的時候,得到異常得呼叫棧,就馬上可以解決問題。 這個功能主要面對高階使用者,文件裡面沒怎麼描述這個事情,主要的實現在erts的
系統技術非業餘研究 » fio效能測試工具新添圖形前端gfio
gfio.c: In function ‘gfio_ui_setup_log’: gfio.c:322: error: ‘GtkTreeSelection’ undeclared (first use in this function) gfio.c:322: error: ‘selection
系統技術非業餘研究
ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼
系統技術非業餘研究 » MySQL資料庫架構的演化觀察
MySQL資料庫架構的演化觀察 December 14th, 2017 Categories: 資料庫 Tags: mysql
系統技術非業餘研究 » inet_dist_connect_options
Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke
系統技術非業餘研究 » 推薦工作機會
最後更新時間:2014/11/28 請賜簡歷至:[email protected], 感謝您對加入我們公司有興趣,我們希望能早日和您共事。 以下幾個職位1年內有效,歡迎內部轉崗: 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海
系統技術非業餘研究 » 叢集引入inet_dist_{listen,connect}_options更精細引數微調
Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke