從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就可以...