小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Erlang啟動參數(shù)學(xué)習(xí)/研究

 Foxmouse 2012-08-02

Erlang---啟動參數(shù)學(xué)習(xí)/研究

分類: Erlang 205人閱讀 評論(0) 收藏 舉報

erlang啟動參數(shù)有3種:emulator flags, flagsplain arguments。

emulator flags 是以“+”開頭的,用來控制模擬器的行為,附送一個非常實用的例子:

相關(guān)閱讀:http://www./Linux/2011-07/39156.htm

  1. C:\>erl +V  
  2. Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.2  

flags 是以“-”開頭的, 是erlang運行時系統(tǒng)的參數(shù),可以用init:get_argument/1獲得。

plain arguments 普通參數(shù),在第一個flag參數(shù)前,或在-- flag之后,-extra后的參數(shù)都是普通參數(shù)。

  1. </pre><p><span class="bold_code">erl +W w -sname arnie +R 9 -s my_init -extra +bertie</span></p><p><strong></strong> </p><pre class="plain" name="code">% erl +W w -sname arnie +R 9 -s my_init -extra +bertie  
  2. (arnie@host)1> init:get_argument(sname).  
  3. {ok,[["arnie"]]}  
  4. (arnie@host)2> init:get_plain_arguments().  
  5. ["+bertie"]  

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 把應(yīng)用中的Par參數(shù)設(shè)置為值Val;

-args_file FileName 從文件FileName讀取命令行參數(shù);

-boot File  指定啟動使用的boot文件,默認(rèn)是$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 ...  不推薦使用了,應(yīng)該使用erlc;

-config Config 指定配置文件,這個是很有用的,比如在Programming Erlang里,就用到 erl -boot start_sasl -config elog3,其中文件全名是elog3.config,內(nèi)容如下:
  1. %% rotating log and minimal tty  
  2. [{sasl,[  
  3.   {sasl_error_logger,false},  
  4.   %%define the parameters of the rotating log  
  5.   %%the log file directory  
  6.   {error_logger_mf_dir,"D:/erlang/otpexample/error_logs"},  
  7.   %% # bytes per log file  
  8.   {error_logger_mf_maxbytes,10485760}, %10 MB  
  9.   %%maximum number of logfiles  
  10.   {error_logger_mf_maxfiles,10}  
  11.   ]}].  


配置的含義,請參考相關(guān)書籍;

-connect_all false 貌似不常用;

-cookie Cookie 被-setcookie代替了;

-detached 脫離console,跑后臺erlang進(jìn)程用的,看做"nohup **** &";

-emu_args debug用的,打印出實際傳給模擬器的值;

-env Variable Value 設(shè)置操作系統(tǒng)環(huán)境變量用的,比如:

  1. erl -env DISPLAY gin:0  

-eval Expr(init flag)  表達(dá)式做啟動參數(shù),比如(下列代碼在本機(jī)執(zhí)行出錯,以后再研究):

  1. % erl -eval '{X,Y,Z}' = now(), random:seed(X,Y,Z).'  
-extra(init flag)  后面跟的都是普通參數(shù);
 -heart 啟動心跳監(jiān)控器;
-hidden 設(shè)置為隱藏節(jié)點,該節(jié)點會連接集群的所有節(jié)點,但是在其他節(jié)點執(zhí)行node/0,不會列出它;
-hosts Hosts erlang運行在那些服務(wù)器的IP地址;

-id Id 給erlang進(jìn)程設(shè)置一個id,一般和-sname 和 -name一起用;

 

-init_debug 在啟動/初始化erlang進(jìn)程時,打印debug信息;
-instr
-loader Loadererl_prim_loader指定裝載模塊的方法,相當(dāng)于java里指定classloader;
-make
-man Module
-mode interactive | embedded
-name Name 給一個erlang節(jié)點/進(jìn)程設(shè)置一個名稱
-noinput
-noshell
-nostick

