1. 程式人生 > >系統技術非業餘研究 » 節點間通訊的通道微調

系統技術非業餘研究 » 節點間通訊的通道微調

erlang節點間通訊是可以配置的,預設的是inet_tcp 。當2個節點要溝通的時候,net_kernel模組會負責建立必要的連線。 inet_tcp會呼叫底層的gen_tcp進行資料傳送接受。 rpc或者節點間的訊息互動都是通過這個port出去的。

在分佈節點間,有時候會有大量的訊息流動,那麼所有的訊息都是通過這個port出去 進來,所以這個port的效能極大的影響了節點間通訊的效率。那麼有時候, 我們會想微調這個port的引數,根據業務的特點實現效率最大化,但是port如何得到呢?

node_port(Node)->
    {_, Owner}=lists:keyfind(owner, 1, element(2, net_kernel:node_info(Node))),
    hd([P|| P<-erlang:ports(), erlang:port_info(P, connected) == {connected,Owner}])

有了Port, 那麼我們就可以設定tcp port的水位線,buffer等等。

inet:setopts(node_port('[email protected]'), [{high_watermark, 131072}]).

另外要注意 nodeup nodedown可能會換了個tcp連結 要注意重新獲取。

還有另外一種方法,設定所有gen_tcp的行為, 比如以下方法:

erl -kernel inet_default_connect_options '[{sndbuf, 1048576}, {high_watermark, 131072}]'

但是這個影響面非常大, 影響到正常tcp的引數了。

Post Footer automatically generated by wp-posturl plugin for wordpress.

No related posts.