檢視原始碼 erl

啟動 Erlang 執行時系統。

描述

erl 程式啟動一個 Erlang 執行時系統。確切的細節(例如,erl 是一個腳本還是程式,以及它呼叫哪些其他程式)取決於系統。

注意

如果您在 Windows 上使用 Erlang/OTP 25 或更早版本,並且想要啟動具有完整 shell 支援的 Erlang 系統,則應使用 werl.exe。 有關如何執行此操作的詳細資訊,請參閱 Erlang/OTP 25 文件

erl <引數>

啟動一個 Erlang 執行時系統。

引數可以分為模擬器標誌標誌純引數

  • 任何以字元 + 開頭的引數都被解釋為模擬器標誌

    顧名思義,模擬器標誌控制模擬器的行為。

  • 任何以字元 -(連字符)開頭的引數都被解釋為標誌,該標誌將被傳遞給執行時系統的 Erlang 部分,更具體地說是傳遞給 init 系統程序,請參閱 init

    init 程序本身會解釋其中一些標誌,即init 標誌。它還會儲存任何剩餘的標誌,即使用者標誌。後者可以透過呼叫 init:get_argument/1 來擷取。

    存在少數 "-" 標誌,這些標誌現在實際上是模擬器標誌,請參閱下面的描述。

  • 純引數不會以任何方式解釋。它們也由 init 程序儲存,並且可以透過呼叫 init:get_plain_arguments/0 來擷取。純引數可以在第一個標誌之前或 -- 標誌之後出現。此外,-extra 標誌會使之後的所有內容都變成純引數。

範例

% erl +W w -sname arnie +R 9 -s my_init -extra +bertie
(arnie@host)1> init:get_argument(sname).
{ok,[["arnie"]]}
(arnie@host)2> init:get_plain_arguments().
["+bertie"]

這裡 +W w+R 9 是模擬器標誌。-s my_init 是一個 init 標誌,由 init 解釋。-sname arnie 是一個使用者標誌,由 init 儲存。它由 Kernel 讀取,並導致 Erlang 執行時系統成為分散式的。最後,-extra 之後的所有內容(即 +bertie)都被視為純引數。

% erl -myflag 1
1> init:get_argument(myflag).
{ok,[["1"]]}
2> init:get_plain_arguments().
[]

在這裡,使用者標誌 -myflag 1 被傳遞給 init 程序並由其儲存。它是一個使用者定義的標誌,推測是由一些使用者定義的應用程式使用。

標誌

