转载:http://blog.yufeng.info/archives/36
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('xx@nd-desktop'), [{high_watermark, 131072}]).
另外要注意 nodeup nodedown可能会换了个tcp链接 要注意重新获取。
还有另外一种方法,设置所有gen_tcp的行为, 比如以下方法:
erl -kernel inet_default_connect_options '[{sndbuf, 1048576}, {high_watermark, 131072}]'
但是这个影响面非常大, 影响到正常tcp的参数了。