TCP快取設定及自調節

2021-09-24 22:12:41 字數 1380 閱讀 5401

工作的原因,同事在單條流的效能測試**現效能值低的問題,最後的問題點確認為快取設定不合理。為什麼要設定快取?如何設定快取?

讀快取的上限應該由tcp接收視窗的最大值確定,過大或過小的接收視窗(通告視窗),都會造成網路問題。傳送端可以傳送的一窗資料大小,由擁塞視窗(cwmd)和通告視窗的最小值決定,如果接收視窗過小,將使傳送端傳送速度緩慢,即使再理想的頻寬和網路狀況,也無法增加連線的吞吐。而如果接收視窗設定過大(試想節假日的高速公路上車輛無限制的湧入的情形),超過了網路所能承載的上限,將造成網路網路的擁塞和丟包,最後通過傳送端的擁塞控制,將連線流量控制在乙個合理範圍內。

net.core.rmem_default:全協議預設接收快取大小,對於tcp而言,會被tcp_rmem[1]覆蓋;

net.core.wmem_default:全協議預設傳送快取大小,對於tcp而言,會被tcp_wmem[1]覆蓋;

net.core.rmem_max:全協議接收快取最大值;

net.core.wmem_max:全協議傳送快取最大值。

在不使用so_sndbuf、so_rcvbuf套接字選項情況下,系統將使用上面的預設快取大小,對於tcp而言,預設的快取大小會被tcp_rmem[1]和tcp_wmem[1]覆蓋。

sk->sk_sndbuf = sysctl_tcp_wmem[1];

sk->sk_rcvbuf = sysctl_tcp_rmem[1];

通過套接字選項修改快取大小的行為如下:

val = min_t(u32, val, sysctl_rmem_max);

sk->sk_rcvbuf = max_t(u32, val * 2, sock_min_rcvbuf);

可以看到,如果快取設定大於rmem_max,則快取被修改為rmem_max;如果快取設定小於sock_min_rcvbuf,快取被修改為sock_min_rcvbuf(2kb)。另外,我們所設定的快取值被乘以2後設定,這裡猜想可能是因為這個快取值並不完全用於快取,它需要包含了資料結構大小。

linux通過net.ipv4.tcp_moderate_rcvbuf使能快取自調節功能,當系統tcp記憶體使用少的情況下,為連線分配更大的快取,而當系統tcp記憶體使用多的情況下,減少連線快取的分配大小。

總結如下:

1.當tcp記憶體使用低於tcp_mem[0],不超過連線快取上限的記憶體分配都會成功;

2.當tcp記憶體使用高於tcp_mem[2],連線快取的分配都會失敗;

3.當tcp記憶體使用高於tcp_mem[0]且低於tcp_mem[2]時,系統可能處於壓力狀態也可能處於非壓力狀態,壓力狀態下連線快取上限減少,非壓力狀態下連線快取上限增加,但保證低於tcp_rmem[0]或tcp_wmem[0]的快取成功。

flask 快取的設定及使用

from flask import flask from flask cache import cache from flask script import manager 快取型別 主機 埠 資料庫 建立快取物件 def index return 歡迎 建立快取檢視函式 timeout 指定快取有...

js函式的宣告及自呼叫

在js中函式通常擁有兩種命名方式 1.函式宣告 function a,b,c.函式宣告必須以function欄位開頭,是該函式的函式名,小括號中的a,b,c是該函式引用的引數,大括號中是該函式的具體方法。使用函式宣告的函式會提公升其優先度,因此我們可以在同一作用域的任何區域宣告,不會影響我們使用。2...

mysql 快取設定 mysql快取設定

伺服器端的設定 mysql優化首先要知道mysql快取是如何工作以及如何設定,下面是我從別人部落格上覆制過來了,初學者。mysql每個表都可以表示為磁碟上的乙個檔案,必須先開啟,後讀取。為了加快從檔案中讀取資料的過程,mysqld 對這些開啟檔案進行了快取,其最大數目由 etc mysqld.con...