试图使用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连接流程,内存会持续性增长
3条答案
按热度按时间xiozqbni1#
使用你的配置文件,没有发现内存泄漏。
1、确定连接全部断开后再统计你的内存。
2、统计内存,请使用
ps -aux | grep nginx
看 tengine worker的内存占用是否持续增长即可。6za6bjd02#
实际的业务场景会有部分tcp连接重连的情景(上下线),所以模拟测试的过程,有一半的tcp连接一直保持连接,另外一半不断重连。
如果全部tcp连接断开之后,内存确实释放了
n7taea2i3#
内存统计信息还看了nginx work进程的详细信息(/proc/nginx_work_pid/status);和free -m 查看到的内存使用情况基本一致