-pa Dir1 Dir2 ...

-pz Dir1 Dir2 ...
-remsh Node 遠(yuǎn)程啟動一個erlang節(jié)點,比如(當(dāng)然RSA神馬的,要先搞定):
  1. erl -sname node1 -remsh node2@machine2.example.com   
 
-rsh Program 遠(yuǎn)程啟動一個slave erlang節(jié)點,這里 http://www./Linux/2011-07/39157p3.htm 有一個例子;
-run Mod [Func [Arg1, Arg2, ...]]
-s Mod [Func [Arg1, Arg2, ...]]
-setcookie Cookie 給節(jié)點設(shè)置cookie,比如:
  1. erl -setcookie SFEWRG34AFDSGAFG35235 -name nodex  

并且它是運行時可以改的:

  1. erlang:set_cookie(node(), 'SFEWRG34AFDSGAFG35235').  


-shutdown_time Time 關(guān)閉節(jié)點需要的時間,如果超過,就直接kill,默認(rèn)是infinity;

-sname Name 給節(jié)點設(shè)置名字,和-name類似,不過它的結(jié)果是:Name@Host ;
-smp [enable|auto|disable] 是否需要支持smp,默認(rèn)應(yīng)該是enable的,smp的好處見這里 http://www./Linux/2011-07/39157p2.htm;
-version(emulator flag)
 

Emulator Flags

+a size 一般實用默認(rèn)值就可以了。

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 the driver_async() functionality. Note that the value passed is only a suggestion, and it might even be ignored on some platforms.

+A size 一步線程池的大小,默認(rèn)是0;比如執(zhí)行werl +A 1,會看到:

  1. Erlang R14B01 (erts-5.8.2) [smp:2:2] [rq:2] [async-threads:1]  
  2.   
  3. Eshell V5.8.2  (abort with ^G)  


+B [c | d | i]

+c

+d 默認(rèn)情況下erlang進(jìn)程遇到內(nèi)部錯誤,比如oom,會產(chǎn)生一個crash dump和core dump,+d讓節(jié)點只產(chǎn)生后者;

+e Number ETS表的最大數(shù)量;
+ec強(qiáng)制ETS表啟動壓縮,一般不用的;
+fnl 如果文件名使用了ISO-latin-1編碼;
+fnu如果文件名使用了UTF-8 編碼;

+fna 和當(dāng)前操作系統(tǒng)一致;

+hms Size 指定erlang進(jìn)程的默認(rèn)(最?。浚┒褍?nèi)存大?。ㄟ@個應(yīng)該不用太擔(dān)心);
+hmbs Size 進(jìn)程默認(rèn)二進(jìn)制虛擬內(nèi)存堆大??;
+K true | false 是否開啟kernel poll,就是epoll;
+l
+MFlag Value

+P Number erlang節(jié)點系統(tǒng)的最大并發(fā)進(jìn)程數(shù);

+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


關(guān)于Erlang和SMP的一些說明

by.Kenneth Erlang/OTP team, Ericsson
譯:ShiningRay

以下是一些Erlang SMP實現(xiàn)的細(xì)節(jié)和與性能與伸縮性相關(guān)一些簡單介紹。

幾周之內(nèi)還有有一個關(guān)于多核如何運作以及未來如何發(fā)展的更詳細(xì)的介紹。我打算將一些內(nèi)容放在我的報告中,將于9月27日的ICFP2008,Erlang Workshop在Victoria BC展示給大家。

沒有SMP支持的Erlang VM只有1個運行在主處理線程中的調(diào)度器。該調(diào)度器從運行隊列(run-queue)中取出可以運行的Erlang進(jìn)程以及IO任務(wù),而且因為只有一個線程訪問他們所以無須鎖定任何數(shù)據(jù)。

