浏览 3895 次
锁定老帖子 主题:节点间通讯的通道微调
精华帖 (17) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-23
在分布节点间,有时候会有大量的消息流动,那么所有的消息都是通过这个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的参数了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-23
嘿嘿,微调又多了个手段,赞!
老大怎么那么多产呢? |
|
返回顶楼 | |
发表时间:2009-09-23
请问一下high_watermark 和 lower_watermark分别代表什么呀 ?设置它为131072的原因说明什么呀,谢谢 :)
|
|
返回顶楼 | |
发表时间:2009-09-24
送给tcp port的数据是保存在 queue里面, 既然是queue都要个水位线,预防overflow, 如果数据超过水位线就会 (dist_)busy_port. 默认的水位线很小。
|
|
返回顶楼 | |
发表时间:2009-09-24
mryufeng 写道 送给tcp port的数据是保存在 queue里面, 既然是queue都要个水位线,预防overflow, 如果数据超过水位线就会 (dist_)busy_port. 默认的水位线很小。
这个和TCP发送/接收缓冲区的那个low water/high water是一个事情吧,TCP默认接收缓冲区low water应该是一个字节,就是只要收到一个字节,就通知应用层有数据可读 老大给详细说说这个跟erlang的关系吧 |
|
返回顶楼 | |
发表时间:2009-09-24
snd_buffer是socket在os kernel的buffer大小 水位线是在inet_driver里面的buffer大小 是完全2码事情。
|
|
返回顶楼 | |
发表时间:2010-01-26
刚准备提问high_watermark是什么东西的,原来这么多同志也不明白呵呵,(dist_)busy_port.就是让远程节点等待,稍后再发数据?
|
|
返回顶楼 | |
发表时间:2010-01-27
rain2005 写道 刚准备提问high_watermark是什么东西的,原来这么多同志也不明白呵呵,(dist_)busy_port.就是让远程节点等待,稍后再发数据? dist_busy_port是你和远程节点的tcp链接已经busy阻塞了. high_watermark是指inet_drv中tcp的buffer的水位上线,和操作系统的buffer不同. |
|
返回顶楼 | |
发表时间:2010-03-21
请问因特网上两个节点间的通信,Erlang是怎么解决穿NAT的问题的?谢谢~
|
|
返回顶楼 | |
发表时间:2010-03-23
tcp直连, 你可以自己写个carrier代替系统的,来传输节点见的消息。
|
|
返回顶楼 | |