论坛首页 综合技术论坛

节点间通讯的通道微调

浏览 3895 次
精华帖 (17) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-23  
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的参数了。
   发表时间:2009-09-23  
嘿嘿,微调又多了个手段,赞!
老大怎么那么多产呢?
0 请登录后投票
   发表时间:2009-09-23  
请问一下high_watermark 和 lower_watermark分别代表什么呀 ?设置它为131072的原因说明什么呀,谢谢 :)
0 请登录后投票
   发表时间:2009-09-24  
送给tcp port的数据是保存在 queue里面, 既然是queue都要个水位线,预防overflow, 如果数据超过水位线就会 (dist_)busy_port. 默认的水位线很小。 
0 请登录后投票
   发表时间:2009-09-24  
mryufeng 写道
送给tcp port的数据是保存在 queue里面, 既然是queue都要个水位线,预防overflow, 如果数据超过水位线就会 (dist_)busy_port. 默认的水位线很小。 


这个和TCP发送/接收缓冲区的那个low water/high water是一个事情吧,TCP默认接收缓冲区low water应该是一个字节,就是只要收到一个字节,就通知应用层有数据可读

老大给详细说说这个跟erlang的关系吧



0 请登录后投票
   发表时间:2009-09-24  
snd_buffer是socket在os kernel的buffer大小 水位线是在inet_driver里面的buffer大小 是完全2码事情。
0 请登录后投票
   发表时间:2010-01-26  
刚准备提问high_watermark是什么东西的,原来这么多同志也不明白呵呵,(dist_)busy_port.就是让远程节点等待,稍后再发数据?
0 请登录后投票
   发表时间:2010-01-27  
rain2005 写道
刚准备提问high_watermark是什么东西的,原来这么多同志也不明白呵呵,(dist_)busy_port.就是让远程节点等待,稍后再发数据?


dist_busy_port是你和远程节点的tcp链接已经busy阻塞了.
high_watermark是指inet_drv中tcp的buffer的水位上线,和操作系统的buffer不同.
0 请登录后投票
   发表时间:2010-03-21  
请问因特网上两个节点间的通信,Erlang是怎么解决穿NAT的问题的?谢谢~
0 请登录后投票
   发表时间:2010-03-23  
tcp直连, 你可以自己写个carrier代替系统的,来传输节点见的消息。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics