10.1 缓存管理简介

        TCP连接在进行数据传输时内存的占用主要发生在:

(1)发送队列(包括Small Queue)

(2)接收队列(包括乱序队列、prequeue队列、异步等待队列、backlog队列)

        TCP的内存资源主要有:

(1)tcp_mem(3个INTEGER变量,由net.ipv4.tcp_mem内核参数配置):low,pressure,high

low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出 pressure状态。

high:允许所有tcp sockets用于排队缓冲数据报的页面量(如果超过这个值,TCP 连接将被拒绝)。

(2)tcp_wmem(3个INTEGER变量,由net.ipv4.tcp_wmem内核参数配置): min,default,max。这是为TCP socket预留用于发送缓冲的内存。

(3)tcp_rmem(3个INTEGER变量,由net.ipv4.tcp_rmem内核参数配置): min,default,max。这是为TCP socket预留用于接收缓冲的内存。

        TCP缓存管理的任务是有效使用这些内存资源。

        下面介绍一下 struct sock数据结构中与缓存管理相关的部分成员:

int sk_forward_alloc:预分配内存, 即TCP连接的内存cache

int sk_rcvbuf:接收缓存大小;可以使用SO_RCVBUF socket选项设置

int sk_sndbuf:发送缓存大小;可以使用SO_SNDBUF socket选项设置

int sk_wmem_queued:发送队列中所有skb所占内存大小

atomic_t    sk_wmem_alloc:发送缓存已经使用的字节数(包括发送到底层IP发送队列中的skb所占内存)

atomic_t    sk_rmem_alloc:接收缓存已经使用的字节数

        全局变量:

atomic_long_t tcp_memory_allocated:全部已分配的TCP内存的字节数

int tcp_memory_pressure:为1时意味着内存压力较大

你可能感兴趣的:(网络,tcp,linux内核)