一、概述
1.1 背景介紹
線上問(wèn)題一來(lái),很多人第一反應(yīng)是改sysctl。連接慢改somaxconn,內(nèi)存緊張改swappiness,磁盤(pán)抖動(dòng)改dirty_ratio,網(wǎng)卡丟包改各種net.core.*。參數(shù)不是不能改,問(wèn)題是很多改法只在某個(gè)場(chǎng)景下成立,一旦脫離上下文,最容易把局部最優(yōu)改成全局事故。
這篇文章只講一個(gè)原則:先明確問(wèn)題在哪一層,再動(dòng)對(duì)應(yīng)參數(shù)。如果還沒(méi)確認(rèn)是網(wǎng)絡(luò)、調(diào)度、內(nèi)存、回寫(xiě)還是連接隊(duì)列問(wèn)題,先別碰sysctl。參數(shù)調(diào)優(yōu)最大的坑不是“改了沒(méi)效果”,而是“短期看起來(lái)有效,后面把故障放大了”。
1.2 技術(shù)特點(diǎn)
不追求參數(shù)大全:只講生產(chǎn)里最容易被誤改、最容易造成副作用的項(xiàng)。
強(qiáng)調(diào)適用前提:每個(gè)參數(shù)都給“什么時(shí)候該看、什么時(shí)候別動(dòng)”。
覆蓋回滾與驗(yàn)證:參數(shù)改前備份、改后驗(yàn)證、異常時(shí)如何回退。
1.3 適用場(chǎng)景
場(chǎng)景一:業(yè)務(wù)剛上線,想做基礎(chǔ)內(nèi)核參數(shù)基線。
場(chǎng)景二:線上出現(xiàn) backlog、swap、回寫(xiě)卡頓、丟包、conntrack 壓力,準(zhǔn)備做針對(duì)性調(diào)優(yōu)。
場(chǎng)景三:團(tuán)隊(duì)里經(jīng)常直接復(fù)制網(wǎng)上的sysctl.conf,需要一份能落地的避坑清單。
1.4 環(huán)境要求
| 組件 | 版本要求 | 說(shuō)明 |
|---|---|---|
| 操作系統(tǒng) | Ubuntu 20.04+ 、Debian 11+、CentOS 7、Rocky Linux 8/9 | 不同內(nèi)核參數(shù)是否存在會(huì)有差異 |
| 權(quán)限 | root | 修改sysctl需要 root |
| 配套工具 | sysstat 、ss、conntrack-tools、ethtool、procps-ng | 調(diào)優(yōu)前后需要驗(yàn)證 |
| 變更流程 | 有維護(hù)窗口 | 關(guān)鍵參數(shù)別在業(yè)務(wù)高峰直接改 |
二、詳細(xì)步驟
2.1 準(zhǔn)備工作
2.1.1 系統(tǒng)檢查
cat /etc/os-release uname -r sysctl -a 2>/dev/null | head -20 ss -s free -h vmstat 1 5
2.1.2 安裝依賴
Ubuntu / Debian:
sudo apt update sudo apt install -y sysstat conntrack ethtool procps iproute2
CentOS / Rocky / RHEL:
sudo yum install -y sysstat conntrack-tools ethtool procps-ng iproute
2.1.3 先備份當(dāng)前參數(shù)
sudo mkdir -p /srv/ops/sysctl-backup sudo sysctl -a 2>/dev/null | sort > /srv/ops/sysctl-backup/sysctl-$(date +%F-%H%M%S).txt sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog vm.swappiness vm.dirty_ratio vm.dirty_background_ratio
2.2 核心配置
2.2.1 第一步:先定義生產(chǎn)基線
# 文件路徑:/etc/sysctl.d/99-prod-baseline.conf net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.ip_local_port_range = 10240 65000 net.netfilter.nf_conntrack_max = 262144 vm.swappiness = 10 vm.dirty_background_ratio = 5 vm.dirty_ratio = 20 fs.file-max = 2097152 kernel.pid_max = 4194304
這些值不是通用真理,只是一個(gè)更穩(wěn)的起點(diǎn)。真正上線前,還得結(jié)合連接數(shù)、磁盤(pán)吞吐、內(nèi)存大小和業(yè)務(wù)模型驗(yàn)證。
2.2.2 第二步:準(zhǔn)備回滾和驗(yàn)證腳本
# 文件路徑:prometheus/rules/linux-sysctl-risk.yml
groups:
-name:linux-sysctl-risk
rules:
-alert:NodeConntrackUsageHigh
expr:node_nf_conntrack_entries/node_nf_conntrack_entries_limit>0.8
for:5m
labels:
severity:warning
-alert:NodeSwapActivityHigh
expr:rate(node_vmstat_pswpin[5m])+rate(node_vmstat_pswpout[5m])>100
for:3m
labels:
severity:warning
-alert:NodeDiskWritebackPressure
expr:node_memory_Dirty_bytes/node_memory_MemTotal_bytes>0.1
for:5m
labels:
severity:warning
2.2.3 第三步:按問(wèn)題類(lèi)型動(dòng)參數(shù)
網(wǎng)絡(luò)連接積壓時(shí)先看:
ss -lnt ss -s sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog
內(nèi)存和 swap 時(shí)先看:
free -h vmstat 1 10 sysctl vm.swappiness vm.overcommit_memory
磁盤(pán)回寫(xiě)時(shí)先看:
cat /proc/meminfo | egrep'Dirty|Writeback' sysctl vm.dirty_ratio vm.dirty_background_ratio
2.3 啟動(dòng)和驗(yàn)證
2.3.1 啟動(dòng)服務(wù)
sudo sysctl --system sudo systemctl restart systemd-sysctl sudo systemctl status systemd-sysctl --no-pager
2.3.2 功能驗(yàn)證
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog vm.swappiness vm.dirty_ratio vm.dirty_background_ratio ss -s free -h cat /proc/meminfo | egrep'Dirty|Writeback'
三、示例代碼和配置
3.1 完整配置示例
3.1.1 主配置文件
# 文件路徑:/etc/sysctl.d/99-prod-baseline.conf net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.ip_local_port_range = 10240 65000 net.netfilter.nf_conntrack_max = 262144 vm.swappiness = 10 vm.dirty_background_ratio = 5 vm.dirty_ratio = 20 fs.file-max = 2097152
3.1.2 輔助腳本
#!/usr/bin/env bash set-euo pipefail BACKUP_DIR="/srv/ops/sysctl-backup" mkdir -p"$BACKUP_DIR" STAMP="$(date +%F-%H%M%S)" BACKUP_FILE="$BACKUP_DIR/sysctl-$STAMP.txt" sysctl -a 2>/dev/null | sort >"$BACKUP_FILE" echo"backup saved to$BACKUP_FILE" echo"current key values:" sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.netfilter.nf_conntrack_max vm.swappiness vm.dirty_ratio vm.dirty_background_ratio
3.2 實(shí)際應(yīng)用案例
案例一:把vm.dirty_ratio調(diào)太高,結(jié)果把數(shù)據(jù)庫(kù)寫(xiě)抖了
場(chǎng)景描述:為了追求順序?qū)懲掏?,某臺(tái)數(shù)據(jù)庫(kù)主機(jī)把vm.dirty_ratio從默認(rèn)值調(diào)到40。峰值時(shí)延明顯抖動(dòng),業(yè)務(wù)間歇性超時(shí)。
實(shí)現(xiàn)代碼:
cat /proc/meminfo | egrep'Dirty|Writeback' iostat -xz 1 10 sysctl vm.dirty_ratio vm.dirty_background_ratio
運(yùn)行結(jié)果:
Dirty: 7348224 kB Writeback: 612384 kB
臟頁(yè)堆太多,前臺(tái)線程被迫參與同步回寫(xiě),結(jié)果 RT 被直接拖高。回滾到:
sudo sysctl -w vm.dirty_background_ratio=5 sudo sysctl -w vm.dirty_ratio=20
案例二:盲目把vm.swappiness=1,結(jié)果低峰期都回收不動(dòng)緩存
場(chǎng)景描述:某緩存節(jié)點(diǎn)為了“絕不 swap”,一刀切把所有機(jī)器都改成vm.swappiness=1。短期看 swap 下降了,但低峰期頁(yè)緩存回收變差,磁盤(pán)讀放大更嚴(yán)重。
實(shí)現(xiàn)步驟:
看內(nèi)存和 swap
free -h vmstat 1 10
看業(yè)務(wù) RT 與 cache
cat /proc/meminfo | egrep'Cached|MemAvailable|Swap'
回到更穩(wěn)的值并觀察
sudo sysctl -w vm.swappiness=10
案例三:盲目調(diào)大nf_conntrack_max,結(jié)果內(nèi)存先被連接跟蹤表吃掉
場(chǎng)景描述:某入口層機(jī)器連接數(shù)暴漲,團(tuán)隊(duì)第一反應(yīng)是把nf_conntrack_max從262144直接拉到2097152。連接告警短暫消失,但主機(jī)內(nèi)存持續(xù)升高。
實(shí)現(xiàn)步驟:
看 conntrack 使用率
conntrack -S cat /proc/sys/net/netfilter/nf_conntrack_count sysctl net.netfilter.nf_conntrack_max
看內(nèi)存和 slab
free -h slabtop -o | head -20
對(duì)比業(yè)務(wù)連接模型
ss -s
運(yùn)行結(jié)果:
nf_conntrack_count: 1380247 nf_conntrack_max: 2097152
根因不是“表太小”,而是短連接和異常重試把連接跟蹤表?yè)未罅?。直接擴(kuò)表只是把問(wèn)題從“連接失敗”換成“內(nèi)存膨脹”。處理動(dòng)作:
優(yōu)先治理短連接和異常重試
按峰值連接數(shù)重新估算表大小
在合理范圍內(nèi)調(diào)大nf_conntrack_max,不是無(wú)限放大
這類(lèi)參數(shù)調(diào)整必須把內(nèi)存成本一起算進(jìn)去,不然入口沒(méi)先掛,節(jié)點(diǎn)先被拖死。
四、最佳實(shí)踐和注意事項(xiàng)
4.1 最佳實(shí)踐
4.1.1 性能優(yōu)化
優(yōu)化點(diǎn)一:參數(shù)只在有證據(jù)時(shí)改。somaxconn不會(huì)修復(fù)應(yīng)用 accept 太慢,swappiness也不會(huì)修復(fù)內(nèi)存泄漏。
優(yōu)化點(diǎn)二:改參數(shù)前留快照,改參數(shù)后留驗(yàn)證數(shù)據(jù),至少保留ss -s、free -h、iostat、核心sysctl輸出。
優(yōu)化點(diǎn)三:基線配置走配置管理,別讓每臺(tái)機(jī)器都手工改。
4.1.2 安全加固
安全措施一:生產(chǎn)參數(shù)文件落到/etc/sysctl.d/,用配置管理系統(tǒng)統(tǒng)一發(fā)版。
安全措施二:禁止直接復(fù)制網(wǎng)絡(luò)上“萬(wàn)能優(yōu)化參數(shù)大全”。
安全措施三:變更窗口內(nèi)保留回滾腳本和備份文件。
4.1.3 高可用配置
HA 方案一:參數(shù)分層管理,網(wǎng)絡(luò)基線、內(nèi)存基線、容器節(jié)點(diǎn)基線分開(kāi)。
HA 方案二:把 sysctl 變更納入 CMDB 或 Git 倉(cāng)庫(kù)審計(jì)。
備份策略:每次參數(shù)變更前自動(dòng)導(dǎo)出完整sysctl -a。
4.2 注意事項(xiàng)
4.2.1 配置注意事項(xiàng)
警告:老文章里經(jīng)常出現(xiàn)的net.ipv4.tcp_tw_recycle早就不適合現(xiàn)代環(huán)境??吹竭@類(lèi)配置先刪,不要照抄。
somaxconn只決定內(nèi)核層監(jiān)聽(tīng)隊(duì)列上限,應(yīng)用本身 backlog 太小同樣會(huì)限制住
nf_conntrack_max調(diào)大前,先算內(nèi)存成本
dirty_ratio調(diào)太高,經(jīng)常會(huì)把“吞吐更大”換成“長(zhǎng)尾更差”
4.2.2 常見(jiàn)錯(cuò)誤
| 錯(cuò)誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| 改了somaxconn仍然丟連接 | 應(yīng)用監(jiān)聽(tīng) backlog 沒(méi)改、accept 太慢 | 同時(shí)看應(yīng)用參數(shù)和 listen queue |
| 調(diào)低swappiness后內(nèi)存仍緊張 | 根因是泄漏或 limit 太小 | 先查內(nèi)存根因 |
| 調(diào)大nf_conntrack_max后主機(jī)更吃內(nèi)存 | conntrack 表本身占內(nèi)存 | 先算表項(xiàng)成本和峰值連接數(shù) |
4.2.3 兼容性問(wèn)題
版本兼容:參數(shù)在不同內(nèi)核版本下是否存在、默認(rèn)值是多少都可能不同。
平臺(tái)兼容:容器節(jié)點(diǎn)、數(shù)據(jù)庫(kù)節(jié)點(diǎn)、網(wǎng)關(guān)節(jié)點(diǎn)不適合共用一套激進(jìn)參數(shù)。
組件依賴:應(yīng)用層 backlog、連接池、線程模型、磁盤(pán)基線會(huì)直接影響參數(shù)效果。
五、故障排查和監(jiān)控
5.1 故障排查
5.1.1 日志查看
sudo journalctl -u systemd-sysctl --since"1 hour ago" sudo dmesg -T | egrep -i'conntrack|memory|oom|tcp|nf_'
5.1.2 常見(jiàn)問(wèn)題排查
問(wèn)題一:SYN backlog 看起來(lái)不夠,怎么確認(rèn)
ss -lnt netstat -s | egrep -i'listen|SYN' sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog
解決方案:先看 listen queue 是否真的滿,再?zèng)Q定調(diào)somaxconn和tcp_max_syn_backlog。
問(wèn)題二:調(diào)完swappiness后還是頻繁換頁(yè)
free -h vmstat 1 10 ps -eo pid,cmd,%mem,rss --sort=-rss | head -20
解決方案:根因通常是內(nèi)存不足或泄漏,不是參數(shù)本身。
問(wèn)題三:conntrack 表總滿
癥狀:入口層連接多、NAT 多,偶發(fā)建立連接失敗
排查:
conntrack -S sysctl net.netfilter.nf_conntrack_max cat /proc/sys/net/netfilter/nf_conntrack_count
解決:先優(yōu)化連接生命周期,再考慮調(diào)表大小
5.1.3 調(diào)試模式
sysctl -a 2>/dev/null | egrep'somaxconn|swappiness|dirty_ratio|nf_conntrack'
5.2 性能監(jiān)控
5.2.1 關(guān)鍵指標(biāo)監(jiān)控
ss -s free -h cat /proc/meminfo | egrep'Dirty|Writeback' conntrack -S
5.2.2 監(jiān)控指標(biāo)說(shuō)明
| 指標(biāo)名稱(chēng) | 正常范圍 | 告警閾值 | 說(shuō)明 |
|---|---|---|---|
| conntrack 使用率 | < 70% | > 80% 持續(xù)5m | 高了先查連接模型 |
| swap 活躍度 | ≈ 0 | > 100 pages/s 持續(xù)3m | 先查內(nèi)存根因 |
| 臟頁(yè)比例 | < 5% | > 10% 持續(xù)5m | 寫(xiě)回壓力正在積累 |
| listen drop | 0 | 持續(xù)增長(zhǎng) | 監(jiān)聽(tīng)隊(duì)列或應(yīng)用 accept 有問(wèn)題 |
5.2.3 監(jiān)控告警配置
groups: -name:linux-sysctl-risk rules: -alert:NodeConntrackUsageHigh expr:node_nf_conntrack_entries/node_nf_conntrack_entries_limit>0.8 for:5m -alert:NodeSwapActivityHigh expr:rate(node_vmstat_pswpin[5m])+rate(node_vmstat_pswpout[5m])>100 for:3m -alert:NodeDiskWritebackPressure expr:node_memory_Dirty_bytes/node_memory_MemTotal_bytes>0.1 for:5m
5.3 備份與恢復(fù)
5.3.1 備份策略
#!/usr/bin/env bash set-euo pipefail mkdir -p /srv/ops/sysctl-backup sysctl -a 2>/dev/null | sort > /srv/ops/sysctl-backup/sysctl-$(date +%F-%H%M%S).txt
5.3.2 恢復(fù)流程
確認(rèn)要回滾的版本:ls -1 /srv/ops/sysctl-backup | tail -5
恢復(fù)配置文件:sudo cp /srv/ops/sysctl-backup/99-prod-baseline.conf.bak /etc/sysctl.d/99-prod-baseline.conf
重新加載:sudo sysctl --system
驗(yàn)證:sysctl net.core.somaxconn vm.swappiness vm.dirty_ratio
六、總結(jié)
6.1 技術(shù)要點(diǎn)回顧
sysctl不是救火按鈕,必須先做問(wèn)題定性
dirty_ratio、swappiness、nf_conntrack_max都有明顯副作用
參數(shù)要配合業(yè)務(wù)模型、資源基線和監(jiān)控一起看
任何變更都要能回滾
6.2 進(jìn)階學(xué)習(xí)方向
Linux 內(nèi)核網(wǎng)絡(luò)棧參數(shù)
內(nèi)存回收和寫(xiě)回機(jī)制
Kubernetes 節(jié)點(diǎn) sysctl 管理
6.3 參考資料
Linux kernel sysctl 文檔- 內(nèi)核參數(shù)官方說(shuō)明
Linux proc 文件系統(tǒng)文檔-/proc觀測(cè)入口
Prometheus Alerting Rules- 告警規(guī)則語(yǔ)法
附錄
A. 命令速查表
sysctl -a 2>/dev/null | sort # 導(dǎo)出當(dāng)前參數(shù) sysctl net.core.somaxconn vm.swappiness # 查看關(guān)鍵參數(shù) ss -s # 看連接狀態(tài) conntrack -S # 看 conntrack 使用情況 cat /proc/meminfo | egrep'Dirty|Writeback' # 看回寫(xiě)壓力
B. 配置參數(shù)詳解
net.core.somaxconn:監(jiān)聽(tīng) socket backlog 上限
net.ipv4.tcp_max_syn_backlog:半連接隊(duì)列大小
vm.swappiness:匿名頁(yè)與頁(yè)緩存回收傾向
vm.dirty_ratio:前臺(tái)同步刷臟頁(yè)觸發(fā)閾值
C. 術(shù)語(yǔ)表
| 術(shù)語(yǔ) | 英文 | 解釋 |
|---|---|---|
| 半連接隊(duì)列 | SYN backlog | 握手未完成前的等待隊(duì)列 |
| 臟頁(yè) | Dirty Pages | 已修改但尚未寫(xiě)回磁盤(pán)的頁(yè) |
| 連接跟蹤 | Conntrack | Linux 內(nèi)核連接狀態(tài)跟蹤表 |
| 過(guò)量提交 | Overcommit | 內(nèi)核對(duì)內(nèi)存承諾的分配策略 |
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1476瀏覽量
43095 -
Linux
+關(guān)注
關(guān)注
88文章
11818瀏覽量
219573
原文標(biāo)題:Linux 內(nèi)核參數(shù)調(diào)優(yōu)避坑指南:哪些 sysctl 值不能亂改
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些
Linux用電功耗調(diào)優(yōu)的筆記分享
PCB設(shè)計(jì)避坑指南
linux網(wǎng)絡(luò)棧監(jiān)控及調(diào)優(yōu):數(shù)據(jù)接收
Linux性能調(diào)優(yōu)常見(jiàn)工具和堆棧解析
jvm調(diào)優(yōu)參數(shù)
linux內(nèi)核常用調(diào)優(yōu)參數(shù)
TAS58xx系列通用調(diào)優(yōu)指南
MCT8315A調(diào)優(yōu)指南
MCT8316A調(diào)優(yōu)指南
MCF8316A調(diào)優(yōu)指南
Linux內(nèi)核參數(shù)調(diào)優(yōu)避坑指南
評(píng)論