Linux 運(yùn)維進(jìn)階:從基礎(chǔ)命令到系統(tǒng)優(yōu)化的深度剖析
開(kāi)篇:你是否遇到過(guò)這些崩潰時(shí)刻?
凌晨2點(diǎn),正在熟睡的你被電話(huà)驚醒:"線上服務(wù)響應(yīng)超時(shí),用戶(hù)大面積投訴!" 你匆忙打開(kāi)電腦,SSH 登錄服務(wù)器,面對(duì)滿(mǎn)屏的進(jìn)程和日志,腦子一片空白——從哪里開(kāi)始排查?用什么命令?怎么快速定位問(wèn)題?
如果你也有過(guò)類(lèi)似經(jīng)歷,或者正在為"Linux 命令太多記不住"、"系統(tǒng)優(yōu)化不知從何下手"而苦惱,那這篇文章就是為你準(zhǔn)備的。
讀完本文,你將收獲:
? 20個(gè)高頻運(yùn)維命令的進(jìn)階用法(不只是 ls、cd,而是 top -Hp、strace -c 這些實(shí)戰(zhàn)利器)
? 5大系統(tǒng)性能指標(biāo)的優(yōu)化方案(CPU、內(nèi)存、磁盤(pán)I/O、網(wǎng)絡(luò)、進(jìn)程管理全覆蓋)
? 3個(gè)生產(chǎn)環(huán)境真實(shí)案例拆解(附完整排查過(guò)程和可復(fù)用腳本)
? 1套系統(tǒng)優(yōu)化檢查清單(可直接用于日常巡檢和故障預(yù)防)
一、基礎(chǔ)命令進(jìn)階:從"會(huì)用"到"用好"
1.1 CPU 排查三劍客:top、htop、pidstat
很多人用top只會(huì)看 CPU 使用率,但真正的高手會(huì)這樣用:
關(guān)鍵命令1:定位高 CPU 進(jìn)程的具體線程
# 先找到高 CPU 進(jìn)程的 PID(假設(shè)是 12345) top -c # 查看該進(jìn)程的所有線程 CPU 占用 top -Hp 12345 # 將線程 ID 轉(zhuǎn)換為 16 進(jìn)制(用于匹配 jstack 輸出) printf"%x "12356 # 假設(shè)高 CPU 線程 ID 是 12356
踩坑經(jīng)驗(yàn):我曾經(jīng)只看進(jìn)程級(jí) CPU,結(jié)果某個(gè) Java 應(yīng)用的 GC 線程瘋狂占用 CPU 卻沒(méi)發(fā)現(xiàn),導(dǎo)致排查了 3 小時(shí)。正確做法:always 使用-Hp參數(shù)查看線程級(jí)詳情。
關(guān)鍵命令2:實(shí)時(shí)監(jiān)控指定進(jìn)程的資源消耗
# 每 2 秒刷新一次 PID 12345 的詳細(xì)資源占用 pidstat -u -r -d -t -p 12345 2 # 參數(shù)說(shuō)明: # -u: CPU 使用統(tǒng)計(jì) # -r: 內(nèi)存使用統(tǒng)計(jì) # -d: 磁盤(pán) I/O 統(tǒng)計(jì) # -t: 顯示線程級(jí)別信息
1.2 內(nèi)存排查進(jìn)階:不只是 free -h
關(guān)鍵命令3:精準(zhǔn)定位內(nèi)存泄漏進(jìn)程
# 查看進(jìn)程內(nèi)存映射,找出異常增長(zhǎng)的內(nèi)存段 pmap -x 12345 |tail-5 # 持續(xù)監(jiān)控內(nèi)存增長(zhǎng)趨勢(shì)(每 5 秒記錄一次) whiletrue;do date>> mem_monitor.log ps aux | grep 12345 | grep -v grep >> mem_monitor.log sleep5 done
血淚教訓(xùn):曾經(jīng)一個(gè) Node.js 應(yīng)用內(nèi)存緩慢泄漏,用free -h只能看到總內(nèi)存在減少,卻不知道是哪個(gè)進(jìn)程。后來(lái)用smem -rs swap -p按 swap 使用量排序,立刻定位到問(wèn)題進(jìn)程。
1.3 磁盤(pán) I/O 深度分析:iotop 的高級(jí)用法
關(guān)鍵命令4:找出隱藏的 I/O 殺手
# 實(shí)時(shí)顯示每個(gè)進(jìn)程的磁盤(pán)讀寫(xiě)速度 iotop -oP -d 2 # 參數(shù)說(shuō)明: # -o: 只顯示有 I/O 活動(dòng)的進(jìn)程 # -P: 只顯示進(jìn)程,不顯示線程 # -d 2: 每 2 秒刷新 # 查看某個(gè)進(jìn)程的 I/O 詳細(xì)信息 cat/proc/12345/io
實(shí)戰(zhàn)技巧:MySQL 數(shù)據(jù)庫(kù)突然變慢,CPU 和內(nèi)存都正常,最后發(fā)現(xiàn)是日志文件寫(xiě)入導(dǎo)致磁盤(pán) I/O 飽和。解決方案:將innodb_flush_log_at_trx_commit從 1 改為 2,寫(xiě)入性能提升 5 倍。
二、系統(tǒng)優(yōu)化實(shí)戰(zhàn):從原理到落地
2.1 CPU 優(yōu)化:不只是調(diào)整 nice 值
優(yōu)化方案1:CPU 親和性綁定
# 將 nginx worker 進(jìn)程綁定到指定 CPU 核心 # 在 nginx.conf 中添加: worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; # 驗(yàn)證綁定效果 taskset -cp$(pgrep nginx)
為什么要這樣做:避免進(jìn)程在 CPU 核心間頻繁切換,減少 L1/L2 緩存失效,實(shí)測(cè)可提升 15% 性能。
優(yōu)化方案2:中斷負(fù)載均衡
# 查看當(dāng)前中斷分布 cat/proc/interrupts # 將網(wǎng)卡中斷綁定到特定 CPU echo2 > /proc/irq/24/smp_affinity # 24 是網(wǎng)卡中斷號(hào)
2.2 內(nèi)存優(yōu)化:科學(xué)配置才是王道
優(yōu)化方案3:合理設(shè)置 swappiness
# 查看當(dāng)前值 cat/proc/sys/vm/swappiness # 臨時(shí)修改(重啟失效) echo10 > /proc/sys/vm/swappiness # 永久修改 echo"vm.swappiness = 10">> /etc/sysctl.conf sysctl -p
參數(shù)選擇經(jīng)驗(yàn):
?數(shù)據(jù)庫(kù)服務(wù)器:設(shè)為 1-10(優(yōu)先使用物理內(nèi)存)
?應(yīng)用服務(wù)器:設(shè)為 30-60(平衡內(nèi)存和 swap)
?個(gè)人桌面:保持默認(rèn) 60
踩坑提醒:不要設(shè)為 0!曾經(jīng)為了"優(yōu)化性能"設(shè)為 0,結(jié)果內(nèi)存不足時(shí)直接 OOM Kill 掉了核心進(jìn)程。
2.3 網(wǎng)絡(luò)優(yōu)化:提升并發(fā)連接能力
優(yōu)化方案4:TCP 參數(shù)調(diào)優(yōu)
# 優(yōu)化 TCP 連接隊(duì)列 echo'net.core.somaxconn = 65535'>> /etc/sysctl.conf echo'net.ipv4.tcp_max_syn_backlog = 8192'>> /etc/sysctl.conf # 優(yōu)化 TIME_WAIT 狀態(tài)處理 echo'net.ipv4.tcp_tw_reuse = 1'>> /etc/sysctl.conf echo'net.ipv4.tcp_tw_recycle = 0'>> /etc/sysctl.conf # 注意:不要開(kāi)啟! # 立即生效 sysctl -p
注意事項(xiàng):tcp_tw_recycle在 NAT 環(huán)境下會(huì)導(dǎo)致連接異常,生產(chǎn)環(huán)境絕對(duì)不要開(kāi)啟!
三、實(shí)戰(zhàn)案例:真實(shí)故障排查全過(guò)程
案例1:詭異的 CPU 100% 卻找不到進(jìn)程
故障現(xiàn)象:監(jiān)控顯示 CPU 使用率 100%,但 top 命令看不到高 CPU 進(jìn)程。
排查過(guò)程:
# Step 1: 檢查是否有隱藏進(jìn)程 ps aux | awk'{print $3}'|sort-rn |head-10 # Step 2: 查看內(nèi)核線程 ps aux | grep"[.*]" # Step 3: 檢查 I/O wait(發(fā)現(xiàn) wa 值異常高) top # 顯示:Cpu(s): 2.0%us, 3.0%sy, 0.0%ni, 0.0%id, 94.0%wa # Step 4: 定位 I/O 瓶頸進(jìn)程 iotop -oP # 發(fā)現(xiàn)是 rsync 備份進(jìn)程導(dǎo)致
根因:定時(shí)備份腳本使用 rsync 同步大量小文件,導(dǎo)致 I/O wait 飆高,CPU 看起來(lái) 100% 但實(shí)際是在等待 I/O。
解決方案:
1. 將 rsync 改為增量備份:rsync -avz --delete
2. 限制 rsync 帶寬:--bwlimit=10240(限制為 10MB/s)
3. 調(diào)整備份時(shí)間到業(yè)務(wù)低峰期
案例2:內(nèi)存泄漏導(dǎo)致的連鎖反應(yīng)
完整排查腳本(可直接使用):
#!/bin/bash # 文件名:check_memory_leak.sh # 功能:自動(dòng)檢測(cè)可能存在內(nèi)存泄漏的進(jìn)程 echo"=== Memory Leak Detection Script ===" echo"Monitoring memory usage for 60 seconds..." # 創(chuàng)建臨時(shí)文件 tmpfile=$(mktemp) # 第一次采樣 ps aux --sort=-%mem |head-20 | awk'{print $2,$4,$11}'>$tmpfile.1 # 等待 60 秒 sleep60 # 第二次采樣 ps aux --sort=-%mem |head-20 | awk'{print $2,$4,$11}'>$tmpfile.2 echo-e" === Processes with significant memory growth ===" echo"PID MEM_BEFORE MEM_AFTER GROWTH COMMAND" # 對(duì)比兩次采樣結(jié)果 whilereadpid mem1 cmd1;do mem2=$(grep"^$pid"$tmpfile.2 | awk'{print $2}') if[ ! -z"$mem2"];then growth=$(echo"$mem2-$mem1"| bc) if(( $(echo "$growth>0.5" | bc -l) ));then printf"%-6s %-10s %-10s %-7s %s " "$pid""$mem1%""$mem2%""+$growth%""$cmd1" fi fi done$tmpfile.1 # 清理臨時(shí)文件 rm?-f?$tmpfile* echo?-e?" === Recommendation ===" echo"For suspicious processes, use: pmap -x PID" echo?"Or check memory maps: cat /proc/PID/smaps"
使用方法:
chmod+x check_memory_leak.sh ./check_memory_leak.sh
四、系統(tǒng)優(yōu)化檢查清單(可直接用于日常巡檢)
每日檢查項(xiàng)
?CPU 負(fù)載:uptime查看 1/5/15 分鐘負(fù)載,不超過(guò) CPU 核數(shù)的 0.7 倍
?內(nèi)存使用:free -h確保可用內(nèi)存 > 20%
?磁盤(pán)空間:df -h確保所有分區(qū)使用率 < 80%
?關(guān)鍵進(jìn)程:systemctl status nginx/mysql/redis確保服務(wù)正常
每周優(yōu)化項(xiàng)
?清理日志:find /var/log -name "*.log" -mtime +30 -exec rm {} ;
?檢查僵尸進(jìn)程:ps aux | grep defunct
?分析慢查詢(xún):檢查 MySQL slow query log
?更新系統(tǒng):yum update --security或apt-get upgrade
每月深度優(yōu)化
?磁盤(pán)碎片整理:e4defrag /dev/sda1(ext4 文件系統(tǒng))
?TCP 連接分析:ss -s查看連接狀態(tài)分布
?內(nèi)核參數(shù)復(fù)查:對(duì)照最佳實(shí)踐檢查/etc/sysctl.conf
結(jié)語(yǔ):從被動(dòng)救火到主動(dòng)防御
掌握了這套"命令進(jìn)階 + 優(yōu)化方案 + 排查腳本"的組合拳,你就能從被動(dòng)的"救火隊(duì)員"轉(zhuǎn)變?yōu)橹鲃?dòng)的"系統(tǒng)架構(gòu)師"。記?。?strong>優(yōu)秀的運(yùn)維不是沒(méi)有故障,而是能在故障發(fā)生前發(fā)現(xiàn)征兆,在故障發(fā)生時(shí)快速恢復(fù)。
-
cpu
+關(guān)注
關(guān)注
68文章
11186瀏覽量
221158 -
Linux
+關(guān)注
關(guān)注
88文章
11575瀏覽量
216575 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3155瀏覽量
75858
原文標(biāo)題:Linux 運(yùn)維進(jìn)階:從基礎(chǔ)命令到系統(tǒng)優(yōu)化的深度剖析
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux find命令的用法
SQLx的基礎(chǔ)用法和進(jìn)階用法
Stream模塊的基礎(chǔ)用法和進(jìn)階用法
linux中comm命令用法
Linux中的35個(gè)find命令用法

linux的scp命令怎么用_linux的grep命令用法

如何在Linux使用touch命令
基于select!宏的進(jìn)階用法
linux中source命令的用法
linux查看物理接口的命令
linux常用命令及用法
總結(jié)linux命令行的主要用法
Linux lsof命令的基本用法

評(píng)論