erlang程序的負載均衡

2021-07-10 08:14:26 字數 1810 閱讀 7910

從erlang r12b

版本開始,啟動

erl時系統自動檢測

cpu核心數,並啟動相同數量的

scheduler

,也可以通過

erl +s number

來設定,不過啟動比

cpu核數更多的排程器不會提高效能

,啟動erl

時開啟或關閉

smp(symmetrical multi processor)   -smp enable    -smp disable

[smp:4:4],其中第乙個

4表示當前的排程器數量,第二個4表示

cpu核數

erlang通常在機器上的每乙個處理器核心上跑乙個執行緒。每乙個執行緒執行乙個排程器。這種設定是為了確保機器上所有的核心都可以為

erlang

系統賣力

1). 程序排程執行在使用者空間 :

erlang

程序不同於作業系統程序,

erlang

的程序排程也跟作業系統完全沒有關係,是由

erlang

虛擬機器來完成的;

2). 排程是搶占式的:每乙個程序在建立時,都會分配乙個固定數目的

reduction

(預設值是

2000

),每一次操作(函式呼叫),

reduction

就會減少,當這個數量減少到

0時或者程序沒有匹配的訊息時,搶占就會發生(無視優先順序);

3). 每個程序公平的使用

cpu:每個程序分配相同數量的

reduction

,可以保證程序可以公平的(不是相等的)使用

cpu資源

4). 排程器保證軟實時性:

erlang

中的程序有優先順序,排程器可以保證在下一次排程發生時,高優先順序的程序可以優先得到執行。

erlang

程序有四種優先順序:

max, high, normal, low

(max

只在erlang

執行時系統內部使用,普通程序不能使用)。

5)準確地說,搶占(preemption)[2]指的是排程器能夠強制剝奪任務的執行。所有基於協作(cooperation)的多工都是做不到搶占的,例如python的twisted庫、node.js和lwt(ocaml)等。但是更有意思的是,go(golang.org)和haskell(ghc)也都不是完全搶占式的。go只有在通訊的時候會發生上下文切換,因此乙個密集的迴圈就會霸佔整個處理器核心

為什麼要小心耗時長的nif的原因。nif預設不會被搶占,而且也不會貢獻reduction計數器。因此耗時長的nif會引入系統延遲。

對於可以併發執行的server,可以通過兩種方式來提供併發和負載

方式1:多開幾個程序池

,通過某個規則來把任務分發到各個server上。

方式2: 

多開幾個程序池,並且開乙個管理程序,每次有任務來請求管理程序,管理程序把具體任務分配到當前空閒的程序池。

方式1可能會出現這種情況

某個時刻 可能任務分配不均勻,只用到了乙個程序

方式2的有點這樣做的優點是可以真正做到負載均衡,並且可以動態的增加程序數來提高負載。

開多少個程序來負載:

1):cpu

密集型

可以通過erlang:system_info(schedulers) 獲得

cpu 

核心數,

可以開等於cpu核心數或者略大於cpu

核心數的程序。

2):io

密集型

大於cpu

核心數

DNS負載均衡 Nginx 負載均衡的種類

dns負載均衡 當乙個 有足夠多的使用者的時候,假如每次請求的資源都位於同一臺機器上面,那麼這台機器隨時可能會蹦掉。處理辦法就是用dns負載均衡技術,它的原理是在dns伺服器中為同乙個主機名配置多個ip位址,在應答dns查詢時,dns伺服器對每個查詢將以dns檔案中主機記錄的ip位址按順序返回不同的...

nginx 負載均衡 Nginx負載均衡策略

nginx提供的負載均衡策略有2種 內建策略和擴充套件策略。內建策略為輪詢 預設 加權輪詢,ip hash,第三方。upstream mysvr1 輪詢 每個請求按照時間順序逐一的分配到每乙個後台伺服器上。如果某台伺服器宕機了,將會自動的剔除宕機的服務。nginx預設就是輪詢其權重都預設為1,伺服器...

負載均衡總結 四層負載均衡和七層負載均衡的區別

一 四層負載和七層負載的對比 在osi七層模型的第4層工作,即tcp層,其不會理解上層的協議如 http ftp等.由上圖,在四層負載裝置中,把client傳送的報文目標位址 原來是負載均衡裝置的ip位址 根據均衡裝置設定的選擇web伺服器的規則選擇對應的web伺服器ip位址,這樣client就可以...