在以下清單中,init 標誌標記為「(init 標誌)」。除非另有說明,否則所有其他標誌都是使用者標誌,其值可以透過呼叫 init:get_argument/1 來擷取。請注意,使用者標誌的清單並非詳盡無遺,可能會有更多應用程式特定的標誌,這些標誌會在相應的應用程式文件中描述。

  • -- (init 標誌) - -- 後面的所有內容,直到下一個標誌 (-flag+flag) 都被視為純引數,可以使用 init:get_plain_arguments/0 擷取。

  • -Application Par Val - 將應用程式 Application 的應用程式組態參數 Par 設定為值 Val;請參閱 app(4)application

  • -args_file FileName - 從檔案 FileName 讀取命令列引數。 從檔案讀取的引數將取代結果命令列上的標誌「-args_file FileName」。

    檔案 FileName 應為純文字檔案,並且可以包含註解和命令列引數。 註解以 # 字元開頭,並持續到下一個換行符號。 反斜線 (\) 用作引號字元。 允許 erl 接受的所有命令列引數,也包括標誌 -args_file FileName。 但是,請小心不要在包含標誌 -args_file 的檔案之間造成循環依賴。

    標誌 -extra 的處理方式很特殊。 它的範圍在檔案結尾處結束。 -extra 標誌之後的引數會移到命令列上的 -extra 區段中,也就是 -extra 標誌後面的命令列結尾。

  • -async_shell_start - 在系統開機程序完成之前(Erlang/OTP 5.4 及更高版本),初始 Erlang shell 不會讀取使用者輸入。 這個標誌會停用啟動同步功能,並讓 shell 與系統的其餘部分並行啟動。

  • -boot File - 指定用於啟動系統的開機檔案的名稱 File.boot;請參閱 init。除非 File 包含絕對路徑,否則系統會在目前目錄和 $ROOT/bin 目錄中搜尋 File.boot

    預設為 $ROOT/bin/start.boot

  • -boot_var Var Dir - 如果開機腳本包含 $ROOT 以外的路徑變數 Var,則此變數會展開為 Dir。 當應用程式安裝在 $ROOT/lib 以外的另一個目錄時使用;請參閱 SASL 中的 systools:make_script/1,2

  • -code_path_cache - 啟用程式碼伺服器的程式碼路徑快取;請參閱 code

  • -compile Mod1 Mod2 ... - 編譯指定的模組,然後終止(如果某些檔案的編譯未成功,則會以非零退出碼終止)。 隱含 -noinput

    不建議使用;請改用 erlc

  • -config Config [Config ...] - 指定一個或多個組態檔案的名稱 Config.config,用於組態應用程式;請參閱 app(4)application。有關組態格式以及讀取組態參數的順序的說明,請參閱 組態檔案格式的文件。

  • -configfd FD [FD ...] - 指定一個或多個檔案描述符(從此處開始稱為組態檔案描述符)的名稱,其中包含應用程式的組態資料;請參閱 app(4)application。有關組態格式以及讀取組態參數的順序的說明,請參閱 組態檔案格式的文件。

    將讀取組態檔案描述符的內容直到結束,然後關閉它。

    組態檔案描述符的內容會被儲存,以便在呼叫 init:restart/0init:restart/1 時可以重複使用。

    參數 -configfd 0 隱含 -noinput

    注意

    不建議將檔案描述符 1(標準輸出)和 2(標準錯誤)與 -configfd 一起使用,因為這些檔案描述符通常用於將資訊列印到程式執行的主控台中。

    範例 (Unix shell)

    $ erl \
    -noshell \
    -configfd 3 \
    -eval \
    'io:format("~p~n",[application:get_env(kernel, logger_level)]),erlang:halt()' 3< \
    <(echo '[{kernel, [{logger_level, warning}]}].')
    {ok,warning}
    $ echo '[{kernel, [{logger_level, warning}]}].' > test1.config
    $ echo '[{kernel, [{logger_level, error}]}].' > test2.config
    $ erl \
    -noshell \
    -configfd 3 \
    -configfd 4 \
    -eval \
    'io:format("~p~n",[application:get_env(kernel, logger_level)]),erlang:halt()' \
    3< test1.config 4< test2.config
    {ok,error}
  • -connect_all false - 此標誌已棄用,並已由 kernel 應用程式參數 connect_all 取代。

  • -cookie Cookie - 無任何作用且是 -setcookie 的常見拼寫錯誤的過時標誌。 請改用 -setcookie

  • -detached - 從系統主控台分離啟動 Erlang 執行時系統。 適用於執行守護程序和背景程序。 隱含 -noinput

  • -disable-feature feature - 停用執行時系統中的功能 feature。 特殊功能 all 可用於停用所有非永久功能。

  • -dist_listen true|false - 指定此節點是否應該監聽傳入的分散式連線。 預設情況下,節點將監聽傳入的連線。 將此選項設定為 false 隱含 -hidden

  • -emu_args - 適用於偵錯。 列印傳送到模擬器的引數。

  • -emu_flavor emu|jit|smp - 啟動不同風格的模擬器。 通常只有一種風格可用,可以透過建置特定的風格來新增更多風格。 目前可用的風格有:emujitsmp 風格是目前預設風格的別名。 您可以將此標誌與 --emu_type 組合使用。 您可以使用 erlang:system_info(emu_flavor) 在執行時取得目前的風格。(必須建置具有此風格的模擬器。您可以在 Erlang/OTP 原始碼儲存庫中執行 make FLAVOR=$FLAVOR 來建置特定的風格。)

  • -emu_type Type - 啟動不同類型的模擬器。 例如,若要啟動鎖定計數器模擬器,請使用 -emu_type lcnt。 您可以使用 erlang:system_info(build_type) 在執行時取得目前的類型。(必須已經建置此類型的模擬器。使用 configure 選項 --enable-lock-counter 來建置鎖定計數器模擬器。)

  • -enable-feature feature - 啟用執行時期系統中的 功能 feature。特殊功能 all 可用於啟用所有功能。

  • -env Variable Value - 將主機作業系統環境變數 Variable 設定為 Erlang 執行時期系統的值 Value。範例:

    % erl -env DISPLAY gin:0

    在此範例中,Erlang 執行時期系統啟動時,環境變數 DISPLAY 設定為 gin:0

  • -epmd_module Module - 此標記已過時,並已由 kernel 應用程式參數 epmd_module 取代。

  • -erl_epmd_port Port - 此標記已過時,並已由 kernel 應用程式參數 erl_epmd_node_listen_port 取代。

  • -eval Expr (init 標記) - 使 init 評估表達式 Expr;請參閱 init

  • -extra (init 標記) - -extra 後面的所有內容都被視為純參數,可以使用 init:get_plain_arguments/0 擷取。

  • -heart - 啟動 Erlang 執行時期系統的心跳監控;請參閱 heart

  • -hidden - 如果 Erlang 執行時期系統以分散式節點執行,則將其啟動為隱藏節點。隱藏節點始終與除同一全域群組中的節點之外的所有其他節點建立隱藏連線。隱藏連線不會在任何已連線節點上發佈,也就是說,任何已連線節點都不是另一個節點上 nodes/0 的結果的一部分。另請參閱隱藏全域群組;global_group

  • -hosts Hosts - 指定執行 Erlang 啟動伺服器的主機 IP 位址,請參閱 erl_boot_server。如果存在標記 -loader inet,則此標記為必要。

    IP 位址必須以標準形式指定 (四個十進制數字,以句點分隔,例如 "150.236.20.74")。主機名稱不可接受,但可以使用廣播位址 (最好限制在區域網路內)。

  • -id Id - 指定 Erlang 執行時期系統的識別碼。如果以分散式節點執行,則 Id 必須與標記 -sname-name 一起提供的名稱相同。

  • -init_debug - 使 init 在解釋啟動腳本時寫入一些偵錯資訊。

  • -instr (模擬器標記) - 選取一個經過檢測的 Erlang 執行時期系統 (虛擬機) 來執行,而不是普通的執行時期系統。當執行經過檢測的執行時期系統時,可以使用 instrument 模組取得並分析一些資源使用資料。在功能上,它的行為與普通的 Erlang 執行時期系統完全相同。

  • -loader Loader - 指定 erl_prim_loader 將 Erlang 模組載入系統的方法;請參閱 erl_prim_loader。支援兩種 Loader 方法:

    • efile,表示使用本機檔案系統,這是預設值。
    • inet,表示使用另一部機器上的啟動伺服器。還必須指定標記 -id-hosts-setcookie

    如果 Loader 是其他值,則會啟動使用者提供的 Loader 連接埠程式。

  • -make - 使 Erlang 執行時期系統在目前工作目錄中調用 make:all(),然後終止;請參閱 make。隱含 -noinput

  • -man Module - 顯示 Erlang 模組 Module 的手冊頁。僅在 Unix 上支援。

  • -mode interactive | embedded - 如果執行時期系統在 interactive 模式下執行 (預設值),則會在第一次參考時自動載入模組。在 embedded 模式下,模組不會自動載入。當啟動腳本預先載入所有模組時,建議使用後者,就像在 OTP 版本中通常發生的情況一樣。請參閱 code

  • -name Name - 將 Erlang 執行時期系統設為分散式節點。此標記會調用使節點變成分散式節點所需的所有網路伺服器;請參閱 net_kernel。它還確保 epmd 在 Erlang 啟動之前在目前主機上執行 (請參閱 epmd(1)-start_epmd 選項),並且已設定神奇 Cookie (請參閱 -setcookie)。

    節點名稱將為 Name@Host,其中 Host 是目前主機的完整主機名稱。對於短名稱,請改用標記 -sname

    如果 Name 設定為 *undefined*,則節點將在經過最佳化的特殊模式下啟動,成為另一個節點的暫時用戶端。然後,節點會從它連線的第一個節點請求動態節點名稱。請在 動態節點名稱中閱讀更多資訊。

    警告

    啟動分散式節點而不指定 -proto_dist inet_tls 會使節點暴露於攻擊,這可能會使攻擊者完全存取節點,進而存取叢集。當使用不安全的分散式節點時,請確保網路已設定為將潛在攻擊者拒之門外。

  • -no_epmd - 指定分散式節點完全不需要 epmd

    此選項確保 Erlang 執行時期系統不會啟動 epmd,也不會啟動用於分散的 erl_epmd 程序。

    只有在 Erlang 使用 -proto_dist 選項以分散式節點啟動時,此選項才有效,該選項使用不依賴 epmd 進行節點註冊和探索的 Erlang 分散替代通訊協定。如需更多資訊,請參閱 如何實作 Erlang 分散的替代載體

  • -noinput - 確保 Erlang 執行時期系統永遠不會嘗試讀取任何輸入。隱含 -noshell

  • -noshell - 啟動不帶 Shell 的 Erlang 執行時期系統。此標記使 Erlang 執行時期系統可以作為一系列 Unix 管線中的元件。

  • -nostick - 停用 Erlang 程式碼伺服器的黏性目錄功能;請參閱 code

  • -oldshell - 從 Erlang/OTP 3.3 調用舊的 Erlang Shell。仍然可以使用舊的 Shell。

  • -pa Dir1 Dir2 ... - 將指定的目錄新增至程式碼路徑的開頭,類似於 code:add_pathsa/1。請注意,在產生的路徑中,給定目錄的順序將會反轉。

    作為 -pa 的替代方案,如果要將多個目錄前置到程式碼路徑,且這些目錄具有共同的父目錄,則可以在環境變數 ERL_LIBS 中指定該父目錄;請參閱 code

  • -pz Dir1 Dir2 ... - 將指定的目錄新增至程式碼路徑的結尾,類似於 code:add_pathsz/1;請參閱 code

  • -path Dir1 Dir2 ... - 取代啟動腳本中指定的路徑;請參閱 script(4)

  • -proto_dist Proto - 指定 Erlang 分散的通訊協定

    • inet_tcp - IPv4 上的 TCP (預設)

    • inet_tls - 通過 TLS/SSL 進行分散,請參閱 使用 SSL 進行 Erlang 分散 使用者指南,以了解如何設定安全分散式節點的詳細資訊。

    • inet6_tcp - IPv6 上的 TCP

    例如,若要啟動 IPv6 分散式節點:

    % erl -name test@ipv6node.example.com -proto_dist inet6_tcp
  • -remsh Node - 啟動 Erlang,其中遠端 Shell 連線到 Node

    如果未指定 -name-sname,則會使用 -sname undefined 啟動節點。如果 Node 未包含主機名稱,則會自動從 -name-sname 中取得。

    注意

    在 OTP-23 之前,使用者*需要*提供有效的 -sname-name-remsh 才能運作。如果目標節點未執行 OTP-23 或更高版本,情況仍然如此。

    注意

    連線節點需要具有終端機模擬功能的正確 Shell。這表示 UNIX 使用者必須使用具有終端機功能的 Erlang 編譯,而且在 Erlang/OTP 25 之前,Windows 使用者必須使用 werl

  • -rsh Program - 指定用於在遠端主機上啟動從屬節點的 ssh 替代方案;請參閱 slave

  • -S Mod [Func [Arg1, Arg2, ...]] (init 標記) - 使 init 呼叫指定的函式。Func 預設為 start。該函式假定為具有引數 1 的函式,並將清單 [Arg1,Arg2,...] 作為引數,如果沒有傳遞任何引數,則會傳遞空清單。在此選項之後發生的所有其他引數都會以字串形式傳遞至指定的函式。隱含 -noshell。請參閱 init

  • -run Mod [Func [Arg1, Arg2, ...]] (init 標記) - 使 init 呼叫指定的函式。Func 預設為 start。如果未提供任何引數,則假定函式具有引數 0。否則,假定為具有引數 1 的函式,並將清單 [Arg1,Arg2,...] 作為引數。所有引數都會以字串形式傳遞。請參閱 init

  • -s Mod [Func [Arg1, Arg2, ...]] (init 標記) - 使 init 呼叫指定的函式。Func 預設為 start。如果未提供任何引數,則假定函式具有引數 0。否則,假定為具有引數 1 的函式,並將清單 [Arg1,Arg2,...] 作為引數。所有引數都會以原子形式傳遞。請參閱 init

  • -setcookie Cookie - 將節點的神奇 Cookie 設定為 Cookie;請參閱 erlang:set_cookie/1。請參閱 Erlang 參考手冊中的 分散式 Erlang 一節,以了解更多詳細資訊。

  • -setcookie Node Cookie - 將 Node 的神奇 Cookie 設定為 Cookie;請參閱 erlang:set_cookie/2

  • -shutdown_time Time - 指定 init 程序允許花費多少時間 (以毫秒為單位) 來關閉系統中的 Erlang 應用程式。如果經過 Time 毫秒,所有仍然存在的程序都會被終止。預設值為 infinity

  • -sname Name - 使 Erlang 運行時系統成為一個分散式節點,類似於 -name,但節點名稱 Name@Host 的主機名稱部分將會是簡短名稱,而不是完整合格的名稱。

    如果網域名稱系統 (DNS) 沒有運行,這有時是運行分散式 Erlang 的唯一方法。使用 -sname 標誌運行的節點與使用 -name 標誌運行的節點之間無法進行通訊,因為節點名稱在分散式 Erlang 系統中必須是唯一的。

    如果 Name 設定為 *undefined*,則節點將在經過最佳化的特殊模式下啟動,成為另一個節點的暫時用戶端。然後,節點會從它連線的第一個節點請求動態節點名稱。請在 動態節點名稱中閱讀更多資訊。

    警告

    啟動分散式節點而不指定 -proto_dist inet_tls 會使節點暴露於攻擊,這可能會使攻擊者完全存取節點,進而存取叢集。當使用不安全的分散式節點時,請確保網路已設定為將潛在攻擊者拒之門外。

  • -start_epmd true | false - 指定 Erlang 是否應該在啟動時啟動 epmd。預設情況下,此值為 true,但如果您希望手動啟動 epmd,請將此值設定為 false

    這僅在 Erlang 作為分散式節點啟動時適用,也就是說,如果指定了 -name-sname。否則,即使給定 -start_epmd true,也不會啟動 epmd。

    請注意,如果 epmd 沒有運行,分散式節點將無法啟動。

  • -version (模擬器標誌) - 使模擬器列印其版本號碼。與 erl +V 相同。

