參數(shù)說(shuō)明
Linux內(nèi)核參數(shù)net.ipv4.tcp_mem
控制著TCP椔醣叮可以使用的內(nèi)存總量伤靠。這個(gè)參數(shù)的設(shè)置影響著系統(tǒng)的網(wǎng)絡(luò)性能和穩(wěn)定性,特別是在高負(fù)載網(wǎng)絡(luò)通信環(huán)境下啼染。tcp_mem
參數(shù)用來(lái)告訴內(nèi)核應(yīng)該如何反應(yīng)于不同的內(nèi)存壓力情況宴合,主要有三個(gè)值組成,分別控制以下幾個(gè)方面:
- 低水位線:當(dāng)TCP使用的內(nèi)存少于這個(gè)值時(shí)迹鹅,內(nèi)核認(rèn)為內(nèi)存充足卦洽,不會(huì)對(duì)TCP流量進(jìn)行限制。
- 壓力模式:當(dāng)TCP使用的內(nèi)存達(dá)到這個(gè)值時(shí)徒欣,內(nèi)核將進(jìn)入內(nèi)存壓力模式逐样,開(kāi)始對(duì)TCP緩沖區(qū)的大小進(jìn)行調(diào)節(jié),嘗試減少內(nèi)存使用打肝。
-
上限:當(dāng)TCP使用的內(nèi)存超過(guò)這個(gè)值時(shí)脂新,內(nèi)核會(huì)拒絕一些新的網(wǎng)絡(luò)連接請(qǐng)求,
dmesg
輸出TCP: out of memory
粗梭。
參數(shù)設(shè)置不合理争便,可能引發(fā)下述問(wèn)題:
-
內(nèi)存不足:如果
tcp_mem
設(shè)置得太低,可能導(dǎo)致TCP無(wú)法分配足夠的內(nèi)存断医,從而影響網(wǎng)絡(luò)性能滞乙,甚至拒絕新的連接請(qǐng)求奏纪。 -
過(guò)度使用內(nèi)存:如果
tcp_mem
設(shè)置得過(guò)高,可能會(huì)導(dǎo)致TCP使用過(guò)多內(nèi)存斩启,從而擠占了系統(tǒng)的其他部分或其他應(yīng)用序调,可能影響系統(tǒng)的穩(wěn)定性。 - 延遲和吞吐量:不適當(dāng)?shù)?code>tcp_mem設(shè)置可能導(dǎo)致網(wǎng)絡(luò)延遲增加或吞吐量下降兔簇,特別是在網(wǎng)絡(luò)負(fù)載重的情況下发绢。
查看參數(shù)
# 查看tcp_mem
cat /proc/sys/net/ipv4/tcp_mem
sysctl -a 2>/dev/null | grep net.ipv4.tcp_mem
# 查看頁(yè)面大小
getconf PAGESIZE
# 計(jì)算tcp_mem, 769668約3G
echo '769668 * 4 / 1024' | bc
# 查看內(nèi)存總量
grep "MemAvailable\|MemTotal" /proc/meminfo
參數(shù)設(shè)置
net.ipv4.tcp_mem
的值通常設(shè)置為三個(gè)數(shù)字垄琐,分別對(duì)應(yīng)上述的低水位線边酒、壓力模式和上限,這些值頁(yè)為單位(通常一頁(yè)為4KB)狸窘。
可以根據(jù)系統(tǒng)總內(nèi)存來(lái)調(diào)整tcp_mem
參數(shù)值墩朦,一個(gè)常見(jiàn)的起點(diǎn)是將低水位線設(shè)置為總內(nèi)存的5%,壓力模式為8%翻擒,上限為10%氓涣。高負(fù)載或高并發(fā)的網(wǎng)絡(luò)服務(wù)可能需要更高的內(nèi)存分配給TCP。
示例配置(假設(shè)系統(tǒng)有64GB內(nèi)存韭寸,頁(yè)面大小4KB):
echo "769668 1026224 1539336" > /proc/sys/net/ipv4/tcp_mem
sysctl net.ipv4.tcp_mem
其中春哨,769668(約3006MB),1026224(約4008MB)恩伺,1539336(約6013MB)分別代表低水位線、壓力模式和上限椰拒。
為確保系統(tǒng)重啟參數(shù)有效晶渠,需將net.ipv4.tcp_mem = 769668 1026224 1539336
寫(xiě)入/etc/sysctl.conf
中。
Linux內(nèi)核在系統(tǒng)初始化時(shí)按照(4.68 %燃观,6.25 %褒脯,9.37 %)設(shè)置的默認(rèn)參數(shù)值可以滿足大多數(shù)應(yīng)用場(chǎng)景,通常無(wú)需特別配置或調(diào)整缆毁。
https://elixir.bootlin.com/linux/v4.18.20/source/net/ipv4/tcp.c
static void __init tcp_init_mem(void)
{
unsigned long limit = nr_free_buffer_pages() / 16;
limit = max(limit, 128UL);
sysctl_tcp_mem[0] = limit / 4 * 3; /* 4.68 % */
sysctl_tcp_mem[1] = limit; /* 6.25 % */
sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2; /* 9.37 % */
}