linux如何分析TCP连接的内存占用情况

942 阅读2分钟

先查看服务器 PAGESIZE 设置

单位是 Byte,查出来是4096

[root@VM-20-7-centos ~]# getconf PAGESIZE

4096

查看 tcp 连接分配的缓冲区内存大小设置

单位是 Byte

cat /proc/sys/net/ipv4/tcp_rmem # TCP套接字的接收缓冲区大小

cat /proc/sys/net/ipv4/tcp_wmem # TCP套接字的发送缓冲区大小

查询结果:

[root@VM-20-7-centos ~]# cat /proc/sys/net/ipv4/tcp_rmem

4096 87380 6291456

[root@VM-20-7-centos ~]# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304

如上,每个设置都有三个数字,

  • 第1个数字是最小值

  • 第2个数字是默认值

  • 第3个数字是最大值

所以读缓冲区内存大小默认值约为 85KB(87380B=85K),写缓冲区大小的默认值为16KB, 一条TCP连接缓冲区:

最先大小为:4+4=8KB

默认大小为:16 + 85 = 101KB

最大大小为:6144K+4096K=10240K

查看 tcp 连接分配的内存 page 的阈值设置

[root@VM-20-7-centos ~]# cat /proc/sys/net/ipv4/tcp_mem

42501 56671 85002

与缓冲区大小设置类似,也是三个数字,但它们的含义有点不同:

第一个数字表示,当 tcp 使用的 page 数少于 45933 时,kernel 不对其进行任何的干预

第二个数字表示,当 tcp 使用的 page 数超过 61246 时,kernel 会进入 “memory pressure” 压力模式

第三个数字表示,当 tcp 使用的 pages 超过 91866 时(约 358M 内存),就会报:Out of socket memory

查看TCP连接时内存实际使用的page数

[root@VM-20-7-centos ~]# cat /proc/net/sockstat

sockets: used 214

TCP: inuse 22 orphan 0 tw 1 alloc 29 mem 2

UDP: inuse 2 mem 0

UDPLITE: inuse 0

RAW: inuse 0

FRAG: inuse 0 memory 0

如上图,mem 后面的 2 表示 page 数,即当前的 TCP连接实际占用内存大小为: 2*4 = 8 KB