模擬器標誌

erl 調用 Erlang 模擬器 (虛擬機器) 的程式碼,該模擬器支援以下標誌

  • +a size - 非同步執行緒池中執行緒的建議堆疊大小,以千字為單位。有效範圍為 16-8192 千字。預設建議堆疊大小為 16 千字,也就是在 32 位元架構上為 64 KB。選擇此較小的預設大小是因為非同步執行緒的數量可能很大。預設大小對於 Erlang/OTP 提供的驅動程式來說已足夠,但對於使用 driver_async() 功能的其他動態連結驅動程式來說,可能不夠大。請注意,傳遞的值僅為建議值,甚至在某些平台上可能會被忽略。

  • +A size - 設定非同步執行緒池中的執行緒數量。有效範圍為 1-1024。連結式驅動程式使用非同步執行緒池來處理可能需要很長時間的工作。自 OTP 21 以來,預設的 Erlang/OTP 發行版包含很少使用非同步執行緒池的連結式驅動程式。它們中的大多數已遷移到髒 IO 排程器。預設值為 1。

  • +B [c | d | i] - 選項 c 使 Ctrl-C 中斷目前的 Shell,而不是調用模擬器中斷處理常式。選項 d (與指定 +B 而不使用額外選項相同) 會停用中斷處理常式。選項 i 使模擬器忽略任何中斷訊號。

    如果在 Unix 上將選項 coldshell 一起使用,則 Ctrl-C 將會重新啟動 Shell 程序,而不是中斷它。

  • +c true | false - 啟用或停用 時間校正

    • true - 啟用時間校正。如果特定平台上支援時間校正,則此為預設值。

    • false - 停用時間校正。

    為了向後相容,可以省略布林值。這會被解釋為 +c false

  • +C no_time_warp | single_time_warp | multi_time_warp - 設定 時間扭曲模式

  • +d - 如果模擬器偵測到內部錯誤 (或記憶體不足),依預設,它會產生當機傾印和核心傾印。但是,由於程序堆積的內容會被當機傾印的產生所破壞,因此核心傾印並不是很有用。

    選項 +d 指示模擬器,如果偵測到內部錯誤,則僅產生核心傾印,而不產生當機傾印。

    使用字串引數呼叫 erlang:halt/1 仍會產生當機傾印。在 Unix 系統上,向模擬器程序傳送 SIGUSR1 訊號也會強制產生當機傾印。

  • +dcg DecentralizedCounterGroupsLimit - 限制 Erlang 執行時系統中針對更新操作最佳化的分散式計數器所使用的分散式計數器群組數量。依預設,此限制為 256。

    當排程器數量小於或等於限制時,每個排程器都有自己的群組。當排程器數量大於群組限制時,排程器會共用群組。共用群組會降低更新計數器的效能,而許多讀取器群組會降低讀取計數器的效能。因此,此限制是更新操作效能和讀取操作效能之間的權衡。每個群組在每個計數器中會消耗 64 個位元組。

    請注意,使用分散式計數器群組的執行時系統會受益於將排程器繫結至邏輯處理器,因為使用此選項時,群組在排程器之間的分布會更好。

    此選項僅影響用於追蹤記憶體消耗量和啟用了寫入並行選項的 ordered_set 類型的 ETS 表格中術語數量的計數器的分散式計數器。

  • +e Number - 設定 ETS 表格的最大數量。此限制 已部分過時

  • +ec - 強制對所有 ETS 表格使用 compressed 選項。僅適用於測試和評估。

  • +fnl - 虛擬機器處理檔名的方式如同它們使用 ISO Latin-1 編碼,不允許程式碼點 > 255 的 Unicode 字元。

    有關 Unicode 檔名的詳細資訊,請參閱 STDLIB 使用者指南中的 Unicode 檔名 章節。請注意,此值也適用於命令列參數和環境變數 (請參閱 STDLIB 使用者指南中的 環境和參數中的 Unicode 章節)。

  • +fnu[{w|i|e}] - 虛擬機器處理檔名的方式如同它們使用 UTF-8 (或某些其他系統特定的 Unicode 編碼) 編碼。這是強制執行 Unicode 編碼的作業系統上的預設值,也就是 Windows MacOS X 和 Android。

    +fnu 開關後面可以跟著 wie 來控制如何報告錯誤編碼的檔名

    • w 表示,每當在目錄清單中「略過」錯誤編碼的檔名時,都會將警告傳送至 error_logger。這是預設值。
    • i 表示,那些錯誤編碼的檔名會被靜默忽略。
    • e 表示,每當遇到錯誤編碼的檔名 (或目錄名稱) 時,API 函數都會傳回錯誤。

    請注意,如果連結指向無效的檔名,則 file:read_link/1 一律會傳回錯誤。

    有關 Unicode 檔名的詳細資訊,請參閱 STDLIB 使用者指南中的 Unicode 檔名 章節。請注意,此值也適用於命令列參數和環境變數 (請參閱 STDLIB 使用者指南中的 環境和參數中的 Unicode 章節)。

  • +fna[{w|i|e}] - 在 +fnl+fnu 之間進行選擇是根據作業系統中的目前地區設定進行。這表示,如果您已將終端機設定為 UTF-8 編碼,則檔案系統預期會對檔名使用相同的編碼。這是所有作業系統上的預設值,除了 Android、MacOS X 和 Windows。

    +fna 開關後面可以跟著 wie。如果地區設定導致選取 +fnu 的行為,則這會生效;請參閱上方 +fnu 的說明。如果地區設定導致選取 +fnl 的行為,則 wie 不會產生任何作用。

    有關 Unicode 檔名的詳細資訊,請參閱 STDLIB 使用者指南中的 Unicode 檔名 章節。請注意,此值也適用於命令列參數和環境變數 (請參閱 STDLIB 使用者指南中的 環境和參數中的 Unicode 章節)。

  • +hms Size - 將程序的預設堆積大小設定為大小為 Size 字。

  • +hmbs Size - 將程序的預設二進位虛擬堆積大小設定為大小為 Size 字。

  • +hmax Size - 將程序的預設最大堆積大小設定為大小為 Size 字。預設值為 0,表示不使用最大堆積大小。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxel true|false - 設定是否為達到最大堆積大小的程序傳送錯誤記錄器訊息。預設值為 true。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxib true|false - 設定是否將共用堆外二進位檔的大小包含在與最大堆積大小相比的總和中。預設值為 false。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxk true|false - 設定是否終止達到最大堆積大小的程序。預設值為 true。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)

  • +hpds Size - 將程序的初始程序字典大小設定為 Size

  • +hmqd off_heap|on_heap - 設定 message_queue_data 程序標誌的預設值。預設值為 on_heap。如果未傳遞 +hmqd,則 on_heap 將會是預設值。如需詳細資訊,請參閱 process_flag(message_queue_data, MQD)

  • +IOp PollSets - 設定在輪詢 I/O 時要使用的 IO 輪詢集數量。此選項僅在支援並行更新輪詢集的平台上使用,否則使用的輪詢集數量與 IO 輪詢執行緒相同。預設值為 1。

  • +IOt PollThreads - 設定在輪詢 I/O 時要使用的 IO 輪詢執行緒數量。允許的最大輪詢執行緒數量為 1024。預設值為 1。

    檢查是否需要更多 IO 輪詢執行緒的一個好方法是使用微狀態計帳,並查看 IO 輪詢執行緒的負載。如果負載很高,則新增更多執行緒可能是一個好主意。

  • +IOPp PollSetsPercentage - 類似於 +IOp,但使用百分比來設定要建立的 IO 輪詢集合數量,基於已設定的輪詢執行緒數量。如果同時使用 +IOPp+IOp,則會忽略 +IOPp

  • +IOPt PollThreadsPercentage - 類似於 +IOt,但使用百分比來設定要建立的 IO 輪詢執行緒數量,基於已設定的排程器數量。如果同時使用 +IOPt+IOt,則會忽略 +IOPt

  • +IOs true|false - 啟用或停用排程器執行緒輪詢最佳化。預設值為 true

    如果啟用,經常讀取的檔案描述符可能會移至排程器執行緒使用的特殊輪詢集合。目的是減少系統呼叫次數,從而降低 CPU 負載,但在某些情況下,可能會增加個別檔案描述符輸入事件的排程延遲。

  • +JPcover true|false|function|function_counters|line|line_counters - 自:OTP 27.0

    啟用或停用在使用 JIT 時對涵蓋範圍的支援。預設值為 false。

    • function - 所有已載入的模組都會被檢測,以追蹤執行了哪些函式。可以透過呼叫 code:get_coverage(function, Module) 來擷取有關已執行函式的資訊。

    • function_counters - 所有已載入的模組都會被檢測,以計算每個函式執行的次數。可以透過呼叫 code:get_coverage(function, Module) 來擷取每個函式已執行次數的資訊。

    • line - 當載入使用 line_coverage 選項編譯的模組時,它們會被檢測以追蹤已執行的程式碼行。可以透過呼叫 code:get_coverage(line, Module) 來擷取有關已執行程式碼行的資訊,並且可以透過呼叫 code:get_coverage(function, Module) 來擷取有關已執行函式的資訊。

    • line_counters - 當載入使用 line_coverage 選項編譯的模組時,它們會被檢測以計算每行程式碼執行的次數。可以透過呼叫 code:get_coverage(line, Module) 來擷取每行程式碼已執行次數的資訊,並且可以透過呼叫 code:get_coverage(function, Module) 來擷取有關已執行函式的資訊(請注意,在此模式下,**無法**擷取每個函式已執行次數的計數器)。

    • true - 與 line_counters 相同。

    • false - 停用涵蓋範圍。

  • +JPperf true|false|dump|map|fp|no_fp - 在 Linux 上使用 JIT 執行時,啟用或停用對 perf 分析器的支援。預設值為 false。

    可以多次組合此選項以啟用多個選項

    • dump - 提供 perf 詳細的程式碼行資訊,以便 perf annotate 功能正常運作。

    • map - 為 perf 提供所有模組程式碼的對應,使其能夠將機器碼位址轉換為 Erlang 原始碼位置。這也會為 Erlang 程式碼啟用框架指標,以便 perf 可以逐步執行 Erlang 處理程序的呼叫堆疊,每個堆疊框架會額外耗用一個字。

    • fp - 獨立於 map 選項啟用框架指標。

    • no_fp - 停用 map 選項新增的框架指標。

    • true - 啟用 mapdump

    • false - 停用所有其他選項。

    有關如何執行 perf 的更多詳細資訊,請參閱 BeamAsm 內部文件中的perf 支援章節。

  • +JMsingle true|false - 自:OTP-26.0

    啟用或停用為 JIT 程式碼使用單一映射 RWX 記憶體。預設是將 JIT 的機器碼映射到兩個共用相同實體頁面的區域,其中一個區域是可執行的但不可寫入,另一個區域是可寫入的但不可執行。由於某些工具(例如 QEMU 使用者模式模擬)無法處理雙重映射,因此此旗標允許停用它。此旗標會自動由 +JPperf 旗標啟用。

  • +L - 防止載入有關原始檔名和程式碼行號的資訊。這會節省一些記憶體,但例外狀況不會包含有關檔案名稱和程式碼行號的資訊。

  • +MFlag Value - 記憶體配置器特定的旗標。有關更多資訊,請參閱 erts_alloc(3)

  • +pad true|false - 自:OTP 25.3

    +pad 參數搭配使用的布林值決定新產生的處理程序 async_dist 處理程序旗標的預設值。預設情況下,如果未傳遞 +pad 命令列選項,則 async_dist 旗標將會設定為 false

    可以透過呼叫 erlang:system_info(async_dist) 來檢查執行階段中使用的值。

  • +pc Range - 設定系統在字串的啟發式偵測中視為可列印的字元範圍。這通常會影響 shell、偵錯工具和 io:format 函式(當在格式字串中使用 ~tp 時)。

    支援 Range 的兩個值

    • latin1 - 預設值。只有 ISO Latin-1 範圍內的字元才被視為可列印。這表示程式碼點 > 255 的字元永遠不會被視為可列印,並且包含此類字元的清單會由工具顯示為整數列表而不是文字字串。

    • unicode - 在決定是否要以字串語法顯示整數列表時,會考慮所有可列印的 Unicode 字元。如果您的字型未涵蓋所有 Unicode 字元,可能會產生意料之外的結果。

    另請參閱 STDLIB 中的 io:printable_range/0

  • +P Number - 如果傳遞 Number 作為值,則設定此系統同時存在的處理程序最大數量。 Number 的有效範圍為 [1024-134217727]

    注意

    實際選擇的最大值可能遠大於傳遞的 Number。目前,執行階段系統通常(但不總是)選擇一個 2 的冪次方的值。但是,這在未來可能會變更。可以透過呼叫 erlang:system_info(process_limit) 來檢查實際選擇的值。

    預設值為 1048576

  • +Q Number - 如果傳遞 Number 作為值,則設定此系統同時存在的埠最大數量。Number 的有效範圍為 [1024-134217727]

    注意

    實際選擇的最大值可能遠大於實際傳遞的 Number。目前,執行階段系統通常(但不總是)選擇一個 2 的冪次方的值。但是,這在未來可能會變更。可以透過呼叫 erlang:system_info(port_limit) 來檢查實際選擇的值。

    使用的預設值通常為 65536。但是,如果執行階段系統能夠判斷允許開啟的最大檔案描述符數量,並且該值大於 65536,則選擇的值將會增加到大於或等於可以開啟的最大檔案描述符數量。

    在 Windows 上,預設值設定為 8196,因為正常的作業系統限制設定高於大多數機器可以處理的值。

  • +R ReleaseNumber - 設定相容模式。

    預設情況下,分散式機制不向後相容。此旗標會將模擬器設定為與較早的 Erlang/OTP 版本 ReleaseNumber 相容的模式。版本號必須在 <目前版本>-2<目前版本> 的範圍內。這會限制模擬器,使其能夠與執行較早版本的 Erlang 節點(以及 C 和 Java 節點)進行通訊。

    注意

    確保分散式 Erlang 系統的所有節點(Erlang、C 和 Java 節點)都屬於相同的 Erlang/OTP 版本,或來自兩個不同的 Erlang/OTP 版本 X 和 Y,其中所有 Y 節點都具有相容模式 X。

  • +r - 強制在重新配置時移動 ETS 記憶體區塊。

  • +rg ReaderGroupsLimit - 限制 Erlang 執行階段系統中用於讀取操作優化的讀取/寫入鎖定的讀取器群組數量。預設情況下,讀取器群組限制為 64。

    當排程器數量小於或等於讀取器群組限制時,每個排程器都有自己的讀取器群組。當排程器數量大於讀取器群組限制時,排程器會共用讀取器群組。共用的讀取器群組會降低讀取鎖定和讀取解鎖效能,而過多的讀取器群組則會降低寫入鎖定效能。因此,此限制是讀取操作效能和寫入操作效能之間的權衡。每個讀取器群組在每個讀取/寫入鎖定中會耗用 64 位元組。

    請注意,使用共用讀取器群組的執行階段系統會受益於將排程器繫結至邏輯處理器,因為讀取器群組在排程器之間會得到更好的分佈。

  • +S Schedulers:SchedulerOnline - 設定要建立的排程器執行緒數量和要上線的排程器執行緒數量。這兩個值的最大值都是 1024。如果 Erlang 執行階段系統能夠判斷已設定的邏輯處理器數量和可用的邏輯處理器數量,則 Schedulers 預設為已設定的邏輯處理器,而 SchedulersOnline 預設為可用的邏輯處理器;否則預設值為 1。如果模擬器偵測到它受到CPU 配額的限制,則 SchedulersOnline 的預設值將會相應地受到限制。

    如果沒有設定 :SchedulerOnline,則可以省略 Schedulers,反之亦然。線上排程器的數量可以在執行時透過 erlang:system_flag(schedulers_online, SchedulersOnline) 進行變更。

    如果 SchedulersSchedulersOnline 指定為負數,則該值會分別從已設定的邏輯處理器預設數量或可用的邏輯處理器數量中減去。

    SchedulersSchedulersOnline 指定值 0 會分別將排程器執行緒數量或線上排程器執行緒數量重置為預設值。

  • +SP SchedulersPercentage:SchedulersOnlinePercentage - 類似於 +S,但使用百分比來設定要建立的排程器執行緒數量(基於已設定的邏輯處理器)以及要上線的排程器執行緒數量(基於可用的邏輯處理器)。指定的值必須 > 0。例如,+SP 50:25 將排程器執行緒數量設定為已設定邏輯處理器的 50%,並將線上排程器執行緒數量設定為可用邏輯處理器的 25%。如果沒有設定 :SchedulersOnlinePercentage,則可以省略 SchedulersPercentage,反之亦然。線上排程器的數量可以在執行時透過 erlang:system_flag(schedulers_online, SchedulersOnline) 進行變更。

    此選項會與 +S 設定互動。例如,在具有 8 個已設定邏輯核心和 8 個可用邏輯核心的系統上,選項 +S 4:4 +SP 50:25 的組合(無論順序如何)會產生 2 個排程器執行緒(4 的 50%)和 1 個線上排程器執行緒(4 的 25%)。

  • +SDcpu DirtyCPUSchedulers:DirtyCPUSchedulersOnline - 設定要建立的 Dirty CPU 排程器執行緒數量以及要上線的 Dirty CPU 排程器執行緒數量。兩個值的最大值均為 1024,並且每個值都受到一般排程器設定的進一步限制。

    • 建立的 Dirty CPU 排程器執行緒數量不得超過建立的一般排程器執行緒數量。
    • 上線的 Dirty CPU 排程器執行緒數量不得超過上線的一般排程器執行緒數量。

    詳細資訊,請參閱 +S+SP。預設情況下,建立的 Dirty CPU 排程器執行緒數量等於建立的一般排程器執行緒數量,而上線的 Dirty CPU 排程器執行緒數量等於上線的一般排程器執行緒數量。如果沒有設定 :DirtyCPUSchedulersOnline,則可以省略 DirtyCPUSchedulers,反之亦然。線上 Dirty CPU 排程器的數量可以在執行時透過 erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) 進行變更。

    Dirty CPU 排程器的數量受到一般排程器數量的限制,以便限制對在普通排程器上執行的處理程序之影響。如果允許 Dirty CPU 排程器的數量不受限制,則受 Dirty CPU 約束的工作可能會使普通工作處於飢餓狀態。

    Dirty CPU 排程器的典型使用者包括大型垃圾收集、以 NIF 撰寫的 JSON 通訊協定編碼器/解碼器和矩陣操作程式庫。

    您可以使用 msacc 來查看目前 Dirty CPU 排程器執行緒的負載,並據此調整使用的數量。

  • +SDPcpu DirtyCPUSchedulersPercentage:DirtyCPUSchedulersOnlinePercentage - 類似於 +SDcpu,但使用百分比來設定要建立的 Dirty CPU 排程器執行緒數量以及要上線的 Dirty CPU 排程器執行緒數量。指定的值必須 > 0。例如,+SDPcpu 50:25 將 Dirty CPU 排程器執行緒數量設定為已設定邏輯處理器的 50%,並將線上 Dirty CPU 排程器執行緒數量設定為可用邏輯處理器的 25%。如果沒有設定 :DirtyCPUSchedulersOnlinePercentage,則可以省略 DirtyCPUSchedulersPercentage,反之亦然。線上 Dirty CPU 排程器的數量可以在執行時透過 erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) 進行變更。

    此選項會與 +SDcpu 設定互動。例如,在具有 8 個已設定邏輯核心和 8 個可用邏輯核心的系統上,選項 +SDcpu 4:4 +SDPcpu 50:25 的組合(無論順序如何)會產生 2 個 Dirty CPU 排程器執行緒(4 的 50%)和 1 個線上 Dirty CPU 排程器執行緒(4 的 25%)。

  • +SDio DirtyIOSchedulers - 設定要建立的 Dirty I/O 排程器執行緒數量。有效範圍為 1-1024。預設情況下,建立的 Dirty I/O 排程器執行緒數量為 10。

    Dirty IO 排程器的數量不受一般排程器數量的限制,就像 Dirty CPU 排程器的數量 一樣。這是因為預期只有受 I/O 約束的工作會在 Dirty I/O 排程器上執行。如果使用者應在 Dirty I/O 排程器上排程受 CPU 約束的工作,這些工作可能會使在普通排程器上執行的普通工作處於飢餓狀態。

    Dirty IO 排程器的典型使用者包括讀取和寫入檔案。

    您可以使用 msacc 來查看目前 Dirty IO 排程器執行緒的負載,並據此調整使用的數量。

  • +sFlag Value - 排程特定標誌。

    • +sbt BindType - 設定排程器繫結類型。

      也可以使用標誌 +stbt 來繫結排程器。這兩個標誌之間的唯一區別在於如何處理以下錯誤

      • 特定平台不支援排程器繫結。
      • 沒有可用的 CPU 拓撲。也就是說,執行時系統無法自動偵測 CPU 拓撲,且未設定 使用者定義的 CPU 拓撲

      如果在傳遞 +sbt 時發生任何這些錯誤,則執行時系統會印出錯誤訊息,並拒絕啟動。如果在傳遞 +stbt 時發生任何這些錯誤,則執行時系統會自動忽略錯誤,並使用未繫結的排程器啟動。

      有效的 BindType

      • u - unbound - 排程器未繫結至邏輯處理器,也就是說,作業系統決定排程器執行緒的執行位置以及何時遷移它們。這是預設值。

      • ns - no_spread - 具有接近的排程器識別碼的排程器會盡可能繫結在硬體中。

      • ts - thread_spread - 執行緒是指硬體執行緒(例如 Intel 的超執行緒)。具有較低排程器識別碼的排程器會繫結至每個核心的第一個硬體執行緒,然後具有較高排程器識別碼的排程器會繫結至每個核心的第二個硬體執行緒,依此類推。

      • ps - processor_spread - 排程器的擴散方式與 thread_spread 相同,但也遍布實體處理器晶片。

      • s - spread - 排程器的擴散程度越大越好。

      • nnts - no_node_thread_spread - 類似於 thread_spread,但如果存在多個非統一記憶體存取 (NUMA) 節點,則排程器一次會擴散到一個 NUMA 節點上,也就是說,一個 NUMA 節點的所有邏輯處理器會依序繫結至排程器。

      • nnps - no_node_processor_spread - 類似於 processor_spread,但如果存在多個 NUMA 節點,則排程器一次會擴散到一個 NUMA 節點上,也就是說,一個 NUMA 節點的所有邏輯處理器會依序繫結至排程器。

      • tnnps - thread_no_node_processor_spread - thread_spreadno_node_processor_spread 的組合。排程器在 NUMA 節點的硬體執行緒上擴散,但排程器僅在一個 NUMA 節點內部依序擴散到處理器上。

      • db - default_bind - 以預設方式繫結排程器。預設為 thread_no_node_processor_spread(未來可能會變更)。

      只有在較新的 Linux、Solaris、FreeBSD 和 Windows 系統上才支援排程器繫結。

      如果處理標誌 +sbt 時沒有可用的 CPU 拓撲,並且 BindType 不是 u 以外的任何類型,則執行時系統將無法啟動。可以使用標誌 +sct 定義 CPU 拓撲。請注意,如果沒有自動偵測到 CPU 拓撲,則標誌 +sct 可能必須在命令列上於標誌 +sbt 之前傳遞。

      預設情況下,執行時系統不會將排程器繫結至邏輯處理器。

      注意

      如果 Erlang 執行時系統是唯一將執行緒繫結至邏輯處理器的作業系統處理程序,則這會提升執行時系統的效能。但是,如果其他作業系統處理程序(例如另一個 Erlang 執行時系統)也將執行緒繫結至邏輯處理器,則反而可能會產生效能損失。這種效能損失有時可能會很嚴重。如果是這樣,建議您不要繫結排程器。

      排程器如何繫結很重要。例如,在執行中的處理程序少於線上排程器的情況下,執行時系統會嘗試將處理程序遷移至具有較低排程器識別碼的排程器。排程器在硬體上的擴散程度越大,執行時系統在這種情況下可用的資源就越多。

      注意

      如果排程器無法繫結,則通常會自動忽略此問題,因為並非總是能夠驗證有效的邏輯處理器識別碼。如果報告了錯誤,則會將其報告給 error_logger。如果您想要驗證排程器是否已依照要求繫結,請呼叫 erlang:system_info(scheduler_bindings)

    • +sbwt none|very_short|short|medium|long|very_long - 設定排程器忙碌等待閾值。預設為 medium。閾值決定排程器在用完工作後在進入休眠狀態之前忙碌等待的時間長度。

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +sbwtdcpu none|very_short|short|medium|long|very_long - 與 +sbwt 相同,但會影響 Dirty CPU 排程器。預設為 short

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +sbwtdio none|very_short|short|medium|long|very_long - 與 +sbwt 類似,但影響的是髒 IO 排程器。預設值為 short

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +scl true|false - 啟用或停用排程器負載壓縮。預設情況下,排程器負載壓縮為啟用狀態。啟用時,負載平衡會盡力實現一種負載分佈,使盡可能多的排程器執行緒完全負載(即不會無事可做)。這是通過在排程器頻繁無事可做時,將負載(例如,可執行的進程)遷移到較少數量的排程器中來實現的。停用時,負載平衡邏輯不會考慮排程器無事可做的頻率。

      +scl false 類似於 +sub true,但 +sub true 也會在排程器之間平衡排程器的使用率。

    • +sct CpuTopology - 設定使用者定義的 CPU 拓撲。使用者定義的 CPU 拓撲會覆蓋任何自動偵測到的 CPU 拓撲。當將排程器綁定到邏輯處理器時,會使用 CPU 拓撲。

      <Id> = integer(); when 0 =< <Id> =< 65535
      <IdRange> = <Id>-<Id>
      <IdOrIdRange> = <Id> | <IdRange>
      <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>
      <LogicalIds> = L<IdList>
      <ThreadIds> = T<IdList> | t<IdList>
      <CoreIds> = C<IdList> | c<IdList>
      <ProcessorIds> = P<IdList> | p<IdList>
      <NodeIds> = N<IdList> | n<IdList>
      <IdDefs> = <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds> |
                 <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>
      CpuTopology = <IdDefs>:<IdDefs> | <IdDefs>

      大寫字母表示真實的識別符號,小寫字母表示僅用於描述拓撲的虛擬識別符號。作為真實識別符號傳遞的識別符號,當嘗試存取特定硬體時,執行階段系統可以使用;如果它們不正確,則行為未定義。不接受虛擬的邏輯 CPU 識別符號,因為在沒有真實的邏輯 CPU 識別符號的情況下定義 CPU 拓撲沒有意義。可以省略執行緒、核心、處理器和節點識別符號。如果省略,執行緒 ID 預設為 t0,核心 ID 預設為 c0,處理器 ID 預設為 p0,節點 ID 則保持未定義。每個邏輯處理器必須僅屬於一個 NUMA 節點,或者所有邏輯處理器都不得屬於任何 NUMA 節點。

      允許 <IdRange> 遞增和遞減。

      NUMA 節點識別符號是系統範圍的。也就是說,系統上的每個 NUMA 節點都必須具有唯一的識別符號。處理器識別符號也是系統範圍的。核心識別符號是處理器範圍的。執行緒識別符號是核心範圍的。

      識別符號類型的順序表示 CPU 拓撲的層次結構。有效的順序如下:

      • <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>,也就是說,執行緒是核心的一部分,核心是處理器的一部分,而處理器是 NUMA 節點的一部分。
      • <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>,也就是說,執行緒是核心的一部分,核心是 NUMA 節點的一部分,而 NUMA 節點是處理器的一部分。

      CPU 拓撲可以同時包含處理器外部和處理器內部的 NUMA 節點,只要每個邏輯處理器只屬於一個 NUMA 節點即可。如果省略 <ProcessorIds>,則其預設位置在 <NodeIds> 之前。也就是說,預設為處理器外部的 NUMA 節點。

      如果在 <IdDefs> 中使用識別符號列表

      • <LogicalIds> 必須是識別符號列表。
      • 除了 <LogicalIds> 之外,至少還必須有一個識別符號類型也具有識別符號列表。
      • 所有識別符號列表都必須產生相同數量的識別符號。

      一個簡單的範例。單個四核心處理器可以描述如下:

      % erl +sct L0-3c0-3
      1> erlang:system_info(cpu_topology).
      [{processor,[{core,{logical,0}},
                   {core,{logical,1}},
                   {core,{logical,2}},
                   {core,{logical,3}}]}]

      一個更複雜的範例,包含兩個四核心處理器,每個處理器都位於其自己的 NUMA 節點中。邏輯處理器的順序有點奇怪。這是為了更好地說明識別符號列表的範例:

      % erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1
      1> erlang:system_info(cpu_topology).
      [{node,[{processor,[{core,{logical,0}},
                          {core,{logical,1}},
                          {core,{logical,3}},
                          {core,{logical,2}}]}]},
       {node,[{processor,[{core,{logical,7}},
                          {core,{logical,4}},
                          {core,{logical,6}},
                          {core,{logical,5}}]}]}]

      只要真實的識別符號正確,傳遞的 CPU 拓撲不是 CPU 拓撲的正確描述也沒關係。謹慎使用時,這非常有用。這樣可以欺騙模擬器,使其按照您的意願綁定其排程器。例如,如果您想在同一台機器上執行多個 Erlang 執行階段系統,則需要減少使用的排程器數量並操作 CPU 拓撲,以便將它們綁定到不同的邏輯 CPU。一個範例,在四核心機器上有兩個 Erlang 執行階段系統:

      % erl +sct L0-3c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname one
      % erl +sct L3-0c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname two

      在此範例中,每個執行階段系統都有兩個排程器處於線上狀態,並且所有處於線上狀態的排程器都將在不同的核心上執行。如果我們將一個執行階段系統的線上排程器變更為一個,而將另一個執行階段系統的線上排程器變更為三個,則所有處於線上狀態的排程器仍將在不同的核心上執行。

      請注意,偽造的 CPU 拓撲如果不能反映真實 CPU 拓撲的外觀,則可能會降低執行階段系統的效能。

      如需更多資訊,請參閱 erlang:system_info(cpu_topology)

    • +ssrct - 跳過讀取 CPU 拓撲。

      注意

      當在具有大量核心的系統上啟動許多 ERTS 並行執行個體時,讀取 CPU 拓撲會減慢啟動速度;在這種情況下使用此標誌可能會加快執行速度。

    • +sfwi Interval - 設定排程器強制喚醒間隔。每個 Interval 毫秒掃描一次所有執行佇列。當系統中有休眠的排程器時,對於找到的每個非空執行佇列,都會喚醒一個排程器。Interval 預設值為 0,表示此功能已停用。

      注意

      此功能作為長時間執行的原生程式碼和未在 OTP 中正確增加縮減次數的原生程式碼的臨時因應措施而引入。當這些錯誤修復後,此標誌將會移除。

    • +spp Bool - 設定埠並行性的預設排程器提示。如果設定為 true,則虛擬機器會在改善系統並行性時排程埠任務。如果設定為 false,則虛擬機器會嘗試立即執行埠任務,從而提高延遲,但犧牲並行性。預設值為 false。透過呼叫 erlang:system_info(port_parallelism),可以在執行階段檢查使用的預設值。在建立埠時,可以透過將選項 parallelism 傳遞到 erlang:open_port/2 來覆寫預設值。

    • +sss size - 排程器執行緒的建議堆疊大小(以千字為單位)。有效範圍為 20-8192 千字。預設的建議堆疊大小為 128 千字。

    • +sssdcpu size - 髒 CPU 排程器執行緒的建議堆疊大小(以千字為單位)。有效範圍為 20-8192 千字。預設的建議堆疊大小為 40 千字。

    • +sssdio size - 髒 IO 排程器執行緒的建議堆疊大小(以千字為單位)。有效範圍為 20-8192 千字。預設的建議堆疊大小為 40 千字。

    • +stbt BindType - 嘗試設定排程器綁定類型。與標誌 +sbt 相同,只是處理某些錯誤的方式不同。如需更多資訊,請參閱 +sbt

    • +sub true|false - 啟用或停用 排程器使用率負載平衡。預設情況下,排程器使用率負載平衡已停用,而是啟用排程器負載壓縮,這會盡力實現一種負載分佈,使盡可能多的排程器執行緒完全負載(即不會無事可做)。啟用排程器使用率平衡時,系統會改為嘗試在排程器之間平衡排程器使用率。也就是說,盡力使所有排程器上的排程器使用率相等。

      僅在執行階段系統偵測並使用單調遞增的高解析度時鐘的系統上,才支援 +sub true。在其他系統上,執行階段系統無法啟動。

      +sub true 意味著 +scl false+sub true+scl false 之間的差異在於 +scl false 不會嘗試平衡排程器使用率。

    • +swct very_eager|eager|medium|lazy|very_lazy - 設定排程器喚醒清除閾值。預設值為 medium。控制排程器因某些清除作業而請求喚醒的積極程度。使用延遲設定時,在排程器閒置時,可以留下更多未完成的清除作業。使用積極設定時,排程器會更頻繁地喚醒,這可能會增加 CPU 使用率。

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +sws default|legacy - 設定排程器喚醒策略。預設策略在 ERTS 5.10 (Erlang/OTP R16A) 中變更。此策略在 Erlang/OTP R15 中稱為 proposallegacy 策略從 R13 到 R15(含)被用作預設值。

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +swt very_low|low|medium|high|very_high - 設定排程器喚醒閾值。預設值為 medium。當存在比目前已喚醒排程器可以處理的更多工作時,閾值決定何時喚醒休眠的排程器。較低的閾值會導致較早的喚醒,而較高的閾值會導致較晚的喚醒。較早的喚醒可以更快地在多個排程器上分配工作,但工作更容易在排程器之間跳動。

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +swtdcpu very_low|low|medium|high|very_high - 與 +swt 類似,但影響的是髒 CPU 排程器。預設值為 medium

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

    • +swtdio very_low|low|medium|high|very_high - 與 +swt 類似,但影響的是髒 IO 排程器。預設值為 medium

      注意

      此標誌可以隨時移除或變更,恕不另行通知。

  • +t size - 設定虛擬機器可以處理的最大原子數量。預設值為 1,048,576。

  • +T Level - 啟用修改後的計時並設定修改後的計時層級。有效範圍為 0-9。變更執行階段系統的計時。較高的層級通常表示比低層級更大的變更。變更計時對於尋找與計時相關的錯誤非常有用。

    修改後的計時會影響下列項目:

    • 進程產生 - 呼叫 spawnspawn_linkspawn_monitorspawn_opt 的進程會在完成呼叫後立即排程出來。當使用較高的修改後計時層級時,呼叫者在排程出來後也會休眠一段時間。

    • 內容縮減 - 允許進程使用的縮減次數會在排程出來之前增加或減少。

    • 輸入縮減 - 在檢查 I/O 之前執行的縮減次數會增加或減少。

    注意

    啟用修改過的時間設定會導致效能降低。此標記用於測試和除錯。

    在追蹤 spawn BIF 時,return_toreturn_from 追蹤訊息會遺失。

    此標誌可以隨時移除或變更,恕不另行通知。

  • +v - 冗長模式。

  • +V - 使模擬器印出其版本號碼。

  • +W w | i | e - 設定 error_logger 的警告訊息對應。使用其中一個警告常式傳送到錯誤記錄器的訊息可以對應到錯誤 (+W e)、警告 (+W w) 或資訊報告 (+W i)。預設為警告。可以使用 error_logger:warning_map/0 檢索目前的對應。如需更多資訊,請參閱 Kernel 中的 error_logger:warning_map/0

  • +zFlag Value - 其他旗標

    • +zdbbl size - 設定以 KB 為單位的分配緩衝區忙碌限制 (dist_buf_busy_limit)。有效範圍為 1-2097151。預設值為 1024。

      較大的緩衝區限制允許程序透過分配緩衝更多傳出訊息。當達到緩衝區限制時,傳送程序將會暫停,直到緩衝區大小縮小為止。緩衝區限制是每個分配通道。較高的限制可以降低延遲並提高輸送量,但會增加記憶體使用量。

      此限制僅影響已停用 完全非同步分散式信號傳送 的程序。

    • +zdntgc time - 設定以秒為單位的延遲節點表垃圾收集時間 (delayed_node_table_gc)。有效值為 infinity 或 0-100000000 範圍內的整數。預設值為 60。

      未引用的節點表項目會在表中保留至少此參數確定的時間。這種保留可以防止表中重複刪除和插入的情況發生。

    • +zosrl limit - 限制協調系統範圍變更的系統程序發出的未完成請求數量。此限制的有效範圍為 [1, 134217727]。如需更多資訊,請參閱 erlang:system_flag(outstanding_system_requests_limit, Limit)

    • +zhft limit - 設定執行階段系統在 停止時,允許執行 清除 操作的最長時間限制。有效的 <timeout> 值為 0..2147483647 範圍內的整數或單字 infinity<timeout> 以毫秒為單位,預設值為 infinity

      如果清除操作在停止期間已持續進行 <timeout> 毫秒,則清除操作將會被中斷,執行階段系統將會立即以退出代碼 255 終止。如果停止時沒有清除,則 <timeout> 將不會對系統產生任何影響。

      此旗標設定的值可以透過呼叫 erlang:system_info(halt_flush_timeout) 來由 Erlang 程式碼讀取。

      另請參閱 erlang:halt/2 BIF 的 flush_timeout 選項。請注意,此命令列引數與 flush_timeout 選項的最短逾時時間將會是實際生效的逾時時間值。

      自:OTP 27.0 起。

