CentOS升級核心與容器執行時核心引數的關係

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

CentOS升級核心與容器執行時核心引數的關係


背景

還是最近一些詭異的問題
想能夠根因分析一下.
所以繼續總結和驗證

CentOS7升級核心

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
檢視可以升級的核心

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
2024.6 的展示結果為:
可安裝的軟體包
elrepo-release.noarch                   7.0-6.el7.elrepo            elrepo-kernel
kernel-lt.x86_64                        5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-devel.x86_64                  5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-doc.noarch                    5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-headers.x86_64                5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-tools.x86_64                  5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-tools-libs.x86_64             5.4.277-1.el7.elrepo        elrepo-kernel
kernel-lt-tools-libs-devel.x86_64       5.4.277-1.el7.elrepo        elrepo-kernel
kernel-ml.x86_64                        6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-devel.x86_64                  6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-doc.noarch                    6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-headers.x86_64                6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-tools.x86_64                  6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-tools-libs.x86_64             6.9.4-1.el7.elrepo          elrepo-kernel
kernel-ml-tools-libs-devel.x86_64       6.9.4-1.el7.elrepo          elrepo-kernel
perf.x86_64                             5.4.277-1.el7.elrepo        elrepo-kernel
python-perf.x86_64                      5.4.277-1.el7.elrepo        elrepo-kernel

yum --disablerepo="*"  --enablerepo=elrepo-kernel install kernel-lt.x86_64  -y
yum --disablerepo="*"  --enablerepo=elrepo-kernel install kernel-ml.x86_64  -y


ml 版本是 main line 的含義 主線一般是大家都在開發的不太穩定. 
lt 是超期支援的版本.  

如果是生產, 建議使用lt 如果是測試可以選擇mt. 
grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

CentOS7 可以手工更換不同核心. 
cat /boot/grub2/grub.cfg  | grep ^menuentry
grub2-set-default '4.19.12-1.el7.elrepo.x86_64'
grub2-editenv list

CentOS8 切換核心的方法:
# 檢視當前
grubby --default-kernel
# 檢視所有
grubby --info=ALL   |grep ^kernel
# 設定
grubby --set-default /boot/vmlinuz-4.19.0-80.11.2.el8_0.x86_64   

比如我這邊的核心版本列表為:
kernel=/boot/vmlinuz-6.9.4-1.el7.elrepo.x86_64
kernel=/boot/vmlinuz-5.4.277-1.el7.elrepo.x86_64
kernel=/boot/vmlinuz-4.19.12-1.el7.elrepo.x86_64
kernel=/boot/vmlinuz-3.10.0-1160.el7.x86_64
檢視部分內容:
sysctl -a |wc -l
docker run -it --rm grafana/grafana-image-renderer sysctl -a |wc -l

核心引數數量資訊

核心版本 虛擬機器 容器 差值
3.10 1303 878 425
4.19 1482 1038 444
5.4 1423 978 445
6.9 1436 959 477

對部分引數的驗證

grep -ir net.ipv4.tcp_sack :
3.10.vm____.info:net.ipv4.tcp_sack = 1
4.19.docker.info:net.ipv4.tcp_sack = 1
4.19.vm____.info:net.ipv4.tcp_sack = 1
5.4.docker.info:net.ipv4.tcp_sack = 1
5.4.vm____.info:net.ipv4.tcp_sack = 1
6.9.docker.info:net.ipv4.tcp_sack = 1
6.9.vm____.info:net.ipv4.tcp_sack = 1

grep -ir net.ipv4.tcp_max_tw :
3.10.vm____.info:net.ipv4.tcp_max_tw_buckets = 5000
4.19.docker.info:net.ipv4.tcp_max_tw_buckets = 262144
4.19.vm____.info:net.ipv4.tcp_max_tw_buckets = 5000
5.4.docker.info:net.ipv4.tcp_max_tw_buckets = 262144
5.4.vm____.info:net.ipv4.tcp_max_tw_buckets = 5000
6.9.docker.info:net.ipv4.tcp_max_tw_buckets = 262144
6.9.vm____.info:net.ipv4.tcp_max_tw_buckets = 5000

grep -ir net.ipv4.ip_local_port : 
3.10.docker.info:net.ipv4.ip_local_port_range = 32768   60999
3.10.vm____.info:net.ipv4.ip_local_port_range = 9000        65500
4.19.docker.info:net.ipv4.ip_local_port_range = 32768   60999
4.19.vm____.info:net.ipv4.ip_local_port_range = 9000        65500
5.4.docker.info:net.ipv4.ip_local_port_range = 32768    60999
5.4.vm____.info:net.ipv4.ip_local_port_range = 9000 65500
6.9.docker.info:net.ipv4.ip_local_port_range = 32768    60999
6.9.vm____.info:net.ipv4.ip_local_port_range = 9000 65500

感悟

net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_sack
部分引數在 3.10 的版本沒有傳遞到容器內, 的確是存在bug
容器自己執行不會將配置好的核心引數傳遞進容器內
需要自己進行指定. 

關於 
net.ipv4.tcp_max_tw_buckets 和 net.ipv4.ip_local_port_range
應該是跟廠商有關係. 
廠商編譯的時候會選擇一個特定的核心引數值
銀河麒麟的 tw_bucket 就是 13萬. 繼承在openeuler

紅帽就比較保守一些. 
所以核心有bug 核心還有自己的脾氣性格. 

相關文章