erlang---启动参数学习/研究
erlang啟動參數有3種:emulator flags,?flags?和plain arguments。
emulator flags 是以“+”開頭的,用來控制模擬器的行為,附送一個非常實用的例子:
相關閱讀:http://www.linuxidc.com/Linux/2011-07/39156.htm
flags?是以“-”開頭的, 是erlang運行時系統的參數,可以用init:get_argument/1獲得。
plain arguments 普通參數,在第一個flag參數前,或在-- flag之后,-extra后的參數都是普通參數。
Here?+W w?and?+R 9?are emulator flags.?-s my_init?is an init flag, interpreted by?init.?-sname arnie?is a user flag, stored by?init. It is read by Kernel and will cause the Erlang runtime system to become distributed. Finally, everything after?-extra?(that is,?+bertie) is considered as plain arguments.
Flags
-Application Par Val?把應用中的Par參數設置為值Val;
-args_file FileName?從文件FileName讀取命令行參數;
-boot File? 指定啟動使用的boot文件,默認是$ROOT/bin/start.boot,在這個目錄下還有start_clean.boot,start_sasl.boot。如果需要sasl的話,就“-boot start_sasl ”;
-boot_var Var Dir 代替$ROOT用的;
-code_path_cache 不常用;
-compile Mod1 Mod2 ...? 不推薦使用了,應該使用erlc;
-config Config 指定配置文件,這個是很有用的,比如在Programming Erlang里,就用到 erl -boot start_sasl -config elog3,其中文件全名是elog3.config,內容如下:
配置的含義,請參考相關書籍;
-connect_all false?貌似不常用;
-cookie Cookie?被-setcookie代替了;
-detached 脫離console,跑后臺erlang進程用的,看做"nohup **** &";
-emu_args?debug用的,打印出實際傳給模擬器的值;
-env Variable Value?設置操作系統環境變量用的,比如:
-eval Expr(init flag)? 表達式做啟動參數,比如(下列代碼在本機執行出錯,以后再研究):
-extra(init flag)? 后面跟的都是普通參數;?-heart?啟動心跳監控器;-hidden 設置為隱藏節點,該節點會連接集群的所有節點,但是在其他節點執行node/0,不會列出它;-hosts Hosts erlang運行在那些服務器的IP地址;
-id Id?給erlang進程設置一個id,一般和-sname?和?-name一起用;
?
-init_debug?在啟動/初始化erlang進程時,打印debug信息;-instr-loader Loader?為erl_prim_loader指定裝載模塊的方法,相當于java里指定classloader;-make-man Module-mode interactive | embedded-name Name?給一個erlang節點/進程設置一個名稱-noinput-noshell-nostick
-pa Dir1 Dir2 ...
-pz Dir1 Dir2 ...-remsh Node 遠程啟動一個erlang節點,比如(當然RSA神馬的,要先搞定):
?-rsh Program?遠程啟動一個slave erlang節點,這里?http://www.linuxidc.com/Linux/2011-07/39157p3.htm?有一個例子;
-run Mod [Func [Arg1, Arg2, ...]]
-s Mod [Func [Arg1, Arg2, ...]]
-setcookie Cookie?給節點設置cookie,比如:
并且它是運行時可以改的:
-shutdown_time Time 關閉節點需要的時間,如果超過,就直接kill,默認是infinity;
-sname Name?給節點設置名字,和-name類似,不過它的結果是:Name@Host?;
-smp [enable|auto|disable]?是否需要支持smp,默認應該是enable的,smp的好處見這里http://www.linuxidc.com/Linux/2011-07/39157p2.htm;
-version(emulator flag)?
Emulator Flags
+a size?一般實用默認值就可以了。
Suggested stack size, in kilowords, for threads in the async-thread pool. Valid range is 16-8192 kilowords. The default suggested stack size is 16 kilowords, i.e, 64 kilobyte on 32-bit architectures. This small default size has been chosen since the amount of async-threads might be quite large. The default size is enough for drivers delivered with Erlang/OTP, but might not be sufficiently large for other dynamically linked in drivers that use thedriver_async()?functionality. Note that the value passed is only a suggestion, and it might even be ignored on some platforms.
+A size?一步線程池的大小,默認是0;比如執行werl +A 1,會看到:
+B [c | d | i]
+c
+d 默認情況下erlang進程遇到內部錯誤,比如oom,會產生一個crash dump和core dump,+d讓節點只產生后者;
+e Number?ETS表的最大數量;+ec強制ETS表啟動壓縮,一般不用的;+fnl?如果文件名使用了ISO-latin-1編碼;+fnu如果文件名使用了UTF-8 編碼;
+fna?和當前操作系統一致;
+hms Size?指定erlang進程的默認(最小?)堆內存大小(這個應該不用太擔心);+hmbs Size 進程默認二進制虛擬內存堆大小;
+K true | false 是否開啟kernel poll,就是epoll;
+l+MFlag Value
+P Number?erlang節點系統的最大并發進程數;
+R ReleaseNumber
+r
+rg ReaderGroupsLimit? Limits the amount of reader groups used by read/write locks optimized for read operations in the Erlang runtime system. By default the reader groups limit equals 8.
+S Schedulers:SchedulerOnline
+sFlag Value?
+t size?
+T Level
+V?模擬器版本號
+v?verbose
+W w | i
+zFlag Value
Environment variables
ERL_CRASH_DUMP?
ERL_CRASH_DUMP_NICE
ERL_CRASH_DUMP_SECONDS?
?ERL_AFLAGS
ERL_ZFLAGS 和?ERL_FLAGS
ERL_LIBS
ERL_EPMD_PORT
關于Erlang和SMP的一些說明
by.Kenneth Erlang/OTP team, Ericsson
譯:ShiningRay
以下是一些Erlang SMP實現的細節和與性能與伸縮性相關一些簡單介紹。
幾周之內還有有一個關于多核如何運作以及未來如何發展的更詳細的介紹。我打算將一些內容放在我的報告中,將于9月27日的ICFP2008,Erlang Workshop在Victoria BC展示給大家。
?
沒有SMP支持的Erlang VM只有1個運行在主處理線程中的調度器。該調度器從運行隊列(run-queue)中取出可以運行的Erlang進程以及IO任務,而且因為只有一個線程訪問他們所以無須鎖定任何數據。
而帶有SMP支持的Erlang VM可以有一個或多個調度器,每個運行在一個線程中。調度器從同一個公共運行隊列中取出可運行的Erlang進程和IO任務。在SMP VM中所有的共享數據結構都會由鎖進行保護,運行隊列就是這樣一個由鎖保護的數據結構。
從OTP R12B開始,如果操作系統報告有多于1個的CPU(或者核心)VM的SMP版本會自動啟動,并且根據CPU或者核心的數量啟動同樣數量的調度器。
你可以從“erl”命令打印出來的第一行看到它選擇了哪些參數。例如:
Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] …..其中“[smp:4]”表示SMP VM運行了4個調度器。默認值可以用“-smp [enable|disable|auto]”來替換,auto是默認的。如果smp被啟用了(-smp enable),要設置調度器的數量可以使用“+S Number”其中Number是調度器的數量(1到1024)
注意1:運行多于CPU或核心總數的調度器不會有任何提升。
注意2:在某些操作系統中一個進程可使用的CPU或者核心的數量可以被限制。例如,在Linux中,命令“taskset”就可以實現這個功能。Erlang VM目前還只能探測CPU或者核心的總數,不會考慮“taskset”所設置的掩碼。正因如此,例如可能會出現(已經出現過了)即使Erlang VM運行了4個調度器,也只使用了2個核心。OS會進行限制因為它要考慮“taskset”所設置的掩碼。
每個Erlang VM的調度器都運行于一個OS線程上,是OS來決定線程是否執行在不同的核心上。一般來說OS會很好地處理這個問題并且會保證線程在執行期間運行于同一個核心上。
Erlang進程會被不同的調度器運行,因為他們是從一個公共運行隊列中被取出,由首先可用的調度器運行。
性能和伸縮性
只有一個調度器的SMP VM要比非SMP的VM稍微慢那么一點點。SMP VM內部需要用到各種鎖,不過只要不存在鎖的爭用,那么由鎖引起的開銷不會非常大(就是鎖爭用上面需要花時間)。這也解釋了為何在某些情況下,運行多個只有一個調度器的SMP VM要比包含多個調度器的單一SMP VM更加高效。當然運行多個VM要求應用可以按照多個并行任務的方式運行并且之間沒有或者幾乎不通訊。
一個程序是否能在多核上的SMP VM中良好地進行提升很大程度上取決于程序的性質,某些程序可以保持線性提升至8核甚至16核,同時其他某些程序基本不能提升,連2核都不行。實際應用中很多程序都能在主流市場的核心數上得到提升,見下文。
若并行的持續“通話”由每個核心一個或多個Erlang進程來表示,實際的支持大量通話的電信產品已經先現出在雙核和四核處理器上不俗的伸縮性。注意,這些產品是在SMP VM和多核處理器出現很久以前按照普通的Erlang風格來寫的,他們也能無須任何修改甚至不需重新編譯代碼就能從Erlang SMP VM中獲益。
SMP性能得到持續改進
SMP實現正被不斷改進以便能得到更好的性能和伸縮性。在每個服務發布版R12B-1,2,3,4,5…,R13B等等中,你都能發現新的優化。
一些已知的瓶頸
單一的常見運行隊列隨著CPU或核心的數量的增加會成為一個顯著的瓶頸。
這從4核開始往上就會顯現出來,不過4核仍然可以為多數應用程序提供不錯的性能。我們正在從事一個每個調度器一個運行隊列的解決方法作為目前最重要的改進。
Ets表格會引入鎖。在R12B-4之前在每次對一個ets-table的訪問中會用到兩個鎖,但是在R12B-4中meta-table的鎖被優化過,可以顯著減少爭用(前面已經提到爭用是有很大代價的)。如果很多Erlang進程訪問同一個表格,就會有很多鎖爭用造成性能降低尤其當這些進程主要工作是訪問ets-table。鎖存在于表級而非記錄級。注意!這也會影響到Mnesia因為Mnesia用到了很多ets-table。
我們關于SMP的策略
當我們開始實現SMP VM的最初,我們就確定了策略:“首先讓它可以運行,然后測量,然后優化”。自從2006年五月我們發布了第一個穩定的SMP VM(R11B)以來,我們一直遵循著這個策略。
還有更多已知的東西可以改進,我們會按照性能的收益大小先后各個擊破。
我們將主要的精力放在多核(大于4)上更好的連續伸縮性上。
卓越典范
即使SMP系統有還有一些已知的瓶頸不過已經有不錯的整體性能和伸縮性,同時我相信在讓程序員利用多核機器事半功倍方面,我們是一個卓越的典范。
Erlang集群節點集合的啟動
一、配置SSH客戶端:無需密碼的連接?
1. SSH客戶端RSA key授權?
i). 生成SSH RSA key:?
ssh-keygen -t rsa?
全回車取缺省,將在~/.ssh目錄下將生成id_rsa和id_rsa.pub倆文件?
ii) 將生產的公共RSA key拷貝到目標機器上:
| ? |
a).將id_rsa.pub文件拷貝到目標機器上:?
scp ~/.ssh/id_rsa.pub userid@ssh2_server:id_rsa.pub?
b). ssh登陸目標機器,在目標機器的~/.ssh目錄下生成文件內容:?
cat id_rsa.pub >>$HOME/.ssh/authorized_keys?
刪掉id_rsa.pub?
以上兩步命令可以用一條命令實現:?
ssh-copy-id ssh2-server?
本質上都是把master上生成的id_rsa.pub文件拷貝到slave機器./ssh目錄下,同時改名為authorized_keys?
這一步完成后,從master機器上登錄slave機器直接?
ssh slave?
就行了,不用輸入密碼。?
同樣的,slave到master也得這樣:不用輸入密碼直接ssh?
集群內所有的機器相互之間都要這樣實現無密碼輸入就能直接ssh?
2. 在啟動master節點的那個機器上,啟動SSH-agent軟件并添加你的用戶ID?
這樣每次連接時就不需要passphrase了,辦法是讓ssh-agent記住你?
i) 首先確認你的機器上有ssh-agent在運行(一般都沒有)?
ps aux|grep ssh-agent?
查看ssh-agent運行在當前窗口管理器(或者shell)下?
pstree?
如果不是,在shell中創建一個ssh-agent會話:?
ssh-agent screen?
這回啟動了一個帶ssh-agent的screen會話窗口,以后這個screen控制臺內的所有命令都要經過ssh-agent?
ii) 添加你的ID?
ssh-add?
你可以查看當前ssh-agent中已添加的ID?
ssh-add -l?
也可以刪除一個ID?
ssh-add -d?
3. 集群的路由進出?
當建立集群后,經常需要訪問作為網關(或者負載均衡器)的前端計算機。要訪問其它節點,你需要告訴作為網管的機器將你的請求路由到機器節點中。?
例如,假設你的網關是80.65.232.137。控制用的計算機在集群之外,這個機器是操作員用于控制集群的計算機。集群內部網絡是192.0.0.0。在你的客戶計算機上,啟動命令:?
route add -net 192.0.0.0 gw 80.65.232.137 netmask 255.255.255.0?
這個命令需要確保網關計算機上IP forwarding 可用?
要確保正確的路由,可以維護一個常用的/etc/hosts文件,該文件中記錄了你的集群中的所有計算機,例子中,集群有7臺計算機組成.?
10.9.195.12?? controler?
80.65.232.137 gateway?
192.0.0.11??? eddieware?
192.0.0.21??? yaws1?
192.0.0.22??? yaws2?
192.0.0.31??? mnesia1?
192.0.0.32??? mnesia2?
也可以設置DNS服務器,但對小網絡來說/etc/hosts文件就已經足夠了?
二、啟動Erlang master節點并建立Erlang集群?
一旦通過SSH連接集群不再提示輸入密碼后建立一個Erlang集群將變得非常容易。?
1. 啟動Erlang master節點的模塊:?
啟動master
這里的要點是:集群間所有節點(至少是master對所有slave節點)之間都要能實現“相互”無密碼輸入的ssh登錄?
我想無密碼輸入的原理可能是:?
機器A生成RSA key,有一個公開的密鑰,別的機器B要想無密碼ssh這同機器,B必須在本地擁有A的公開密鑰
轉載于:https://www.cnblogs.com/fvsfvs123/p/4172215.html
總結
以上是生活随笔為你收集整理的erlang---启动参数学习/研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB Replication
- 下一篇: Linux 统计某个字符串出现的次数