環境變數

  • ERL_CRASH_DUMP - 如果模擬器需要寫入損毀傾印,此變數的值是損毀傾印檔的檔名。如果未設定此變數,則損毀傾印檔的名稱為目前目錄中的 erl_crash.dump

  • ERL_CRASH_DUMP_NICE - Unix 系統:如果模擬器需要寫入損毀傾印,它會使用此變數的值來設定程序的 nice 值,從而降低其優先順序。有效範圍為 1-39(較高的值會被取代為 39)。最高值 39 會給予程序最低的優先順序。

  • ERL_CRASH_DUMP_SECONDS - Unix 系統:此變數指定模擬器寫入損毀傾印所允許花費的秒數。當指定的秒數經過時,模擬器將會終止。

    • ERL_CRASH_DUMP_SECONDS=0 - 如果變數設定為 0 秒,執行階段系統甚至不會嘗試寫入損毀傾印檔。它只會終止。如果將選項 -heart 傳遞給 erl 且未設定 ERL_CRASH_DUMP_SECONDS,則此為預設值。

    • ERL_CRASH_DUMP_SECONDS=S - 如果變數設定為正值 S,則會等待 S 秒來完成損毀傾印檔,然後使用 SIGALRM 訊號終止執行階段系統。

    • ERL_CRASH_DUMP_SECONDS=-1 - 負值會導致執行階段系統的終止無限期地等待,直到損毀傾印檔完全寫入為止。如果將選項 -heart 傳遞給 erl 且未設定 ERL_CRASH_DUMP_SECONDS,則此為預設值。

    另請參閱 heart

  • ERL_CRASH_DUMP_BYTES - 此變數設定損毀傾印檔的最大大小(以位元組為單位)。如果超過此限制,損毀傾印將會被截斷。如果未設定此變數,預設不會強制執行大小限制。如果變數設定為 0,執行階段系統甚至不會嘗試寫入損毀傾印檔。

    在 ERTS 8.1.2 (Erlang/OTP 19.2) 中導入。

  • ERL_AFLAGS - 此變數的內容會新增至 erl 的命令列開頭。

    旗標 -extra 會以特殊方式處理。其範圍會在環境變數內容的結尾結束。在 -extra 旗標之後的引數會移動到命令列的 -extra 區段,也就是 -extra 旗標之後的命令列結尾。

  • ERL_ZFLAGSERL_FLAGS - 這些變數的內容會新增至 erl 的命令列結尾。

    旗標 -extra 會以特殊方式處理。其範圍會在環境變數內容的結尾結束。在 -extra 旗標之後的引數會移動到命令列的 -extra 區段,也就是 -extra 旗標之後的命令列結尾。

  • ERL_LIBS - 包含程式碼伺服器搜尋應用程式並新增至程式碼路徑的其他程式庫目錄清單;請參閱 code

  • ERL_EPMD_ADDRESS - 可以設定為以逗號分隔的 IP 位址清單,在這種情況下,epmd 常駐程式只會接聽指定的位址和迴路位址(如果未指定,則會隱含地將其新增至清單)。

  • ERL_EPMD_PORT - 可以包含與 epmd 通訊時使用的連接埠號碼。在大多數情況下,預設連接埠都能正常運作。可以指定不同的連接埠,以允許獨立叢集的節點在同一主機上共存。叢集中的所有節點都必須使用相同的 epmd 連接埠號碼。

