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時意味着內存壓力較大