erlang gen:tcp 消息堆积问题

在服务器上线期间,遇到gen_tcp:send导致玩家进程消息堆积,最多达5W+条,引发内存过大问题。深入代码发现,关闭的port导致port_command阻塞。解决方案包括:增加nosuspend参数以应对繁忙端口,以及为发送进程设置独立的结束机制,确保玩家进程退出时能强制结束发送进程。根据R18文档,该问题可能已在R18版本中修复。
摘要由CSDN通过智能技术生成


一:问题

上一次服务器上线,碰到了个问题,玩家进程在gen_tcp:send时消息堆积,有十多个玩家消息堆积了5W+条,服务器内存过大

二:原因

我们追一下gen_tcp:send的代码

send(S, Packet) when is_port(S) ->    
    case inet_db:lookup_socket(S) of
        {ok, Mod} ->                  %Mod可能是inet_tcp.erl 或者  inet6_tcp.erl
            Mod:send(S, Packet);
        Error ->
            Error
    end.

继续向下追,追到 inet_tcp:send

send(Socket, Packet, Opts) -> prim_inet:send(Socket, Packet, Opts).
继续,追到prim_inet:send

 1 send(S, Data, OptList) when is_port(S), is_list(OptList) ->
 2     ?DBG_FORMAT("prim_inet:send(~p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值