而帶有SMP支持的Erlang VM可以有一個或多個調(diào)度器,每個運行在一個線程中。調(diào)度器從同一個公共運行隊列中取出可運行的Erlang進(jìn)程和IO任務(wù)。在SMP VM中所有的共享數(shù)據(jù)結(jié)構(gòu)都會由鎖進(jìn)行保護(hù),運行隊列就是這樣一個由鎖保護(hù)的數(shù)據(jù)結(jié)構(gòu)。

從OTP R12B開始,如果操作系統(tǒng)報告有多于1個的CPU(或者核心)VM的SMP版本會自動啟動,并且根據(jù)CPU或者核心的數(shù)量啟動同樣數(shù)量的調(diào)度器。

你可以從“erl”命令打印出來的第一行看到它選擇了哪些參數(shù)。例如:


Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] …..

其中“[smp:4]”表示SMP VM運行了4個調(diào)度器。

默認(rèn)值可以用“-smp [enable|disable|auto]”來替換,auto是默認(rèn)的。如果smp被啟用了(-smp enable),要設(shè)置調(diào)度器的數(shù)量可以使用“+S Number”其中Number是調(diào)度器的數(shù)量(1到1024)

注意1:運行多于CPU或核心總數(shù)的調(diào)度器不會有任何提升。

注意2:在某些操作系統(tǒng)中一個進(jìn)程可使用的CPU或者核心的數(shù)量可以被限制。例如,在 Linux中,命令“taskset”就可以實現(xiàn)這個功能。Erlang VM目前還只能探測CPU或者核心的總數(shù),不會考慮“taskset”所設(shè)置的掩碼。正因如此,例如可能會出現(xiàn)(已經(jīng)出現(xiàn)過了)即使Erlang VM運行了4個調(diào)度器,也只使用了2個核心。OS會進(jìn)行限制因為它要考慮“taskset”所設(shè)置的掩碼。

每個Erlang VM的調(diào)度器都運行于一個OS線程上,是OS來決定線程是否執(zhí)行在不同的核心上。一般來說OS會很好地處理這個問題并且會保證線程在執(zhí)行期間運行于同一個核心上。

Erlang進(jìn)程會被不同的調(diào)度器運行,因為他們是從一個公共運行隊列中被取出,由首先可用的調(diào)度器運行。

性能和伸縮性

只有一個調(diào)度器的SMP VM要比非SMP的VM稍微慢那么一點點。SMP VM內(nèi)部需要用到各種鎖,不過只要不存在鎖的爭用,那么由鎖引起的開銷不會非常大(就是鎖爭用上面需要花時間)。這也解釋了為何在某些情況下,運行多個只 有一個調(diào)度器的SMP VM要比包含多個調(diào)度器的單一SMP VM更加高效。當(dāng)然運行多個VM要求應(yīng)用可以按照多個并行任務(wù)的方式運行并且之間沒有或者幾乎不通訊。

一個程序是否能在多核上的SMP VM中良好地進(jìn)行提升很大程度上取決于程序的性質(zhì),某些程序可以保持線性提升至8核甚至16核,同時其他某些程序基本不能提升,連2核都不行。實際應(yīng)用中很多程序都能在主流市場的核心數(shù)上得到提升,見下文。

若并行的持續(xù)“通話”由每個核心一個或多個Erlang進(jìn)程來表示,實際的支持大量通 話的電信產(chǎn)品已經(jīng)先現(xiàn)出在雙核和四核處理器上不俗的伸縮性。注意,這些產(chǎn)品是在SMP VM和多核處理器出現(xiàn)很久以前按照普通的Erlang風(fēng)格來寫的,他們也能無須任何修改甚至不需重新編譯代碼就能從Erlang SMP VM中獲益。

SMP性能得到持續(xù)改進(jìn)

SMP實現(xiàn)正被不斷改進(jìn)以便能得到更好的性能和伸縮性。在每個服務(wù)發(fā)布版R12B-1,2,3,4,5…,R13B等等中,你都能發(fā)現(xiàn)新的優(yōu)化。

