不管在erlang的shell下還是腳本里,啟動參數都是非常有用的,抽空兒整理下erlang的常用啟動參數:
+A size 異步線程池的線程數,范圍為0~1024,默認為10
+P Number|legacy 最大進程數,范圍為1024-134217727 ,默認為 262144
+K true | false 是否啟用的kernel的poll機制,默認為false
-config Config 加載指定的配置文件,config.config
-heart 開啟erlang的心跳檢測
這里細說下這個參數:% erl -heart ... 開啟心跳監測,默認為60s;
還有一種是 % erl -heart -env HEART_BEAT_TIMEOUT 30 ... 如果這里添加 -env HEART_BEAT_TIMEOUT 30 參數,可修改心跳監測時間,范圍為:10 < X <= 65535(s).
還有一個參數是:% erl -heart -env ERL_CRASH_DUMP_SECONDS (0、1、seconds)三種情況,用於分析dump文件.
-name Name 運行分布式節點名
-setcookie Cookie 在一個分布式集群中,不同節點間設置同一個cookie,保證節點互聯
-boot File 用來啟動系統,一般設置為start_sasl
-env Variable Value 用來設置宿主系統環境變量
+W w | i 設置error_logger的告警信息,+W w 為waring +W i 為info report
+e Number 設置最大ets表數量 沒有設置默認1400 可設置 ERL_MAX_ETS_TABLES,用 -env ERL_MAX_ETS_TABLES
-pa Dir1 Dir2 ... 添加指定代碼目錄由開始代碼的路徑 ,如:code:add_pathsa/1
-pz Dir1 Dir2 ... 添加指定的目錄的代碼路徑的末端 ,如:code:pathsz/1
-remsh Node 啟動遠程節點
## Increase number of concurrent ports/sockets
-env ERL_MAX_PORTS 4096
## Tweak GC to run more often
-env ERL_FULLSWEEP_AFTER 10
-env ERL_MAX_ETS_TABLES 200000
18904086003
+sbt db
+sub true %% R17版本之后,調度器測量 (多核平均分配cpu)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
erlang 默認啟動參數更多的是針對電信平台實時特性,簡單調整參數能很大程度降低CPU消耗,提高處理能力。
1. 關閉spin_wait
設置參數:+sbwt none
erlang 調度器CPU利用率低排查,關閉spin_wait 可能增加了調度器需要喚醒延時。
關閉后CPU 基本能夠簡單30%以上,且幾乎沒有任何副作用,調度器喚醒微妙級,延時可忽略。
2. 調度器喚醒策略
默認設置:+swt medium
默認設置下,長時間運行后部分node運行進入一種非正常狀態,如:不管高峰還是低峰,cpu 200%一條直線,且在高峰期間處理不過來,造成timeout,
也就是說,除了前兩個調度器,后面的調度器都睡死了,業務大量堆積也無法喚醒。
解決方案:
1. 定時維護性重啟,當然業務允許的話,對於類似長連接服務就不行了
2. 調整:+swt low (whatsapp ppt 中提到),CPU占用稍高
3. 使用R17 +sub true,保證每個調度器業務平均
當然: +swt very_high 能夠再次降低30%+ 的cpu
同時也很大程度增加 調度器睡死的幾率,會不會睡死看業務服務狀態,可以觀察,對性能提升還是很有幫助的。