一、概述
1.1 背景介紹
線上問題一來,很多人第一反應(yīng)是改sysctl。連接慢改somaxconn,內(nèi)存緊張改swappiness,磁盤抖動改dirty_ratio,網(wǎng)卡丟包改各種net.core.*。參數(shù)不是不能改,問題是很多改法只在某個場景下成立,一旦脫離上下文,最容易把局部最優(yōu)改成全局事故。
這篇文章只講一個原則:先明確問題在哪一層,再動對應(yīng)參數(shù)。如果還沒確認是網(wǎng)絡(luò)、調(diào)度、內(nèi)存、回寫還是連接隊列問題,先別碰sysctl。參數(shù)調(diào)優(yōu)最大的坑不是“改了沒效果”,而是“短期看起來有效,后面把故障放大了”。
1.2 技術(shù)特點
不追求參數(shù)大全:只講生產(chǎn)里最容易被誤改、最容易造成副作用的項。
強調(diào)適用前提:每個參數(shù)都給“什么時候該看、什么時候別動”。
覆蓋回滾與驗證:參數(shù)改前備份、改后驗證、異常時如何回退。
1.3 適用場景
場景一:業(yè)務(wù)剛上線,想做基礎(chǔ)內(nèi)核參數(shù)基線。
場景二:線上出現(xiàn) backlog、swap、回寫卡頓、丟包、conntrack 壓力,準備做針對性調(diào)優(yōu)。
場景三:團隊里經(jīng)常直接復(fù)制網(wǎng)上的sysctl.conf,需要一份能落地的避坑清單。
1.4 環(huán)境要求
| 組件 | 版本要求 | 說明 |
|---|---|---|
| 操作系統(tǒng) | Ubuntu 20.04+ 、Debian 11+、CentOS 7、Rocky Linux 8/9 | 不同內(nèi)核參數(shù)是否存在會有差異 |
| 權(quán)限 | root | 修改sysctl需要 root |
| 配套工具 | sysstat 、ss、conntrack-tools、ethtool、procps-ng | 調(diào)優(yōu)前后需要驗證 |
| 變更流程 | 有維護窗口 | 關(guān)鍵參數(shù)別在業(yè)務(wù)高峰直接改 |
二、詳細步驟
2.1 準備工作
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
這些值不是通用真理,只是一個更穩(wěn)的起點。真正上線前,還得結(jié)合連接數(shù)、磁盤吞吐、內(nèi)存大小和業(yè)務(wù)模型驗證。
2.2.2 第二步:準備回滾和驗證腳本
# 文件路徑: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 第三步:按問題類型動參數(shù)
網(wǎng)絡(luò)連接積壓時先看:
ss -lnt ss -s sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog
內(nèi)存和 swap 時先看:
free -h vmstat 1 10 sysctl vm.swappiness vm.overcommit_memory
磁盤回寫時先看:
cat /proc/meminfo | egrep'Dirty|Writeback' sysctl vm.dirty_ratio vm.dirty_background_ratio
2.3 啟動和驗證
2.3.1 啟動服務(wù)
sudo sysctl --system sudo systemctl restart systemd-sysctl sudo systemctl status systemd-sysctl --no-pager
2.3.2 功能驗證
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 實際應(yīng)用案例
案例一:把vm.dirty_ratio調(diào)太高,結(jié)果把數(shù)據(jù)庫寫抖了
場景描述:為了追求順序?qū)懲掏?,某臺數(shù)據(jù)庫主機把vm.dirty_ratio從默認值調(diào)到40。峰值時延明顯抖動,業(yè)務(wù)間歇性超時。
實現(xiàn)代碼:
cat /proc/meminfo | egrep'Dirty|Writeback' iostat -xz 1 10 sysctl vm.dirty_ratio vm.dirty_background_ratio
運行結(jié)果:
Dirty: 7348224 kB Writeback: 612384 kB
臟頁堆太多,前臺線程被迫參與同步回寫,結(jié)果 RT 被直接拖高?;貪L到:
sudo sysctl -w vm.dirty_background_ratio=5 sudo sysctl -w vm.dirty_ratio=20
案例二:盲目把vm.swappiness=1,結(jié)果低峰期都回收不動緩存
場景描述:某緩存節(jié)點為了“絕不 swap”,一刀切把所有機器都改成vm.swappiness=1。短期看 swap 下降了,但低峰期頁緩存回收變差,磁盤讀放大更嚴重。
實現(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)存先被連接跟蹤表吃掉
場景描述:某入口層機器連接數(shù)暴漲,團隊第一反應(yīng)是把nf_conntrack_max從262144直接拉到2097152。連接告警短暫消失,但主機內(nèi)存持續(xù)升高。
實現(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
對比業(yè)務(wù)連接模型
ss -s
運行結(jié)果:
nf_conntrack_count: 1380247 nf_conntrack_max: 2097152
根因不是“表太小”,而是短連接和異常重試把連接跟蹤表撐大了。直接擴表只是把問題從“連接失敗”換成“內(nèi)存膨脹”。處理動作:
優(yōu)先治理短連接和異常重試
按峰值連接數(shù)重新估算表大小
在合理范圍內(nèi)調(diào)大nf_conntrack_max,不是無限放大
這類參數(shù)調(diào)整必須把內(nèi)存成本一起算進去,不然入口沒先掛,節(jié)點先被拖死。
四、最佳實踐和注意事項
4.1 最佳實踐
4.1.1 性能優(yōu)化
優(yōu)化點一:參數(shù)只在有證據(jù)時改。somaxconn不會修復(fù)應(yīng)用 accept 太慢,swappiness也不會修復(fù)內(nèi)存泄漏。
優(yōu)化點二:改參數(shù)前留快照,改參數(shù)后留驗證數(shù)據(jù),至少保留ss -s、free -h、iostat、核心sysctl輸出。
優(yōu)化點三:基線配置走配置管理,別讓每臺機器都手工改。
4.1.2 安全加固
安全措施一:生產(chǎn)參數(shù)文件落到/etc/sysctl.d/,用配置管理系統(tǒng)統(tǒng)一發(fā)版。
安全措施二:禁止直接復(fù)制網(wǎng)絡(luò)上“萬能優(yōu)化參數(shù)大全”。
安全措施三:變更窗口內(nèi)保留回滾腳本和備份文件。
4.1.3 高可用配置
HA 方案一:參數(shù)分層管理,網(wǎng)絡(luò)基線、內(nèi)存基線、容器節(jié)點基線分開。
HA 方案二:把 sysctl 變更納入 CMDB 或 Git 倉庫審計。
備份策略:每次參數(shù)變更前自動導(dǎo)出完整sysctl -a。
4.2 注意事項
4.2.1 配置注意事項
警告:老文章里經(jīng)常出現(xiàn)的net.ipv4.tcp_tw_recycle早就不適合現(xiàn)代環(huán)境??吹竭@類配置先刪,不要照抄。
somaxconn只決定內(nèi)核層監(jiān)聽隊列上限,應(yīng)用本身 backlog 太小同樣會限制住
nf_conntrack_max調(diào)大前,先算內(nèi)存成本
dirty_ratio調(diào)太高,經(jīng)常會把“吞吐更大”換成“長尾更差”
4.2.2 常見錯誤
| 錯誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| 改了somaxconn仍然丟連接 | 應(yīng)用監(jiān)聽 backlog 沒改、accept 太慢 | 同時看應(yīng)用參數(shù)和 listen queue |
| 調(diào)低swappiness后內(nèi)存仍緊張 | 根因是泄漏或 limit 太小 | 先查內(nèi)存根因 |
| 調(diào)大nf_conntrack_max后主機更吃內(nèi)存 | conntrack 表本身占內(nèi)存 | 先算表項成本和峰值連接數(shù) |
4.2.3 兼容性問題
版本兼容:參數(shù)在不同內(nèi)核版本下是否存在、默認值是多少都可能不同。
平臺兼容:容器節(jié)點、數(shù)據(jù)庫節(jié)點、網(wǎng)關(guān)節(jié)點不適合共用一套激進參數(shù)。
組件依賴:應(yīng)用層 backlog、連接池、線程模型、磁盤基線會直接影響參數(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 常見問題排查
問題一:SYN backlog 看起來不夠,怎么確認
ss -lnt netstat -s | egrep -i'listen|SYN' sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog
解決方案:先看 listen queue 是否真的滿,再決定調(diào)somaxconn和tcp_max_syn_backlog。
問題二:調(diào)完swappiness后還是頻繁換頁
free -h vmstat 1 10 ps -eo pid,cmd,%mem,rss --sort=-rss | head -20
解決方案:根因通常是內(nèi)存不足或泄漏,不是參數(shù)本身。
問題三: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)說明
| 指標(biāo)名稱 | 正常范圍 | 告警閾值 | 說明 |
|---|---|---|---|
| conntrack 使用率 | < 70% | > 80% 持續(xù)5m | 高了先查連接模型 |
| swap 活躍度 | ≈ 0 | > 100 pages/s 持續(xù)3m | 先查內(nèi)存根因 |
| 臟頁比例 | < 5% | > 10% 持續(xù)5m | 寫回壓力正在積累 |
| listen drop | 0 | 持續(xù)增長 | 監(jiān)聽隊列或應(yīng)用 accept 有問題 |
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ù)流程
確認要回滾的版本: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
驗證:sysctl net.core.somaxconn vm.swappiness vm.dirty_ratio
六、總結(jié)
6.1 技術(shù)要點回顧
sysctl不是救火按鈕,必須先做問題定性
dirty_ratio、swappiness、nf_conntrack_max都有明顯副作用
參數(shù)要配合業(yè)務(wù)模型、資源基線和監(jiān)控一起看
任何變更都要能回滾
6.2 進階學(xué)習(xí)方向
Linux 內(nèi)核網(wǎng)絡(luò)棧參數(shù)
內(nèi)存回收和寫回機制
Kubernetes 節(jié)點 sysctl 管理
6.3 參考資料
Linux kernel sysctl 文檔- 內(nèi)核參數(shù)官方說明
Linux proc 文件系統(tǒng)文檔-/proc觀測入口
Prometheus Alerting Rules- 告警規(guī)則語法
附錄
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' # 看回寫壓力
B. 配置參數(shù)詳解
net.core.somaxconn:監(jiān)聽 socket backlog 上限
net.ipv4.tcp_max_syn_backlog:半連接隊列大小
vm.swappiness:匿名頁與頁緩存回收傾向
vm.dirty_ratio:前臺同步刷臟頁觸發(fā)閾值
C. 術(shù)語表
| 術(shù)語 | 英文 | 解釋 |
|---|---|---|
| 半連接隊列 | SYN backlog | 握手未完成前的等待隊列 |
| 臟頁 | Dirty Pages | 已修改但尚未寫回磁盤的頁 |
| 連接跟蹤 | Conntrack | Linux 內(nèi)核連接狀態(tài)跟蹤表 |
| 過量提交 | Overcommit | 內(nèi)核對內(nèi)存承諾的分配策略 |
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1474瀏覽量
43087 -
Linux
+關(guān)注
關(guān)注
88文章
11806瀏覽量
219487
原文標(biāo)題:Linux 內(nèi)核參數(shù)調(diào)優(yōu)避坑指南:哪些 sysctl 值不能亂改
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些
Linux用電功耗調(diào)優(yōu)的筆記分享
linux網(wǎng)絡(luò)棧監(jiān)控及調(diào)優(yōu):數(shù)據(jù)接收
Linux性能調(diào)優(yōu)常見工具和堆棧解析
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)避坑指南
評論