一些已知的瓶頸

單一的常見運行隊列隨著CPU或核心的數(shù)量的增加會成為一個顯著的瓶頸。

這從4核開始往上就會顯現(xiàn)出來,不過4核仍然可以為多數(shù)應(yīng)用程序提供不錯的性能。我們正在從事一個每個調(diào)度器一個運行隊列的解決方法作為目前最重要的改進(jìn)。

Ets表格會引入鎖。在R12B-4之前在每次對一個ets-table的訪問中會用 到兩個鎖,但是在R12B-4中meta-table的鎖被優(yōu)化過,可以顯著減少爭用(前面已經(jīng)提到爭用是有很大代價的)。如果很多Erlang進(jìn)程訪問 同一個表格,就會有很多鎖爭用造成性能降低尤其當(dāng)這些進(jìn)程主要工作是訪問ets-table。鎖存在于表級而非記錄級。注意!這也會影響到Mnesia因 為Mnesia用到了很多ets-table。

我們關(guān)于SMP的策略

當(dāng)我們開始實現(xiàn)SMP VM的最初,我們就確定了策略:“首先讓它可以運行,然后測量,然后優(yōu)化”。自從2006年五月我們發(fā)布了第一個穩(wěn)定的SMP VM(R11B)以來,我們一直遵循著這個策略。

還有更多已知的東西可以改進(jìn),我們會按照性能的收益大小先后各個擊破。

我們將主要的精力放在多核(大于4)上更好的連續(xù)伸縮性上。

卓越典范

即使SMP系統(tǒng)有還有一些已知的瓶頸不過已經(jīng)有不錯的整體性能和伸縮性,同時我相信在讓程序員利用多核機(jī)器事半功倍方面,我們是一個卓越的典范。



Erlang集群節(jié)點集合的啟動

一、配置SSH客戶端:無需密碼的連接
1. SSH客戶端RSA key授權(quán)
i). 生成SSH RSA key:
ssh-keygen -t rsa
全回車取缺省,將在~/.ssh目錄下將生成id_rsa和id_rsa.pub倆文件

ii) 將生產(chǎn)的公共RSA key拷貝到目標(biāo)機(jī)器上:

a).將id_rsa.pub文件拷貝到目標(biāo)機(jī)器上:
scp ~/.ssh/id_rsa.pub userid@ssh2_server:id_rsa.pub

b). ssh登陸目標(biāo)機(jī)器,在目標(biāo)機(jī)器的~/.ssh目錄下生成文件內(nèi)容:
cat id_rsa.pub >>$HOME/.ssh/authorized_keys
刪掉id_rsa.pub

以上兩步命令可以用一條命令實現(xiàn):
ssh-copy-id ssh2-server

本質(zhì)上都是把master上生成的id_rsa.pub文件拷貝到slave機(jī)器./ssh目錄下,同時改名為authorized_keys
這一步完成后,從master機(jī)器上登錄slave機(jī)器直接
ssh slave
就行了,不用輸入密碼。

同樣的,slave到master也得這樣:不用輸入密碼直接ssh

集群內(nèi)所有的機(jī)器相互之間都要這樣實現(xiàn)無密碼輸入就能直接ssh

2. 在啟動master節(jié)點的那個機(jī)器上,啟動SSH-agent軟件并添加你的用戶ID
這樣每次連接時就不需要passphrase了,辦法是讓ssh-agent記住你
i) 首先確認(rèn)你的機(jī)器上有ssh-agent在運行(一般都沒有)
ps aux|grep ssh-agent

查看ssh-agent運行在當(dāng)前窗口管理器(或者shell)下
pstree

如果不是,在shell中創(chuàng)建一個ssh-agent會話:
ssh-agent screen
這回啟動了一個帶ssh-agent的screen會話窗口,以后這個screen控制臺內(nèi)的所有命令都要經(jīng)過ssh-agent

