一条TCP连接时占用内存空间多少?

Posted linux大本营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一条TCP连接时占用内存空间多少?相关的知识,希望对你有一定的参考价值。

计算网络连接所占用的内存,需要知道申请哪些内存,以及一条TCP连接需要占用多少内存空间。sock_inode_cache、tcp_sock、dentry、file 内存对象占用多少空间?

一、内存分配关系

1.1物理内存分配关系

 

1.2TCP申请对象之间关系

 

二、实测内存开销

2.1客户端内核参数调整

# vi /etc/sysctl.conf
#端口号
net.ipv4.ip_local_port_range = 5000     65000
net.ipv4.tcp_tw_reuse = 0
#net.ipv4.tcp_tw_recycle        = 0
#time_wait状态
net.ipv4.tcp_max_tw_buckets = 60000
fs.file-max=210000
fs.nr_open=210000
 
 
# sysctl -p

#vim /etc/security/limits.conf
 
*       soft    nofile  1010485
*       hard    nofile  1011000

2.2服务端内核参数调整

# vi /etc/sysctl.conf
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096        131072  8388608
 
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096        16384   8388608
 
 
fs.file-max=2100000
fs.nr_open= 2100000
net.core.somaxconn = 1024
 
# sysctl -p

#vim /etc/security/limits.conf
 
*       soft    nofile  1010485
*       hard    nofile  1011000

服务端与客户端的缓存清理

echo "3" > /proc/sys/vm/drop_caches

相关视频推荐

tcpip,accept,11个状态,细枝末节的秘密,还有哪些你不知道

通过10道经典网络面试题,搞懂tcp/ip协议栈所有知识点

C/C++开发哪个方向更有前景,游戏,c++后端,网络处理,音视频开发,嵌入式开发,桌面开发

学习地址:c/c++ linux服务器开发/后台架构师

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

 

三、服务端开销计算

3.1 slab内存在连接前后输出以及计算

root@wy-virtual-machine:~# cat /proc/meminfo | grep Slab
Slab:             147724 kB
root@wy-virtual-machine:~# 
root@wy-virtual-machine:~# cat /proc/meminfo | grep Slab
Slab:             180136 kB
root@wy-virtual-machine:~# 
root@wy-virtual-machine:~# cat /proc/meminfo | grep Slab
Slab:             195816 kB

180136 - 147724 = 32412 / 10000 = 3.2412K ESTABLISH

195816 - 180136 = 15680 / 10000 = 1.568K CLOSE_WAIT

3.2 TCP对象占用内存

slabtop

 Active / Total Objects (% used)    : 877387 / 896605 (97.9%)
 Active / Total Slabs (% used)      : 31483 / 31483 (100.0%)
 Active / Total Caches (% used)     : 119 / 167 (71.3%)
 Active / Total Size (% used)       : 298213.95K / 308366.00K (96.7%)
 Minimum / Average / Maximum Object : 0.01K / 0.34K / 8.00K
 
  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
155210 155210 100%    0.02K    913      170      3652K lsm_file_cache
 99712  99712 100%    0.03K    779      128      3116K kmalloc-32
 90048  90048 100%    0.19K   4288       21     17152K dentry
 64480  64480 100%    0.12K   2015       32      8060K kernfs_node_cache
 60352  60352 100%    0.25K   3772       16     15088K filp
 56069  56069 100%    0.81K   2951       19     47216K sock_inode_cache
 50050  50050 100%    2.19K   3575       14    114400K TCP
 46949  45281  96%    0.20K   2471       19      9884K vm_area_struct
 34764  33034  95%    0.62K   2897       12     23176K inode_cache

2.19K(TCP)+ 0.25K(flip)+0.19K(dentry)+0.81K(sock_inode_cache) = 3.44K

TCP对象与slab内存比较 稍微差了一点点

CLOSE_WAIT状态开销也不小有1.56 k

3.3 TCP对象内存开销总结

缓存

大小

对象

sock_inode_cache

0.81K

struct socket_alloc

TCP

2.19K

struct tcp_sock

dentry

0.19K

struct dentry

file

0.25K

struct file

四、参数设置

4.1 linux打开文件限制配置

1)进程级别,单个进程打开个数 soft nofile 与 fs.nr_open

2)系统级别,fs.file-max,这个参数不限制root用户

  • 如果设置soft nofile 那么 hard nofile也要同步设置
  • 如果设置hard nofile ,fs.nr_open也要一起调整
  • 如果hard nofile设置比fs.nr_open大,会导致用户无法登录

设置参考

# vi /etc/sysctl.conf
fs.file-max=1100000
fs.nr_open= 1100000  #设置比hard大
 
#sysctl -p
 
# vi /etc/security/limits.conf
*       soft    nofile  1000000
*       hard    nofile  1000000

4.2 TCP内存设置

读写设置,每个TCP 建立连接大概3.44K,在设置总内存时乘上数量

#sysctl -a 
 
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096        131072  8388608
 
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096        16384   8388608

4.3 查看连接状态

# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      689/systemd-resolve 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      837/cupsd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      837/cupsd

4.4 其他

  • netstat -antp | grep EST |wc -l 查看单个状态并统计数量
  • slabtop 查看slab对象内存的申请情况,以及使用量

以上是关于一条TCP连接时占用内存空间多少?的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统支持的最大TCP连接是多少?

每个 TCP/IP 网络连接的 Linux 内核消耗多少内存?

TCP 连接是不是占用资源?

Android高效内存1:一张图片占用多少内存

tcp内存占用/socket内存占用

PHP数组到底占用多少内存空间