系統技術非業餘研究 » 系統標準庫的hipe支援(高階)
前篇文章http://mryufeng.javaeye.com/blog/428845 講述瞭如何啟用erlang hipe支援,但是使用者程式大量依賴的標準庫如stdlib, kernel等預設都不是native模式的, 所以我們的程式雖然啟用了hipe,但是隻是部分啟用了。用oprofile等工具可以看到我們的程式還是在process_main(虛擬機器的程式碼解釋 在這裡)裡面打轉。 我們來個極致的,通通hipe化。
有2個方案可以解決:
1. 在編譯otp_src的時候 export ERL_COMPILE_FLAGS=’+native +”{hipe, [o3]}”‘ 但是這個方案有個問題就是
native方式是和beam的模式有關的 如beam和beam.smp它的程式碼是不同的,但是所有的beam又公用一套庫,這樣只能捨棄一個了。所以這個方案就比較麻煩。
# erl Erlang R13B01 (erts-5.7.2) [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.2 (abort with ^G) 1> %%沒問題 #erl -smp disable <HiPE (v 3.7.2)> Warning: not loading native code for module fib: it was compiled for an incompatible runtime system; please regenerate native code for this runtime system .... Erlang R13B01 (erts-5.7.2) [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.2 (abort with ^G) 1>
這個也可以通過修改 alias erl=erl -smp disable 以便欺騙編譯器生成單cpu模式的beam
去繞過去
2. 動態編譯, 等系統執行起來以後,動態把相關的模組編譯一遍,這個思路看起來最簡單。
我做了個原型 證明這樣是可行的。。。
# cat hi.erl
-module(hi). -export([do/0]). do()-> [ turn(M, P)|| {M, P} <-code:all_loaded(), P=/=preloaded]. turn(M, P) -> P1 = binary_to_list(iolist_to_binary(re:replace(filename:join(filename:dirname(P), filename:basename(P, ".beam")), "ebin", "src"))), L = M:module_info(), COpts = get_compile_options(L), COpts1 = lists:foldr(fun({K, V}, Acc) when is_list(V) and is_integer(hd(V)) ->[{K, tr(V)}] ++ Acc ; (Skip, Acc) -> Acc ++ [Skip] end, [], COpts), c:c(P1, COpts1 ++ [native, "{hipe, [o3]}"]). tr(P)-> binary_to_list(iolist_to_binary(re:replace(P, "/net/isildur/ldisk/daily_build/otp_prebuild_r13b01.2009-06-07_20/", "/home/yufeng/"))). %%%這個地方要根據實際情況調整 具體的參看 m(lists). get_compile_options(L) -> case get_compile_info(L, options) of {ok,Val} -> Val; error -> [] end. get_compile_info(L, Tag) -> case lists:keysearch(compile, 1, L) of {value, {compile, I}} -> case lists:keysearch(Tag, 1, I) of {value, {Tag, Val}} -> {ok,Val}; false -> error end; false -> error end.
#erl -nostick Erlang R13B01 (erts-5.7.2) [/source] [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.2 (abort with ^G) 1> mnesia:start(). %啟動我們的應用程式 ok 2> hi:do(). [{ok,io}, {ok,erl_distribution}, {ok,edlin}, {ok,error_handler}, {ok,io_lib}, {ok,hi}, {ok,filename}, {ok,orddict}, {ok,gb_sets}, {ok,inet_db}, {ok,inet}, {ok,ordsets}, {ok,group}, {ok,gen}, {ok,erl_scan}, {ok,kernel}, {ok,erl_eval}, {ok,ets}, {ok,lists}, {ok,sets}, {ok,inet_udp}, {ok,code}, {ok,ram_file}, {ok,dict}, {ok,packages}, {ok,gen_event}, {ok,heart}, {ok,...}, {...}|...] 3> m(dict). Module dict compiled: Date: August 23 2009, Time: 17.20 Compiler options: [{cwd,"/home/yufeng/otp_src_R13B01/lib/stdlib/src"}, {outdir,"/home/yufeng/otp_src_R13B01/lib/stdlib/src/../ebin"}, {i,"/home/yufeng/otp_src_R13B01/lib/stdlib/src/../include"}, {i,"/home/yufeng/otp_src_R13B01/lib/stdlib/src/../../kernel/include"}, debug_info,<span style="color: red;">native,"{hipe, [o3]}"</span>] Object file: /home/yufeng/otp_src_R13B01/lib/stdlib/src/../ebin/dict.beam
。。。
看到了是用native模式編譯的哦。。。
不過編譯過程中有幾個模組是有點問題, 得改進下。
Post Footer automatically generated by wp-posturl plugin for wordpress.
No related posts.
相關推薦
系統技術非業餘研究 » 系統標準庫的hipe支援(高階)
前篇文章http://mryufeng.javaeye.com/blog/428845 講述瞭如何啟用erlang hipe支援,但是使用者程式大量依賴的標準庫如stdlib, kernel等預設都不是native模式的, 所以我們的程式雖然啟用了hipe,但是隻是部分啟用了。用oprofile等
系統技術非業餘研究 » 商品庫MySQL優化實踐
請教個問題,像淘寶產品庫這麼多的資料,能簡單介紹一下水平切分方案嗎?還有這麼多的資料對儲存要求也比較高,當單獨的儲存不能承擔的話,你們是怎麼個解決方案。謝謝,純技術探討。 Reply:June 23rd, 2011 at 12:47 pm我們是比較簡單的根據ID切分的,容量預先估計好的,留有比
系統技術非業餘研究
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年內有效,歡迎內部轉崗: 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海
系統技術非業餘研究 » 新的工作和研究方向
和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w
系統技術非業餘研究 » 叢集引入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
系統技術非業餘研究 » 2017升的最快的幾個資料庫無責任點評
ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼
系統技術非業餘研究 » 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
系統技術非業餘研究 » inet_dist_listen_options
Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke
系統技術非業餘研究 » 老生常談: ulimit問題及其影響
ulimit最初設計是用來限制程序對資源的使用情況的,因為早期的系統系統資源包括記憶體,CPU都是非常有限的,系統要保持公平,就要限制大家的使用,以達到一個相對公平的環境。以下是典型的機器預設的限制情況: $ ulimit -a core file size (blocks,
系統技術非業餘研究 » 求賢帖
原創文章,轉載請註明: 轉載自系統技術非業餘研究 本文連結地址: 求賢帖 作為一個優秀的工程師,你其實不缺少才華,你缺少的是神一樣的隊友、充滿挑戰的世界級技術難題,和一個可以施展自己才華的大舞臺。加入阿里核心系統資料庫開發團隊吧,你缺的這裡都有。來吧,戳這裡,給我們見識你的機會:http://b
系統技術非業餘研究 » 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:
系統技術非業餘研究 » Understanding Linux CPU Load 資料彙總
最近關注線上CPU load的人挺多,很多人覺得load太高系統就有問題,就想各種辦法來折騰。其實在我看來load只是系統CPU執行佇列的在執行程序數的近似值, 如下圖: 對於Unix發展的初期,機器的效能比較差,CPU核數也少,參考意義比較大。現在的機器都是非常強悍的,CPU,記憶體,IO各個
系統技術非業餘研究 » Erlang R15的記憶體delayed dealloc特性對訊息密集型程式的影響
在新的NUMA體系結構下,每個CPU都有自己的本地記憶體,如果要訪問其他CPU的記憶體,那算remote了,要走CPU之間的QPI通道,通常這樣速度會有40%的下降。 那麼對於多執行緒的程式來講,這個硬體的變化對軟體也有很大的影響。在多執行緒程式裡面,通常一個執行緒會為一個物件分配記憶體,然後把這
系統技術非業餘研究 » 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
系統技術非業餘研究 » Linux下新系統呼叫sync_file_range
我們在做資料庫程式或者IO密集型的程式的時候,通常在更新的時候,比如說資料庫程式,希望更新有一定的安全性,我們會在更新操作結束的時候呼叫fsync或者fdatasync來flush資料到持久裝置去。而且通常是以頁面為單位,16K一次或者4K一次。 安全性保證了,但是效能就有很大的損害。而且我們更新