訊號

在 Unix 系統上,Erlang 執行階段會解譯兩種訊號類型。

  • SIGUSR1 - SIGUSR1 訊號會強制進行損毀傾印。

  • SIGTERM - SIGTERM 將會產生傳送至 init 程序的 stop 訊息。這相當於呼叫 init:stop/0

    在 ERTS 8.3 (Erlang/OTP 19.3) 中導入。

訊號 SIGUSR2 保留給內部使用。不會處理其他訊號。

組態

可以重新組態標準 Erlang/OTP 系統,以變更啟動時的預設行為。

  • .erlang 啟動檔 - 當 Erlang/OTP 啟動時,系統會在使用者的主目錄,然後在 filename:basedir(user_config, "erlang") 中搜尋名為 .erlang 的檔案。

    如果找到 .erlang 檔案,則會假定其中包含有效的 Erlang 運算式。這些運算式會像輸入到 Shell 一樣進行評估。

    典型的 .erlang 檔案包含一組搜尋路徑,例如

    io:format("executing user profile in $HOME/.erlang\n",[]).
    code:add_path("/home/calvin/test/ebin").
    code:add_path("/home/hobbes/bigappl-1.2/ebin").
    io:format(".erlang rc finished\n",[]).
  • user_defaultshell_default - 在 Shell 中,沒有模組名稱字首的函式會被假定為函式物件 (fun)、內建函式 (BIF),或是屬於模組 user_defaultshell_default

    若要包含私人 Shell 命令,請在模組 user_default 中定義它們,並將下列引數作為 .erlang 檔案中的第一行

    code:load_abs("..../user_default").
  • erl - 如果變更了 .erlang 的內容,並且定義了 user_default 的私人版本,則可以自訂 Erlang/OTP 環境。若要在啟動指令碼 erl 中提供命令列引數,可以進行更強大的變更。如需更多資訊,請參閱 init

另請參閱

epmd(1)erl_prim_loadererts_alloc(3)initapplicationauthcodeerl_boot_serverheartnet_kernelmake