tengine实现tcp proxy,内存持续增长问题!

osh3o9ms  于 2021-12-26  发布在  Java
关注(0)|答案(3)|浏览(475)

试图使用tengine实现TCP Proxy, 在工作过程中client与server之间必须通过proxy维持tcp长连接

  • 测试过程中发现proxy服务的内存消耗持续增长,想请问一下,tengine stream模块在四层代理业务场景下,是否可能存在内存泄漏的问题?

测试环境

  • 客户端通过两台普通window pc模拟tcp客户端,分别发起1.5w连接测试

  • proxy服务为tengine 四层代理服务(未做任何特殊处理逻辑,直接转发到upstream)

  • proxy服务部署环境:

  • aliyun ECS服务器 2核4G

  • tengine-2.3.2

  • Linux version 3.10.0-1062.1.2.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) )

  • linux tcp相关参数调整

  • rmem_default -> 4096

  • wmem_default ->4096

  • ip_local_port_range -> 5535 65535

  • somaxconn -> 10000

  • nginx.conf配置如下:

user    root;

# daemon  off;

worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

worker_rlimit_nofile    65535;

# error_log   /dev/stdout error;

events {
        use     epoll;
        worker_connections  65535;
        multi_accept    on;
}

stream {
        tcp_nodelay on;
        upstream backend_chash {
                server 10.0.3.220:30022;
                # keepalive 1024;
        }

        server {
                listen 80 so_keepalive=on;
                proxy_socket_keepalive on;  #和so_keepalive配合使用

                access_log off;

                proxy_pass      backend_chash;
        }
}
  • 测试过程记录如下

  • 如此反复断开tcp连接、新建tcp连接流程,内存会持续性增长
xiozqbni

xiozqbni1#

使用你的配置文件,没有发现内存泄漏。
1、确定连接全部断开后再统计你的内存。
2、统计内存,请使用 ps -aux | grep nginx 看 tengine worker的内存占用是否持续增长即可。

6za6bjd0

6za6bjd02#

实际的业务场景会有部分tcp连接重连的情景(上下线),所以模拟测试的过程,有一半的tcp连接一直保持连接,另外一半不断重连。
如果全部tcp连接断开之后,内存确实释放了

n7taea2i

n7taea2i3#

内存统计信息还看了nginx work进程的详细信息(/proc/nginx_work_pid/status);和free -m 查看到的内存使用情况基本一致

相关问题