一個詭異容器內的tcp_max_tw_buckets核心引數的問題

济南小老虎發表於2024-06-13

一個詭異容器內的tcp_max_tw_buckets核心引數的問題


背景

自己端午節前一直嘴瓢, 一直在絮叨
更換了底層作業系統一定要對中介軟體進行詳盡的效能測試.
結果節後第二天就遇到了非常詭異的問題. 
上午以為是國產化銀河麒麟的問題. 
因為CentOS7的確沒有類似的問題. 
但是晚上飛機到濟南後, 感覺不太放心. 
想著能夠驗證一下. 但是因為docker hub 被牆
我這邊只能使用比較簡單的映象進行驗證

驗證思路

在centos7,centos8 以及銀河麒麟, openeuler 的多種作業系統上面
執行 kylinv10sp2的 x86 映象檢視核心引數資訊. 

然後驗證是否有所差異 

具體基本

docker load -i kylinv10sp2_x86.tar.gz 
docker run -it kylinv10sp2_x86:xxx bash
sysctl -a |grep tw 
sysctl -a |grep local_port 
進行簡單檢視. 

測試結果

宿主機系統 宿主機tw_buckets 容器內tw_buckets 宿主機local_port 容器內local_port
CentOS7 5000 無引數 10000-65000 32768-60999
CentOS8 262144 262144 10000-65000 32768-60999
銀河麒麟v10sp3 5000 131072 9000-65500 32768-60999
OpenEuler 262144 131072 9000-65500 32768-60999
Ubuntu2404 262144 262144 32768-60999 32768-60999

簡單結論

懷疑這裡兩個引數跟核心版本有著極大的關係
懷疑容器執行時內的tw和local_port range的引數是受限於特定核心版本的預設值.

centos7 使用的是 3.10的核心. 容器執行時 獲取不到這個 tw_buckets 的引數值.
centos8 使用 4.18的核心, 容器執行時 能夠獲取到 26萬的預設值.

銀河麒麟和openeuler 分別是 4.19和 5.10的核心, 獲取的是 13萬的預設值.
ubuntu採用的是 6.8的核心, 數值就是 26萬. 

理論上我升級一下centos7的核心也會出現 tw_buckets 到達26/13萬的情況. 
現階段看起來, 容器的執行不完全是build once run everywhere 
容器執行時也收到不同核心版本的影響. 
認為還是需要有一個更高層級的引數設定來影響容器的執行時. 

關於測試與驗證

JDK的引數, 系統核心的引數, 容器執行時的引數
各種各種的引數不盡相同, 建議還是需要完善進行驗證.
映象大幾十兆認為並不是很嚴重的問題. 
增加一下必要的debug和設定工具非常重要. 
不能為了減少幾十兆的空間, 就使用精簡版.
出現問題之後, 如果不是像BATJ 那樣的大量核心高手在
很容易導致長時間的系統不可用. 

理想總是很美好, 現實總是很骨感. 
為了生活,不能太骨感

今天有點累, 明天繼續總結動態設定容器內的核心引數. 

相關文章