ii) 添加你的ID
ssh-add

你可以查看當(dāng)前ssh-agent中已添加的ID
ssh-add -l
也可以刪除一個ID
ssh-add -d


3. 集群的路由進(jìn)出
當(dāng)建立集群后,經(jīng)常需要訪問作為網(wǎng)關(guān)(或者負(fù)載均衡器)的前端計算機(jī)。要訪問其它節(jié)點,你需要告訴作為網(wǎng)管的機(jī)器將你的請求路由到機(jī)器節(jié)點中。

例如,假設(shè)你的網(wǎng)關(guān)是80.65.232.137??刂朴玫挠嬎銠C(jī)在集群之外,這個機(jī)器是操作員用于控制集群的計算機(jī)。集群內(nèi)部網(wǎng)絡(luò)是192.0.0.0。在你的客戶計算機(jī)上,啟動命令:
route add -net 192.0.0.0 gw 80.65.232.137 netmask 255.255.255.0
這個命令需要確保網(wǎng)關(guān)計算機(jī)上IP forwarding 可用

要確保正確的路由,可以維護(hù)一個常用的/etc/hosts文件,該文件中記錄了你的集群中的所有計算機(jī),例子中,集群有7臺計算機(jī)組成.
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

也可以設(shè)置DNS服務(wù)器,但對小網(wǎng)絡(luò)來說/etc/hosts文件就已經(jīng)足夠了


二、啟動Erlang master節(jié)點并建立Erlang集群
一旦通過SSH連接集群不再提示輸入密碼后建立一個Erlang集群將變得非常容易。

1. 啟動Erlang master節(jié)點的模塊:
Erlang代碼
  1. -module(cluster).   
  2. -export([slaves/1]).   
  3.   
  4. %% Argument:   
  5. %% Hosts: List of hostname (string)   
  6. slaves([]) ->   
  7. ok;   
  8. slaves([Host|Hosts]) ->   
  9.   Args = erl_system_args(),   
  10.   NodeName = "cluster",   
  11.   {ok, Node} = slave:start_link(Host, NodeName, Args),   
  12.   io:format("Erlang node started = [~p]~n", [Node]),   
  13.   slaves(Hosts).   
  14.   
  15. erl_system_args()->   
  16.   Shared = case init:get_argument(shared) of   
  17.     error -> " ";   
  18.     {ok,[[]]} -> " -shared "  
  19.   end,   
  20.   lists:append(["-rsh ssh -setcookie ",   
  21.                 atom_to_list(erlang:get_cookie()),   
  22.                 Shared, " +Mea r10b "]).   
  23.   
  24. %% Do not forget to start erlang with a command like:   
  25. %% erl -rsh ssh -sname clustmaster 

啟動master

  1. mremond@controler:~/cvs/cluster$ erl -rsh ssh -sname demo   
  2. Erlang (BEAM) emulator version 5.3 [source] [hipe]   
  3. Eshell V5.3 (abort with ^G)   
  4. (demo@controler)1> cluster:slaves(["gateway""yaws1""yaws2""mnesia1""mnesia2""eddieware"]).   
  5. Erlang node started = [cluster@gateway]   
  6. Erlang node started = [cluster@yaws1]   
  7. Erlang node started = [cluster@yaws2]   
  8. Erlang node started = [cluster@mnesia1]   
  9. Erlang node started = [cluster@mnesia2]   
  10. Erlang node started = [cluster@eddieware]   
  11. ok  

這里的要點是:集群間所有節(jié)點(至少是master對所有slave節(jié)點)之間都要能實現(xiàn)“相互”無密碼輸入的ssh登錄

我想無密碼輸入的原理可能是:
機(jī)器A生成RSA key,有一個公開的密鑰,別的機(jī)器B要想無密碼ssh這同機(jī)器,B必須在本地?fù)碛蠥的公開密鑰

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多