目錄
一、系統監控與性能分析
vmstat命令
一、命令語法及核心參數
二、輸出字段解析(關鍵列)
三、工作場景案例
1. 排查 CPU 瓶頸
2. 內存不足導致 Swap 頻繁
3. 磁盤 I/O 性能問題
4. 系統卡頓實時監控
5. 高級用法:統計內存事件
四、總結
iostat命令
一、命令語法及核心參數
二、輸出字段解析(關鍵指標)
1. CPU 統計(-c)
2. 磁盤統計(-x -d)
三、工作場景案例
1. 定位磁盤高負載問題
2. 排查 CPU 異常占用
3. LVM 邏輯卷性能分析
4. 云盤性能驗證
5. 高并發寫入瓶頸分析
四、高級技巧
五、總結
iftop命令
一、安裝與基礎用法
1. 安裝方法
2. 基礎命令
二、核心參數詳解
三、交互界面操作
四、輸出字段解析
五、工作場景案例
1. 定位服務器帶寬跑滿
2. 排查異常外聯流量
3. 分析數據庫主從同步延遲
4. 檢測DDoS攻擊
5. 多網卡流量分布不均
六、高級技巧
1. 文本模式記錄流量
2. 組合過濾語法
3. 流量排序
七、總結
top/htop命令
一、top 命令詳解
1. 基礎語法與核心參數
2. 交互界面操作
3. 關鍵指標解析
二、htop 命令進階
1. 安裝與基礎用法
2. 核心功能對比 top
3. 高級操作技巧
三、工作場景案例
1. CPU 使用率突增(使用 top)
2. 內存泄漏分析(使用 htop)
3. 僵尸進程清理(使用 top)
4. 磁盤 I/O 瓶頸定位(使用 htop)
5. 容器化環境資源監控(使用 htop)
四、總結與最佳實踐
ps命令
一、命令語法與核心參數
1. 參數風格區分
2. 關鍵參數
二、輸出字段解析(重點字段)
三、工作場景案例
1. 檢測內存泄漏進程
2. 清理僵尸進程
3. 追蹤異常網絡連接
4. 分析容器內進程
5. 統計用戶進程資源
四、高級用法
1. 自定義輸出格式
2. 結合時間篩選進程
3. 進程狀態批量操作
五、總結與最佳實踐
pidstat命令
一、命令概述
二、安裝與基本語法
三、核心選項及參數解析
四、工作案例場景
案例 1:CPU 使用率過高排查
案例 2:內存泄漏分析
案例 3:磁盤 I/O 瓶頸定位
案例 4:上下文切換頻繁分析
案例 5:綜合監控與自動化
五、高級技巧
六、注意事項
free命令
一、命令概述
二、基本語法
三、核心選項及參數解析
四、輸出字段詳解
五、工作案例場景
案例 1:快速檢查系統內存壓力
案例 2:持續監控內存使用變化
案例 3:診斷緩存(Cache)占用過高
案例 4:計算應用程序真實內存占用
案例 5:優化 Swap 使用策略
案例 6:自動化內存監控腳本
六、高級技巧
七、注意事項
區分 Buffer 和 Cache: (面試)
smem命令
一、命令概述
二、安裝方法
三、核心指標解析
四、基本語法及常用選項
五、工作案例場景
案例 1:快速定位內存占用最高的進程
案例 2:按用戶統計內存消耗
案例 3:分析容器/多進程應用的真實內存占用
案例 4:生成內存使用報告(適合自動化監控)
案例 5:分析共享內存的分布
六、高級技巧
七、注意事項
pmap命令
一、命令概述
二、安裝方法
三、核心字段解析
四、基本語法及常用選項
五、工作案例場景
案例 1:快速定位進程內存占用詳情
案例 2:檢查共享內存使用
案例 3:分析動態庫內存占用
案例 4:排查內存泄漏(周期性監控)
案例 5:調試硬件設備內存映射
六、高級技巧
七、注意事項
sar命令
一、命令概述
二、安裝方法
三、核心指標解析
四、基本語法及常用選項
五、工作案例場景
案例 1:實時監控 CPU 使用率
案例 2:分析歷史內存使用
案例 3:診斷磁盤 I/O 瓶頸
案例 4:監控網絡流量峰值
案例 5:生成綜合性能報告
六、高級技巧
七、注意事項
八、字段與選項速查表
ss/netstat命令
一、命令概述
二、核心功能對比
三、ss 命令詳解
1. 基本語法
2. 常用選項
3. 過濾語法
四、netstat 命令詳解
1. 基本語法
2. 常用選項
五、工作案例場景
案例 1:快速檢查服務端口是否監聽
案例 2:分析 ESTABLISHED 連接數異常
案例 3:定位 TIME_WAIT 狀態過多問題
案例 4:排查進程占用端口
案例 5:監控網絡吞吐量(結合 netstat)
案例 6:分析 TCP 重傳率(網絡質量)
案例 7:自動化監控腳本
六、高級技巧
七、注意事項
curl/wget命令
一、核心區別與適用場景
二、curl 命令詳解
1. 安裝與基本語法
2. 常用選項
3. 工作案例
案例 1:快速檢查服務健康狀態
案例 2:調試 API 接口
案例 3:下載文件并重命名
案例 4:模擬瀏覽器訪問
三、wget 命令詳解
1. 安裝與基本語法
2. 常用選項
3. 工作案例
案例 1:批量下載日志文件
案例 2:鏡像靜態網站
案例 3:后臺下載大文件
案例 4:通過代理下載
四、安全與調試技巧
五、高級運維場景
場景 1:自動化部署腳本
場景 2:監控 API 響應時間
場景 3:分布式文件同步
六、總結對比
nc(ncat)命令
一、命令概述
二、安裝方法
三、核心選項與語法
四、工作案例場景
案例 1:測試端口連通性
案例 2:臨時文件傳輸
案例 3:遠程調試與交互式Shell
案例 4:簡易代理或端口轉發
案例 5:UDP 服務測試
案例 6:多端口批量掃描
案例 7:網絡服務存活監控
五、高級技巧
1. 結合 tar 實時壓縮傳輸
2. 加密通信(使用 openssl 增強安全性)
3. 模擬 HTTP 請求
六、注意事項
eth-tool命令
一、命令概述
二、核心選項與參數
三、工作案例場景
案例 1:檢查網卡基本狀態
案例 2:修改網卡速率和雙工模式
案例 3:診斷丟包或高延遲問題
案例 4:排查 Offload 功能導致的性能問題
案例 5:定位物理網卡設備
四、高級技巧
1. 自動化網卡健康檢查(腳本)
2. 持久化配置(避免重啟失效)
五、注意事項
六、總結
tcpdump命令
一、命令概述
二、安裝與基本語法
三、核心選項與參數
四、過濾表達式語法
五、工作案例場景
案例 1:抓取 HTTP 請求內容
案例 2:檢測 ICMP 不可達錯誤
案例 3:分析 DNS 查詢請求
案例 4:捕獲 TCP 三次握手與揮手
案例 5:抓取異常流量(如端口掃描)
案例 6:保存抓包數據并離線分析
六、高級技巧
七、注意事項
tshark(wireshark命令行)
一、命令概述
二、安裝與基本語法
三、核心選項與參數
四、過濾語法
五、工作案例場景
案例 1:實時抓取并分析 HTTP 請求
案例 2:離線分析 TCP 重傳問題
案例 3:提取 DNS 查詢記錄
案例 4:生成流量會話統計
案例 5:提取 HTTP 請求的 User-Agent
案例 6:檢測 SSH 暴力破解行為
六、高級技巧
1. 生成 I/O 圖表(流量趨勢)
2. 提取 HTTPS SNI(加密前握手信息)
3. 自動化協議分析腳本
七、注意事項
三、磁盤與文件管理
df/du命令
一、命令概述
二、df 命令詳解
1. 核心選項
2. 輸出字段解析
3. 工作案例
案例 1:快速檢查磁盤空間
案例 2:排查 inode 耗盡問題
三、du 命令詳解
1. 核心選項
2. 工作案例
案例 1:定位根目錄下最大子目錄
案例 2:統計日志目錄占用空間
案例 3:查找超過 1GB 的文件
四、綜合運維場景
場景 1:自動化磁盤空間監控腳本
場景 2:清理過期日志文件
場景 3:解決 du 與 df 結果不一致問題
五、高級技巧
六、注意事項
ncdu命令
一、命令概述
二、安裝方法
三、核心功能與優勢
四、基本語法與常用選項
五、交互界面操作指南
六、工作案例場景
案例 1:快速分析根目錄磁盤占用
案例 2:排除臨時文件掃描
案例 3:離線分析與報告生成
案例 4:批量清理舊日志文件
案例 5:遠程服務器磁盤分析
七、高級技巧
1. 自動化清理腳本
2. 定期掃描與對比
八、注意事項
find命令
一、命令概述
二、基本語法
三、核心選項與參數
1. 按名稱/路徑匹配
2. 按類型匹配
3. 按時間匹配
4. 按大小匹配
5. 按權限/用戶匹配
6. 執行動作
四、工作案例場景
案例 1:清理過期日志文件
案例 2:查找并備份大文件
案例 3:審計異常權限文件
案例 4:批量修改文件所有者
案例 5:統計源碼文件數量
五、高級技巧
1. 邏輯組合
2. 排除目錄
3. 結合 xargs 提高效率
4. 并行處理
六、注意事項
rsync命令
一、命令概述
二、安裝與基本語法
三、核心選項與參數
四、工作案例場景
案例 1:本地目錄同步
案例 2:遠程服務器同步(SSH 加密)
案例 3:增量備份與排除文件
案例 4:恢復誤刪文件(反向同步)
案例 5:大規模數據遷移(斷點續傳)
案例 6:差異化備份(保留歷史版本)
五、高級技巧
1. 帶寬限制與壓縮優化
2. 保護覆蓋文件(備份后綴)
3. 過濾規則文件
六、注意事項
fio命令
一、命令概述
二、安裝與基本語法
三、核心參數與配置
1. 全局參數
2. I/O 模式參數
3. 輸出參數
四、工作案例場景
案例 1:測試 SSD 的隨機讀性能(4K 塊,隊列深度 32)
案例 2:測試 HDD 的順序寫帶寬(1M 塊,單線程)
案例 3:模擬混合負載(70% 讀 + 30% 寫,4K 塊)
案例 4:驗證磁盤延遲(低隊列深度,1 線程)
案例 5:多磁盤并行測試(多文件負載)
五、結果分析與調優建議
1. 關鍵指標解讀
2. 性能瓶頸排查
3. 調優方向
六、注意事項
四、日志與文本處理
grep命令
一、命令概述
二、核心選項與參數
三、正則表達式速查
四、工作案例場景
案例 1:快速定位日志中的錯誤
案例 2:遞歸搜索代碼庫中的關鍵詞
案例 3:統計接口調用次數
案例 4:提取日志中的 IP 地址
案例 5:監控服務狀態
案例 6:多關鍵詞復雜匹配
五、高級技巧
1. 結合 find 高效遞歸搜索
2. 高亮關鍵詞并分頁查看
3. 使用 zgrep 直接搜索壓縮文件
4. 上下文關聯分析
六、性能優化
七、注意事項
sed命令
一、命令概述
二、基本語法
三、核心選項與參數
四、地址定界與命令
1. 地址定界
2. 常用命令
3. 替換命令標志
五、工作案例場景
案例 1:批量替換配置文件參數
案例 2:刪除日志文件中的空行
案例 3:提取特定時間段的日志
案例 4:批量注釋/取消注釋配置
案例 5:批量修改文件格式(DOS 轉 Unix)
案例 6:動態插入配置片段
六、高級技巧
1. 多命令組合執行
2. 引用變量(Shell 腳本中)
3. 反向引用正則分組
4. 結合 find 批量處理文件
七、注意事項
awk命令
一、命令概述
二、基本語法與結構
三、核心概念與選項
1. 常用選項
2. 內置變量
3. 模式與動作
四、工作案例場景
案例 1:統計日志中 HTTP 狀態碼分布
案例 2:計算目錄下文件總大小(MB)
案例 3:格式化輸出進程信息
案例 4:分析網絡連接狀態
案例 5:動態修改 CSV 文件字段
案例 6:多文件關聯分析
五、高級技巧
1. 使用 BEGIN/END 塊
2. 自定義函數
3. 結合 Shell 管道
六、注意事項
cut命令
一、命令概述
二、基本語法
三、核心選項與參數
四、工作案例場景
案例 1:提取 /etc/passwd 的用戶名和 Shell
案例 2:從日志中提取 IP 地址和時間戳
案例 3:按字符位置截取文本
案例 4:處理 CSV 文件并排除指定列
案例 5:反向提取字段(排除指定列)
案例 6:結合管道處理命令輸出
五、高級技巧
1. 處理多字符分隔符
2. 動態字段提取(腳本中)
3. 處理包含空格的字段
六、注意事項
七、總結
sort和uniq命令
一、sort 命令詳解
1. 核心選項
2. 工作案例
案例 1:按 CPU 使用率降序排序進程
案例 2:排序 CSV 文件并去重
案例 3:合并多個排序文件
二、uniq 命令詳解
1. 核心選項
2. 工作案例
案例 1:統計日志中錯誤類型出現次數
案例 2:提取唯一 IP 地址
案例 3:查找重復用戶
三、組合使用案例
案例 1:分析訪問日志的 Top 10 IP
案例 2:清理重復配置項
案例 3:按多列排序并去重
四、注意事項
五、總結
journal命令
一、命令概述
二、核心選項與參數
三、工作案例場景
案例 1:實時跟蹤系統日志
案例 2:查看指定服務的日志
案例 3:過濾錯誤級別日志
案例 4:按時間范圍查詢日志
案例 5:導出日志到文件(JSON 格式)
案例 6:查看系統啟動時的日志
四、高級技巧
1. 結構化字段查詢
2. 結合其他工具過濾
3. 日志持久化與清理
五、注意事項
六、總結
tail/multitail命令
一、tail 命令詳解
1. 核心選項
2. 工作案例
案例 1:實時跟蹤日志文件
案例 2:查看最近 50 行錯誤日志
案例 3:跟蹤日志直到進程結束
二、multitail 命令詳解
1. 核心功能
2. 安裝方法
3. 工作案例
案例 1:分屏監控多個日志文件
案例 2:顏色標記關鍵日志
案例 3:合并日志并過濾
三、高級技巧
1. 快捷鍵操作
2. 動態執行命令并監控
3. 自定義顏色方案
四、注意事項
五、總結
五、系統調試與內核
strace命令
一、命令概述
二、核心選項與參數
三、工作案例場景
案例 1:診斷文件訪問失敗
案例 2:分析程序卡頓原因
案例 3:統計系統調用開銷
案例 4:跟蹤網絡連接問題
案例 5:跟蹤文件讀寫行為
四、高級技巧
1. 過濾關鍵系統調用
2. 跟蹤子進程(多線程/多進程程序)
3. 結合管道實時分析
4. 動態附加到運行中的進程
五、注意事項
六、總結
ltrace命令
一、命令概述
二、核心選項與參數
三、工作案例場景
案例 1:分析內存泄漏
案例 2:定位第三方庫崩潰
案例 3:統計函數調用開銷
案例 4:跟蹤文件操作異常
案例 5:跟蹤多線程程序的競態條件
四、高級技巧
1. 過濾特定函數并顯示參數詳情
2. 結合指令指針定位代碼位置
3. 跟蹤系統調用與庫函數
五、注意事項
六、安裝方法
七、總結
dmesg命令
一、命令概述
二、核心選項與參數
三、工作案例場景
案例 1:查看系統啟動錯誤
案例 2:診斷 USB 設備識別問題
案例 3:監控實時內核事件
案例 4:分析內存故障
案例 5:查看硬盤健康狀態
四、高級技巧
1. 按時間范圍過濾日志
2. 保存日志到文件
3. 結合 journalctl 查看持久化日志
4. 解碼錯誤碼
五、注意事項
六、總結
lspci/lsusb命令
一、lspci 命令詳解
1. 核心選項
2. 工作案例
案例 1:查看所有 PCI 設備列表
案例 2:查看網卡驅動信息
案例 3:生成硬件清單(JSON 格式)
二、lsusb 命令詳解
1. 核心選項
2. 工作案例
案例 1:查看所有 USB 設備列表
案例 2:查看 USB 攝像頭詳細信息
案例 3:檢查 USB 設備供電狀態
三、組合使用案例
案例 1:診斷無線網卡驅動問題
案例 2:排查 USB 存儲設備未掛載
案例 3:生成硬件報告(自動化腳本)
四、高級技巧
1. 解析廠商和產品 ID
2. 查看 USB 設備速度
3. 監控 USB 設備熱插拔
五、總結
六、安全與審計
chattr/lsattr命令
一、命令概述
二、核心屬性說明
三、chattr 命令用法
常用選項
四、lsattr 命令用法
常用選項
五、工作案例場景
案例 1:防止關鍵文件被誤刪或修改
案例 2:保護日志文件僅允許追加
案例 3:防止目錄被篡改
案例 4:優化文件系統性能
六、注意事項
七、總結
getfacl/setfacl命令
一、命令概述
二、ACL 核心概念
三、getfacl 命令用法
輸出示例:
四、setfacl 命令用法
常用選項:
五、工作案例場景
案例 1:為特定用戶分配獨立權限
案例 2:為組設置權限并限制掩碼
案例 3:設置繼承權限(默認 ACL)
案例 4:刪除 ACL 條目
案例 5:遞歸恢復目錄權限
六、高級技巧
1. ACL 權限備份與恢復
2. 結合 cp/rsync 保留 ACL
3. 調試權限沖突
七、注意事項
八、總結
auditd審計
一、auditd 概述
二、核心組件與配置
三、auditctl 命令用法
參數說明:
四、工作案例場景
案例 1:監控敏感文件訪問(如 /etc/passwd)
案例 2:監控用戶提權操作(如 sudo 或 su)
案例 3:監控網絡連接(如未授權的端口訪問)
案例 4:監控文件系統掛載/卸載操作
五、日志分析與報告
1. 使用 ausearch 查詢日志
2. 使用 aureport 生成報告
六、高級配置
1. 日志輪轉與存儲
2. 永久化審計規則
七、注意事項
八、總結
lynis工具
一、Lynis 概述
二、安裝與配置
1. 安裝 Lynis
2. 配置文件
三、核心命令與選項
常用選項:
四、工作案例場景
案例 1:執行完整系統安全審計
案例 2:生成合規性報告(HTML)
案例 3:滲透測試模式掃描
案例 4:自動化定期審計(Cron 任務)
五、高級技巧
1. 自定義審計規則
2. 集成到 CI/CD 流程
六、注意事項
七、總結
七、軟件包與服務管理
apt/dnf命令
一、apt(Debian/Ubuntu 系統包管理)
1. 核心命令與選項
2. 工作案例
案例 1:安裝并固定軟件版本
案例 2:清理舊內核和緩存
案例 3:處理依賴沖突
二、yum/dnf(RHEL/CentOS 系統包管理)
1. 核心命令與選項
2. 工作案例
案例 1:安裝指定版本 MySQL
案例 2:配置 EPEL 倉庫
案例 3:回滾失敗的更新
三、通用場景與技巧
1. 系統升級
2. 安全補丁管理
3. 本地包安裝
4. 倉庫優先級管理
四、注意事項
五、總結
systemctl命令
一、命令概述
二、核心命令與選項
三、工作案例場景
案例 1:排查服務啟動失敗
案例 2:自定義服務管理
案例 3:限制服務資源
案例 4:處理服務依賴沖突
案例 5:隔離運行環境(Sandboxing)
四、高級技巧
1. 查看服務啟動耗時
2. 修改默認運行級別(Target)
3. 定時重啟服務
五、注意事項
六、總結
總結
一、系統監控與性能分析
vmstat命令
vmstat
是 Linux 系統性能監控的核心工具之一,主要用于實時統計 進程、內存、交換分區、I/O 和 CPU 的使用情況。
一、命令語法及核心參數
vmstat [options] [delay [count]]
-
常用參數:
-
-a
:顯示活躍(active)和非活躍(inactive)內存 -
-n
:禁止周期性表頭輸出(適合腳本調用) -
-d
:顯示磁盤詳細統計(包括讀寫次數和吞吐量) -
-s
:顯示內存事件統計(如內存分配、缺頁異常等) -
-t
:在輸出中增加時間戳(便于記錄監控時間) -
-w
:寬屏模式(適配高分辨率顯示器) -
-p <分區>
:監控指定分區的 I/O 活動
-
二、輸出字段解析(關鍵列)
字段 | 含義 | 診斷場景 |
---|---|---|
r | 等待運行的進程數 | CPU 過載時,此值持續 > CPU 核數 |
b | 處于不可中斷睡眠的進程數 | I/O 阻塞時升高 |
swpd | 已使用的交換分區大小(KB) | 內存不足時此值快速增長 |
free | 空閑內存(KB) | 結合 si/so 判斷是否需要擴容內存 |
si | 從交換分區讀入內存的數據量(KB/s) | si > 0 表示正在發生 Swap In |
so | 從內存寫入交換分區的數據量(KB/s) | so > 0 表示正在發生 Swap Out |
bi | 塊設備每秒接收的塊數(塊/s) | 磁盤讀取壓力(如數據庫高頻讀) |
bo | 塊設備每秒發送的塊數(塊/s) | 磁盤寫入壓力(如日志大量寫入) |
us | 用戶態 CPU 時間占比(%) | 應用程序消耗 CPU 過高 |
sy | 內核態 CPU 時間占比(%) | 系統調用頻繁或中斷過多 |
wa | I/O 等待 CPU 時間占比(%) | 磁盤成為瓶頸時此值飆升 |
st | 虛擬機等待物理 CPU 的時間(%) | 虛擬化環境中宿主機資源爭搶 |
三、工作場景案例
1. 排查 CPU 瓶頸
命令:vmstat 1 5
(每秒采樣一次,共5次) 觀察點:
-
如果
us
持續 >70%,說明應用程序消耗大量 CPU(如 Java 應用未優化)。 -
如果
sy
持續 >30%,可能是內核頻繁處理系統調用(如大量短連接請求)。 -
如果
wa
持續 >20%,需檢查磁盤 I/O 性能(如數據庫未索引導致全表掃描)。
2. 內存不足導致 Swap 頻繁
命令:vmstat -t 2 10
(帶時間戳,每2秒采樣,共10次) 分析邏輯:
-
free
持續下降至接近 0,且si/so
開始頻繁波動。 -
結論:物理內存不足,系統開始使用交換分區,需擴容內存或優化應用內存使用。
3. 磁盤 I/O 性能問題
命令:vmstat -d 1
(監控磁盤 I/O 詳情) 關鍵指標:
-
bo
(寫入)和bi
(讀取)數值突然飆升。 -
配合
wa
列,若wa
高且bi/bo
數值大,可能是磁盤帶寬不足或 RAID 卡緩存策略問題。
4. 系統卡頓實時監控
場景:用戶反饋系統響應變慢,但 top
未發現明顯異常。 操作:
vmstat 1 ?# 每秒刷新一次
輸出關鍵點:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b ? swpd ? free ? buff cache ? si ? so ? bi ? bo ? in ? cs us sy id wa st5 2 204800 15232 10240 180000 ? 0 ? 0 1200 ? 800 1200 2500 30 15 40 15 0
診斷:
-
r=5
:有5個進程在等待 CPU,可能 CPU 核數不足。 -
b=2
:2個進程因 I/O 阻塞。 -
wa=15%
:I/O 等待較高,需結合iostat
進一步分析磁盤。
5. 高級用法:統計內存事件
命令:vmstat -s
輸出示例:
? ? 4095996 K total memory2987340 K used memory1802304 K active memory845200 K inactive memory1108656 K free memory# 發現大量 "pages paged in" 表示頻繁的缺頁中斷
用途: 快速查看內存總量、使用分布、缺頁異常次數等,輔助判斷內存泄漏或配置不合理。
四、總結
-
動態監控:
vmstat
適合觀察 隨時間變化的趨勢,靜態快照(如free
)可能誤導判斷。 -
組合工具:結合
sar
(歷史數據)、iostat
(磁盤詳情)、pidstat
(進程級監控)深入分析。 -
閾值經驗:
wa > 20%
需警惕磁盤性能;si/so
持續 >100 KB/s 表明 Swap 過度使用。
iostat命令
iostat
是 Linux 系統性能監控的核心工具之一,專注于 磁盤 I/O 和 CPU 使用情況 的統計分析。作為中級運維工程師,需掌握其核心指標的組合分析能力,快速定位存儲瓶頸和 CPU 負載異常。
一、命令語法及核心參數
iostat [options] [interval [count]]
-
常用參數:
-
-c
:僅顯示 CPU 統計信息 -
-d
:僅顯示磁盤統計信息 -
-x
:顯示擴展磁盤統計(關鍵參數,必須掌握) -
-p <設備>
:監控指定磁盤或分區(如-p sda
) -
-m
:以 MB/s 代替 KB/s 顯示吞吐量 -
-t
:輸出中增加時間戳(便于記錄監控時間) -
-k
:以 KB 為單位顯示數據(默認)
-
二、輸出字段解析(關鍵指標)
1. CPU 統計(-c
)
字段 | 含義 | 診斷場景 |
---|---|---|
%user | 用戶態 CPU 時間占比 | 應用程序消耗 CPU 過高(如 Java 進程) |
%system | 內核態 CPU 時間占比 | 系統調用或中斷過多(如網絡密集型應用) |
%iowait | CPU 等待 I/O 完成的時間占比 | 存儲性能瓶頸時飆升 |
%idle | CPU 空閑時間占比 | 持續 <20% 表示系統負載較高 |
2. 磁盤統計(-x -d
)
字段 | 含義 | 診斷閾值 |
---|---|---|
r/s | 每秒讀請求數 | 機械硬盤 >200 可能成為瓶頸 |
w/s | 每秒寫請求數 | SSD >5000 需關注 |
rkB/s | 每秒讀取數據量(KB) | 結合帶寬(如 SAS 硬盤 200MB/s) |
wkB/s | 每秒寫入數據量(KB) | 同上 |
await | I/O 請求平均等待時間(ms) | >10ms(機械盤)或 >2ms(SSD)異常 |
svctm | I/O 請求平均服務時間(ms) | 接近 await 表示隊列堆積 |
%util | 磁盤繁忙時間百分比 | >70% 表示接近飽和 |
三、工作場景案例
1. 定位磁盤高負載問題
場景:數據庫查詢變慢,懷疑磁盤 I/O 瓶頸。 命令:
iostat -x -m 1 5 ?# 擴展模式,MB/s單位,每秒采樣,共5次
輸出分析:
Device ? r/s ? w/s ? rMB/s ? wMB/s ? await svctm %util sdb ? ? 120 ? 80 ? ? 45.2 ? 20.1 ? 25.6 ? 8.2 ? 98.3
診斷結論:
-
%util=98.3%
:磁盤接近滿載 -
await=25.6ms
遠高于svctm=8.2ms
:存在嚴重 I/O 隊列堆積 -
解決方案:優化 SQL 查詢減少全表掃描,或升級為 SSD
2. 排查 CPU 異常占用
場景:系統 CPU 使用率高,但 top
未發現異常進程。 命令:
iostat -c 1
輸出分析:
avg-cpu: %user ? %system %iowait %idle12.3 ? ? 45.6 ? ? 32.1 ? 10.0
診斷結論:
-
%system=45.6%
:內核態 CPU 占用過高 -
%iowait=32.1%
:存在 I/O 等待問題 -
根因:可能是 RAID 卡電池故障導致回寫模式降級,或 NFS 掛載異常
3. LVM 邏輯卷性能分析
場景:LVM 存儲的虛擬機磁盤性能下降。 命令:
iostat -xp dm-0 2 ?# 監控 LVM 設備 dm-0
輸出分析:
dm-0 ? ... rkB/s=32000 wkB/s=15000 await=15.2 %util=89.2
關鍵點:
-
高吞吐量(32MB/s讀 + 15MB/s寫)但
await=15ms
:底層物理磁盤性能不足 -
解決方案:檢查底層磁盤 RAID 配置,或分散負載到多個 LUN
4. 云盤性能驗證
場景:ECS 云主機更換云盤后應用性能未提升。 命令:
iostat -dx -k 1
輸出對比:
# 舊云盤(普通云盤) vda ? r/s=800 ? await=20.3 %util=95.1 ? # 新云盤(ESSD PL3) vdb ? r/s=1200 await=2.1 ? %util=68.4
結論: 新云盤 await
下降 90%,%util
降低但吞吐量提升,符合預期性能升級。
5. 高并發寫入瓶頸分析
場景:日志服務集群出現寫入延遲告警。 命令:
iostat -x 1 | grep -E "Device|sd[c-e]"
輸出焦點:
sdc ? wkB/s=220 ? w/s=4500 ? await=50.1 %util=99.9
關鍵指標:
-
w/s=4500
:超高寫 IOPS -
wkB/s=220
:每次寫入僅約 49KB(220*1024/4500),存在小文件寫入問題 -
優化方向:合并寫入操作,調整文件系統為更合適的小塊寫入策略(如 ext4 的
dir_index
)
四、高級技巧
-
組合監控:
iostat -x 1 | awk '/sd/ {if ($12 >70) print $1,$12}' ?# 實時過濾高負載磁盤
-
歷史數據分析:
sar -d -p -f /var/log/sa/sa15 # 結合 sar 查看歷史磁盤數據
-
進程級關聯:
pidstat -d 1 # 配合查看進程級別的 I/O 活動
五、總結
-
核心指標組合:
-
高
%util
+ 高await
→ I/O 隊列堆積 -
高
rkB/s/wkB/s
+ 低%util
→ 帶寬未滿但可能延遲高
-
-
不要孤立看數據:結合
vmstat
的b
列(阻塞進程數)和top
的wa
值綜合判斷 -
性能基準:建立業務正常時的 iostat 基準數據,便于異常對比
iftop命令
iftop
是一款實時監控網絡流量的命令行工具,能夠按連接(IP或端口)動態展示帶寬使用情況。作為中級運維工程師,掌握其高級用法可快速定位網絡瓶頸、異常流量及入侵行為。
一、安裝與基礎用法
1. 安裝方法
# Debian/Ubuntu sudo apt install iftop# RHEL/CentOS sudo yum install epel-release sudo yum install iftop
2. 基礎命令
sudo iftop -i eth0 # 監控指定網卡(默認eth0) sudo iftop -nP # 禁用DNS解析(-n)并顯示端口(-P)
二、核心參數詳解
參數 | 作用 | 場景 |
---|---|---|
-i | 指定監控網卡(如 eth0 、bond0 ) | 多網卡服務器定位流量入口 |
-n | 禁用DNS反向解析 | 避免DNS延遲,快速顯示IP |
-P | 顯示端口號 | 分析具體服務流量(如MySQL 3306) |
-F | 過濾指定網段(CIDR格式) | 聚焦內網或特定IP段通信 |
-m | 設置帶寬比例尺 | 調整流量顯示靈敏度 |
-B | 以Bytes為單位顯示(默認bits) | 精確計算數據量 |
-t | 文本模式(無交互界面) | 結合重定向保存日志 |
三、交互界面操作
運行界面快捷鍵:
-
h
:顯示幫助菜單 -
s
:顯示源IP端口 -
d
:顯示目標IP端口 -
j/k
:滾動連接列表 -
T
:切換累計/實時流量顯示 -
L
:調整峰值流量標尺 -
p
:暫停刷新 -
q
:退出
四、輸出字段解析
界面布局: 1. 帶寬刻度條(動態調整) 2. 連接列表(源IP:端口 → 目標IP:端口) 3. 流量統計(2s/10s/40s平均)關鍵列: => 發送流量(TX) | <= 接收流量(RX) cum:當前連接累計流量 peak:峰值流量 rates:2s/10s/40s平均流量
五、工作場景案例
1. 定位服務器帶寬跑滿
現象:監控顯示eth0出口帶寬持續100% 操作:
sudo iftop -i eth0 -nP
分析:
-
發現
192.168.1.10:443 => 203.0.113.5:55332
持續占用50MB/s TX流量 -
按
t
切換流量顯示模式,確認是否為突發流量或持續占用 結論:該IP為Web服務器,存在大量文件下載請求,需優化CDN或啟用限流
2. 排查異常外聯流量
現象:安全告警顯示服務器發起異常外網連接 操作:
sudo iftop -F 0.0.0.0/0 -f "dst port 6667" # 過濾目標端口為6667(常見木馬端口)
發現:內網IP 10.0.0.5:12345
頻繁連接 45.76.129.2:6667
深入:
netstat -tunap | grep 12345 # 定位進程PID lsof -p <PID> # 查看進程詳細信息
結論:該進程為惡意挖礦程序,立即隔離主機并清除
3. 分析數據庫主從同步延遲
現象:MySQL從庫同步延遲持續增長 操作:
sudo iftop -i eth1 -nP -f "port 3306" # 監控數據庫專用網卡eth1的3306端口
觀察:
-
主庫
10.0.1.10:3306 => 10.0.1.20:55322
的TX流量為2MB/s -
40秒平均速率(rates列)波動在1.5~3MB/s 結論:網絡帶寬穩定,需排查從庫IO性能或主庫binlog生成速度
4. 檢測DDoS攻擊
現象:服務器無法訪問,帶寬監控顯示異常入流量 操作:
sudo iftop -i eth0 -n # 快速查看入站連接
發現:
-
數百個不同IP向
:80
發送流量,RX速率均超過1MB/s -
總入流量遠超正常業務量 應對:立即啟用防火墻封禁來源IP段,并聯系ISP清洗流量
5. 多網卡流量分布不均
現象:負載均衡器流量未按預期分發到bond0的子網卡 操作:
sudo iftop -i bond0 # 查看綁定網卡總體流量 sudo iftop -i eth2 # 檢查具體物理網卡
發現:bond0流量集中在eth2,eth3無流量 根因:bond模式配置錯誤(未啟用負載均衡模式) 解決:調整bonding模式為 balance-rr
或 802.3ad
六、高級技巧
1. 文本模式記錄流量
sudo iftop -t -i eth0 -s 60 > traffic.log # 監控60秒并保存日志
2. 組合過濾語法
# 監控來自特定IP且目標為80端口的流量 sudo iftop -f "src 192.168.1.100 and dst port 80"
3. 流量排序
-
按
<
或>
鍵切換按源/目標地址排序 -
按
o
凍結當前顯示結果
七、總結
-
核心價值:實時可視化網絡連接級帶寬占用,彌補
nload
、vnstat
的不足 -
排查流程:
iftop 定位IP/端口
→netstat/ss 查進程
→tcpdump 抓包分析
-
性能影響:對高流量(>1Gbps)服務器可能增加CPU負載,建議短期使用
-
替代工具:
-
nethogs
:按進程監控流量 -
iptraf-ng
:更強大的交互式分析
-
top/htop命令
top
和 htop
是 Linux 系統性能監控的核心工具,用于實時分析 進程級資源占用(CPU、內存、線程等)。作為中級運維工程師,需掌握兩者在性能瓶頸定位、異常進程排查中的靈活應用。
一、top
命令詳解
1. 基礎語法與核心參數
top [options]
-
關鍵參數:
-
-d <秒>
:刷新間隔(默認3秒) -
-p <PID>
:監控指定進程 -
-u <用戶>
:篩選某用戶的進程 -
-b
:批處理模式(輸出到文件) -
-H
:顯示線程(需在交互界面按H
切換)
-
2. 交互界面操作
快捷鍵 | 功能 | 場景 |
---|---|---|
P | 按CPU使用率排序 | 定位CPU密集型進程 |
M | 按內存使用率排序 | 排查內存泄漏 |
N | 按PID排序 | 快速查找指定進程 |
k | 終止進程 | 強制結束異常進程 |
z | 切換顏色高亮 | 增強可讀性 |
1 | 展開/折疊CPU核心統計 | 分析多核負載均衡 |
V | 樹狀顯示進程關系 | 查看父子進程依賴 |
3. 關鍵指標解析
-
頂部匯總區:
Load average: 1.02, 0.95, 0.85 # 1/5/15分鐘平均負載(建議≤CPU核心數) %Cpu(s): 30.1 us, 10.2 sy, 0.0 ni, 59.7 id, 0.0 wa, 0.0 hi, 0.0 si # us=用戶態CPU, sy=內核態CPU, id=空閑, wa=I/O等待
-
進程列表區:
PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 1024 mysql 20 0 12.3g 5.2g 280m 78.6 16.3 100:23.4 mysqld # VIRT=虛擬內存, RES=物理內存, SHR=共享內存
二、htop
命令進階
1. 安裝與基礎用法
# 安裝 sudo apt install htop # Debian/Ubuntu sudo yum install htop # RHEL/CentOS# 啟動 htop -d 5 -u nginx # 每5秒刷新,僅顯示nginx用戶進程
2. 核心功能對比 top
特性 | top | htop |
---|---|---|
交互體驗 | 基礎快捷鍵 | 鼠標支持、顏色高亮 |
視圖模式 | 單一列表 | 樹狀結構、自定義列 |
過濾與搜索 | 有限 | 正則表達式過濾(F4) |
進程操作 | 僅終止進程 | 發送任意信號(F9) |
性能監控 | 基礎CPU/內存 | 動態圖形化顯示(進度條) |
3. 高級操作技巧
-
進程跟蹤:選中進程按
s
調用strace
追蹤系統調用 -
資源視圖:按
F2
進入設置,添加IO_RATE
或CGROUP
列 -
批量操作:按空格標記多個進程,批量發送信號或終止
三、工作場景案例
1. CPU 使用率突增(使用 top
)
現象:服務器負載飆升,CPU idle 降至 5% 操作:
-
啟動
top
并按P
排序:PID USER %CPU COMMAND 8871 appuser 180% java
-
發現某個 Java 進程 CPU 占用異常(超過100%表示多線程占用)
-
按
H
切到線程模式,定位具體線程:PID USER %CPU COMMAND 8872 appuser 95% java 8873 appuser 85% java
-
結合
jstack
分析 Java 線程棧,排查死循環或鎖競爭
2. 內存泄漏分析(使用 htop
)
現象:系統空閑內存持續下降,頻繁觸發 OOM 操作:
-
啟動
htop
,按F6
→ 選擇%MEM
降序排序 -
發現某 Python 進程 RES 內存持續增長:
PID USER %MEM COMMAND 456 dbuser 22% python3 /opt/app/run.py
-
按
F9
→ 發送SIGUSR1
信號觸發應用內存快照(需應用支持) -
使用
pmap -x 456
查看進程內存分布,定位未釋放的堆內存
3. 僵尸進程清理(使用 top
)
現象:top
顯示大量 Z
狀態進程 操作:
-
在
top
中觀察進程列表,篩選Z
狀態:PID USER S %CPU %MEM COMMAND 1234 orphan Z 0.0 0.0 [sh]
-
記錄僵尸進程的父進程 PID(如PPID=1000)
-
向父進程發送
SIGCHLD
信號要求回收子進程:kill -s SIGCHLD 1000
-
若父進程無響應,強制終止父進程:
kill -9 1000
4. 磁盤 I/O 瓶頸定位(使用 htop
)
現象:應用響應延遲高,%wa
持續超過 30% 操作:
-
在
htop
中按F2
→ 添加IO_READ_RATE
和IO_WRITE_RATE
列 -
發現某日志采集進程(filebeat)寫速率高達 120MB/s:
PID USER IO_READ_RATE IO_WRITE_RATE COMMAND 789 root 0.00B/s 122.4MB/s filebeat
-
按
s
跟蹤進程 I/O 操作,確認寫入目標文件系統 -
優化方案:將日志寫入獨立磁盤或啟用異步寫入模式
5. 容器化環境資源監控(使用 htop
)
現象:Docker 容器性能下降,懷疑資源爭搶 操作:
-
啟用
htop
的 CGroup 視圖:htop --tree --sort-key=PERCENT_CPU
-
展開容器進程樹,檢查子進程資源總和:
PID USER %CPU CGROUP COMMAND 1122 root 15% /docker/abcd containerd-shim ├─1133 appuser 12% node server.js └─1150 appuser 3% node worker.js
-
對比容器配額:
docker stats <container_id>
-
確認容器 CPU 限制是否過低,調整
--cpus
參數
四、總結與最佳實踐
-
工具選擇:
-
快速故障排查:優先使用
top
(無需安裝) -
深度分析:使用
htop
(交互更高效)
-
-
性能分析流程:
-
top/htop
定位高負載進程 -
pidstat
或perf
分析進程細節 -
strace
/jstack
/gdb
跟蹤代碼行為
-
-
監控增強:
-
配置
~/.config/htop/htoprc
自定義視圖 -
使用
glances
整合多維度監控數據
-
-
自動化報警:
# 檢測CPU持續超閾值的進程 top -b -n 1 | awk '/^%Cpu/ {if ($2 > 90) print "Alert: High CPU"}'
ps命令
ps
是 Linux 進程管理的核心工具,能夠以 靜態快照 形式展示系統進程狀態。作為中級運維工程師,需掌握其高級過濾、輸出格式化和與其他工具的協同使用,精準定位進程級問題。
一、命令語法與核心參數
ps [options]
1. 參數風格區分
-
BSD 風格(無短橫線):
ps aux
-
Unix 風格(帶短橫線):
ps -ef
-
GNU 長格式:
ps --pid 1234
2. 關鍵參數
參數 | 作用 | 常用場景 |
---|---|---|
-e / -A | 顯示所有進程 | 全局進程監控 |
-f | 完整格式輸出(包含CMD、PPID等) | 查看進程啟動命令 |
-u <user> | 按用戶過濾進程 | 排查特定用戶資源占用 |
-p <PID> | 按PID過濾進程 | 跟蹤指定進程狀態 |
--sort=-%mem | 按內存使用降序排序 | 定位內存泄漏進程 |
-L | 顯示線程(LWP列表) | 分析多線程應用 |
-o <字段> | 自定義輸出字段(支持50+字段) | 定制化監控視圖 |
--forest | 樹狀顯示進程父子關系 | 分析進程派生關系 |
二、輸出字段解析(重點字段)
字段 | 含義 | 診斷價值 |
---|---|---|
PID | 進程ID | 進程操作(kill、優先級調整) |
PPID | 父進程ID | 分析僵尸進程來源 |
%CPU | CPU使用率 | 定位CPU密集型進程 |
%MEM | 內存使用率 | 發現內存泄漏 |
VSZ | 虛擬內存大小(KB) | 評估進程內存需求 |
RSS | 物理內存占用(KB) | 真實內存消耗分析 |
START | 進程啟動時間 | 排查異常時段啟動的進程 |
STAT | 進程狀態代碼 | 識別僵尸(Z)、睡眠(S)等狀態 |
COMMAND | 完整啟動命令 | 確認進程來源與行為 |
進程狀態代碼擴展:
-
R
:運行中 -
S
:可中斷睡眠 -
D
:不可中斷睡眠(通常與I/O相關) -
Z
:僵尸進程 -
T
:已停止 -
<
:高優先級 -
N
:低優先級 -
L
:內存鎖頁 -
s
:會話領導者
三、工作場景案例
1. 檢測內存泄漏進程
# 按內存使用率降序,顯示前10進程 ps -eo pid,%mem,rss,comm --sort=-%mem | head -n 10
輸出分析:
PID %MEM RSS COMMAND1234 22.3 1823456 java5678 15.2 1245678 python3
操作:
-
結合
jstat -gcutil 1234
(Java進程)分析GC情況 -
使用
pmap -x 1234
查看內存分布 -
最終定位為緩存未釋放導致RSS持續增長
2. 清理僵尸進程
# 查找僵尸進程及其父進程 ps -A -o stat,pid,ppid,comm | grep -w 'Z'
輸出:
Z 1234 5678 [sh] <defunct>
操作:
-
殺死父進程強制回收僵尸:
kill -9 5678
-
若父進程為關鍵進程不可殺,重啟相關服務
3. 追蹤異常網絡連接
# 查找所有開啟80端口的進程 ps -eo pid,cmd | grep -E ':80\b'
輸出:
1234 /usr/sbin/apache2 -k start 5678 /opt/malware -listen :80
結論:發現非 Apache 進程監聽 80 端口,疑似惡意程序
4. 分析容器內進程
# 顯示Docker容器進程的映射關系 ps -e -o pid,user,cmd --forest | grep -A 3 'docker-containerd'
輸出:
1234 root \_ docker-containerd --config /var/run/docker/containerd/containerd.toml5678 root \_ containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/abcd6789 1001 \_ node server.js
用途:確認容器進程樹結構,排查資源未釋放問題
5. 統計用戶進程資源
# 顯示nginx用戶進程的CPU和內存總消耗 ps -u nginx -o %cpu,%mem --no-header | awk '{cpu+=$1; mem+=$2} END{print "CPU:", cpu, "% MEM:", mem, "%"}'
輸出:
CPU: 78.3% MEM: 12.5%
結論:Nginx 進程資源占用合理,排除用戶級資源超限
四、高級用法
1. 自定義輸出格式
# 顯示進程的cgroup信息(容器環境關鍵字段) ps -eo pid,user,cgroup,cmd --width 200
2. 結合時間篩選進程
# 查找最近1小時啟動的進程 ps -eo pid,lstart,cmd --sort=-start_time | awk '$2 >= "2023-09-20 14:00:00"'
3. 進程狀態批量操作
# 批量殺死所有sleep狀態的進程 ps -eo pid,stat | awk '$2 ~ /S/ {print $1}' | xargs kill -9
五、總結與最佳實踐
-
組合工具鏈:
-
實時監控:
ps
+watch
(如watch -n 1 'ps -eo %mem,pid,comm --sort=-%mem | head'
) -
深度分析:
ps
定位 PID →strace
/perf
跟蹤行為
-
-
自動化監控:
# 每5分鐘記錄高CPU進程 */5 * * * * ps -eo pid,%cpu,comm --sort=-%cpu | head -n 10 >> /var/log/high_cpu.log
-
避坑指南:
-
VSZ
包含共享庫內存,優先關注RSS
-
僵尸進程無法直接
kill
,需處理其父進程 -
ps aux
與ps -ef
輸出差異:BSD vs Unix格式
-
-
性能影響:
ps
在進程數 >1萬時可能變慢,生產環境建議結合/proc
文件系統直接分析。
pidstat命令
一、命令概述
pidstat
是 sysstat
工具集的一部分,用于監控進程及線程的資源使用情況,包括 CPU、內存、磁盤 I/O、上下文切換 等。它是 Linux 系統性能排查和調優的重要工具。
二、安裝與基本語法
1. 安裝方法
# Debian/Ubuntu apt-get install sysstat# RHEL/CentOS yum install sysstat# 啟動數據收集服務(默認每10分鐘采集一次系統狀態) systemctl enable sysstat && systemctl start sysstat
2. 基本語法
pidstat [選項] [間隔時間] [次數]
三、核心選項及參數解析
選項 | 作用 | 關鍵指標說明 |
---|---|---|
-u | 監控 CPU 使用率 | %usr (用戶態CPU)、%system (內核態CPU)、%guest (虛擬機CPU)、%CPU (總使用率) |
-r | 監控內存 | minflt/s (次缺頁錯誤)、majflt/s (主缺頁錯誤)、%MEM (內存占比) |
-d | 監控磁盤 I/O | kB_rd/s (讀取速度)、kB_wr/s (寫入速度) |
-w | 監控上下文切換 | cswch/s (主動切換)、nvcswch/s (被動切換) |
-t | 顯示線程級數據 | TGID (主進程ID)、TID (線程ID) |
-p PID | 指定進程 ID | 可搭配其他選項過濾特定進程 |
四、工作案例場景
案例 1:CPU 使用率過高排查
場景:服務器 CPU 使用率持續 90% 以上,快速定位問題進程。 命令:
pidstat -u 1 5 # 每1秒采樣,共5次
輸出關鍵點:
03:15:01 PM UID PID %usr %system %CPU CPU Command 03:15:02 PM 0 10456 85.00 5.00 90.00 1 java
分析:進程 java
(PID 10456) 占用了 90% CPU,需進一步檢查其線程或堆棧。
案例 2:內存泄漏分析
場景:系統內存使用率持續增長,疑似內存泄漏。 命令:
pidstat -r -p 12345 2 10 # 監控PID 12345的內存,每2秒一次,共10次
輸出關鍵點:
03:20:01 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 03:20:03 PM 1001 12345 500.00 0.20 10G 8.5G 25.3% python
分析:minflt/s
(次缺頁)高達 500/秒,RSS
內存占用 8.5G,可能存在內存泄漏。
案例 3:磁盤 I/O 瓶頸定位
場景:磁盤 I/O 使用率高,系統響應緩慢。 命令:
pidstat -d 2 # 每2秒采樣一次磁盤I/O
輸出關鍵點:
03:25:01 PM UID PID kB_rd/s kB_wr/s Command 03:25:03 PM 0 9876 0.00 1200.00 mysqld
分析:mysqld
進程寫入速度達 1200kB/s,需檢查是否大量寫操作或慢查詢。
案例 4:上下文切換頻繁分析
場景:系統上下文切換頻繁(context switch
過高)。 命令:
pidstat -w -t 1 5 # 監控線程級上下文切換
輸出關鍵點:
03:30:01 PM UID TGID TID cswch/s nvcswch/s Command 03:30:02 PM 0 11247 - 200.0 150.0 nginx 03:30:02 PM 0 - 11248 180.0 120.0 |__nginx-worker
分析:nginx-worker
線程主動切換 (cswch/s
) 180次/秒,可能因頻繁系統調用或鎖競爭。
案例 5:綜合監控與自動化
場景:長期監控關鍵進程,生成性能報告。 命令:
# 每5分鐘記錄一次MySQL進程的CPU、內存、I/O pidstat -urd -p $(pgrep mysqld) 300 -h >> /var/log/mysql_perf.log
自動化配置: 將命令寫入 crontab
,實現定時監控:
*/5 * * * * /usr/bin/pidstat -urd -p $(pgrep mysqld) 300 1 -h >> /var/log/mysql_perf.log
五、高級技巧
-
線程級監控: 使用
-t
參數并配合-p PID
,定位多線程應用的資源爭用問題。 -
與其他工具聯動:
# 結合 awk 快速提取CPU占用Top3進程 pidstat -u 1 3 | awk '{print $6,$8}' | sort -k2 -nr | head -n 4
-
對比歷史數據:
# 使用 sar 查看歷史CPU數據(依賴sysstat) sar -u -s 10:00:00 -e 12:00:00
六、注意事項
-
權限要求:部分指標(如內核態 CPU)需
root
權限。 -
版本差異:不同 Linux 發行版的
pidstat
選項可能略有差異,建議通過man pidstat
確認。 -
數據解讀:需結合系統整體負載(如
vmstat
、iostat
)綜合分析,避免單一指標誤判。
通過以上方法,pidstat
可快速定位 CPU 瓶頸、內存泄漏、I/O 爭用等問題,是運維工程師性能調優的利器。
free命令
一、命令概述
free
是 Linux 系統內置工具,用于快速查看 內存(RAM)和交換空間(Swap) 的使用情況。它能顯示總內存、已用內存、空閑內存、緩存(Cache)和緩沖區(Buffer)的詳細信息,是排查內存瓶頸和性能調優的核心工具。
二、基本語法
free [選項]
三、核心選項及參數解析
選項 | 作用 |
---|---|
-h | 以人類可讀格式顯示(自動轉換單位,如 GB/MB) |
-s N | 每 N 秒刷新一次數據(持續監控) |
-t | 顯示 總計行(物理內存 + Swap 的總和) |
-g | 以 GB 為單位顯示 |
-m | 以 MB 為單位顯示 |
-w | 分離緩存(Cache)和緩沖區(Buffer)顯示 |
--si | 使用 1000 進制(默認 1024 進制,如 1K=1024) |
四、輸出字段詳解
執行 free -h
輸出示例:
total used free shared buff/cache available Mem: 15Gi 4.2Gi 2.1Gi 0.2Gi 8.7Gi 10Gi Swap: 2.0Gi 0.5Gi 1.5Gi
-
total:總內存大小(包括物理內存和 Swap)。
-
used:已使用的內存(計算公式:
used = total - free - buff/cache
)。 -
free:完全未使用的內存。
-
shared:被共享內存占用的部分(如 tmpfs)。
-
buff/cache:緩沖區(Buffer)和緩存(Cache) 占用的內存(可被快速回收)。
-
available:系統可分配給新進程的預估可用內存(關鍵指標,包含 free + 可回收的 buff/cache)。
五、工作案例場景
案例 1:快速檢查系統內存壓力
場景:服務器響應變慢,懷疑內存不足。 命令:
free -h
輸出分析:
-
如果
available
接近free
,說明緩存未被有效利用,可能存在內存瓶頸。 -
若
Swap
的used
持續增長,表明物理內存不足,系統正在頻繁使用交換空間。
案例 2:持續監控內存使用變化
場景:排查內存泄漏問題,觀察內存占用趨勢。 命令:
free -h -s 5 # 每5秒刷新一次
關鍵指標:
-
持續觀察
used
和available
的變化,若available
持續下降,可能存在內存泄漏。
案例 3:診斷緩存(Cache)占用過高
場景:發現 buff/cache
占用 70% 內存,用戶誤認為內存不足。 命令:
free -h -w # 分離顯示 Buffer 和 Cache
輸出示例:
total used free shared buffers cache available Mem: 15Gi 4Gi 2Gi 0.2Gi 1Gi 7Gi 10Gi
分析:
-
cache
是內核緩存的文件數據(如頻繁讀取的文件),可被快速釋放。 -
無需手動清理,除非遇到極端性能問題(通過
echo 3 > /proc/sys/vm/drop_caches
清理)。
案例 4:計算應用程序真實內存占用
場景:Java 應用啟動后,free
顯示 used
增加 2GB,但監控工具顯示應用僅占用 1GB。 原理:
-
free
的used
包含所有內存分配,而應用監控工具可能只統計堆內存。 驗證方法:
# 1. 記錄初始可用內存 available_init=$(free -m | awk '/Mem:/ {print $7}') # 2. 啟動 Java 應用 # 3. 再次檢查可用內存 available_now=$(free -m | awk '/Mem:/ {print $7}') # 計算差值 echo "應用實際占用內存: $((available_init - available_now)) MB"
案例 5:優化 Swap 使用策略
場景:物理內存充足,但 Swap 頻繁使用,導致磁盤 I/O 升高。 診斷步驟:
-
查看 Swap 使用情況:
free -h | grep Swap
-
檢查
swappiness
參數(默認值 60,范圍 0-100):cat /proc/sys/vm/swappiness
-
降低 Swap 使用傾向(臨時生效):
sysctl vm.swappiness=10
-
永久生效:
echo "vm.swappiness=10" >> /etc/sysctl.conf
案例 6:自動化內存監控腳本
場景:定時記錄內存狀態,用于生成性能報告。 腳本示例:
#!/bin/bash LOG_FILE="/var/log/mem_usage.log" echo "$(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE free -h | awk '/Mem:/ {print "Mem Available:", $7}' >> $LOG_FILE free -h | awk '/Swap:/ {print "Swap Used:", $3}' >> $LOG_FILE echo "------------------------" >> $LOG_FILE
定時任務配置(每 30 分鐘執行):
crontab -e */30 * * * * /path/to/script.sh
六、高級技巧
-
結合
vmstat
分析內存瓶頸:vmstat 1 5 # 查看內存、Swap、I/O 和 CPU 的綜合情況
-
通過
/proc/meminfo
獲取更詳細信息:cat /proc/meminfo # free 命令的數據來源
-
快速釋放緩存(僅限緊急情況):
sync; echo 1 > /proc/sys/vm/drop_caches # 釋放頁緩存 sync; echo 2 > /proc/sys/vm/drop_caches # 釋放目錄項和 inode sync; echo 3 > /proc/sys/vm/drop_caches # 釋放所有緩存
七、注意事項
-
不要迷信
free
列:Linux 會盡可能利用空閑內存作為緩存,available
才是可用內存的真實指標。 -
Swap 使用不一定是問題:少量 Swap 使用可能屬于正常現象,但持續增長需警惕。
-
區分 Buffer 和 Cache: (面試)
-
Buffer:內核緩沖區,用于暫存磁盤 I/O 的原始數據塊。
-
Cache:文件系統緩存,用于加速文件讀取。
-
通過靈活使用 free
命令,運維工程師可以快速定位內存不足、Swap 濫用、緩存異常等問題,并結合其他工具(如 top
、vmstat
)進行深度分析。
smem命令
一、命令概述
smem
是 Linux 系統內存分析工具,專注于提供更精準的進程內存占用統計。它通過計算 USS(Unique Set Size)、PSS(Proportional Set Size) 和 RSS(Resident Set Size) 等指標,幫助運維工程師準確評估進程的真實內存消耗,尤其適用于多進程共享內存的場景(如 Apache/Nginx 多線程服務)。
二、安裝方法
# Debian/Ubuntu apt-get install smem# RHEL/CentOS(需啟用 EPEL 倉庫) yum install epel-release && yum install smem# 驗證安裝 smem --version
三、核心指標解析
指標 | 說明 |
---|---|
USS | 進程獨占的物理內存(不包含共享內存) |
PSS | 共享內存按進程數均攤后的內存值(USS + 共享內存/進程數) |
RSS | 進程實際占用的物理內存(包含共享內存) |
Swap | 進程使用的交換空間 |
適用場景:
-
USS:評估進程獨立占用的內存(內存泄漏排查)。
-
PSS:更公平地統計多進程共享內存的總消耗(如容器化環境)。
-
RSS:傳統內存統計指標(與
top
/ps
一致)。
四、基本語法及常用選項
smem [選項] [過濾條件]
選項 | 說明 |
---|---|
-k | 以 KB 為單位顯示 |
-m | 以 MB 為單位顯示 |
-u | 按用戶統計內存使用 |
-p | 顯示內存占比(百分比) |
-r | 按內存降序排序 |
-t | 顯示總計行 |
-c "列名" | 自定義輸出列(如 -c "name uss pss rss" ) |
-H | 隱藏表頭(便于腳本處理) |
-P <正則> | 按進程名過濾(如 -P "nginx" ) |
-U <用戶> | 按用戶過濾(如 -U www-data ) |
五、工作案例場景
案例 1:快速定位內存占用最高的進程
場景:服務器內存使用率超過 90%,需快速找出問題進程。 命令: (-m有問題,刪除)
smem -s uss -r -m -t
輸出示例:
PID User Command USS PSS RSS Swap 12345 mysql /usr/sbin/mysqld 1204M 1320M 1450M 50M 6789 java /opt/jdk/bin/java 890M 910M 1000M 200M ---------------------------------------------- Total: 24910M 26520M 28000M 1200M
分析:
-
mysqld
的 USS 高達 1204MB,可能是內存泄漏或配置不合理。 -
java
進程的 Swap 使用較多,需檢查 JVM 堆配置或物理內存是否不足。
案例 2:按用戶統計內存消耗
場景:多用戶服務器需統計各用戶的內存使用量。 命令:
smem -u -k -p -t | awk '{printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4}'
輸出示例:
User USS(%) PSS(%) RSS(%) root 45% 50% 55% www-data 30% 25% 20% postgres 15% 20% 18% ----------------------------- Total: 100% 100% 100%
分析:
-
root
用戶占用 45% 的 USS,需檢查系統服務(如 MySQL、Docker)。 -
www-data
用戶 PSS 較低但 RSS 較高,可能因共享內存(如 PHP-FPM 進程池)。
案例 3:分析容器/多進程應用的真實內存占用
場景:某 Docker 容器疑似內存超限,需精確統計其內存消耗。 命令:
# 獲取容器內所有進程的 PID CONTAINER_PIDS=$(docker inspect --format='{{.State.Pid}}' my_container) pgrep -P $CONTAINER_PIDS | xargs smem -c "name uss pss rss" -k -P
輸出示例:
Command USS PSS RSS python3 app.py 1200K 1500K 1800K nginx: worker process 800K 1000K 1200K
分析:
-
容器總 PSS = 1500K + 1000K = 2500KB,更接近真實內存占用(傳統 RSS 統計會重復計算共享內存)。
案例 4:生成內存使用報告(適合自動化監控)
場景:定時記錄內存使用情況并生成 CSV 報告。 腳本:
#!/bin/bash DATE=$(date '+%Y-%m-%d %H:%M:%S') smem -H -c "name uss pss rss" -t -m | awk -v date="$DATE" '{print date "," $0}' >> /var/log/mem_report.csv
定時任務(每 30 分鐘執行):
crontab -e */30 * * * * /path/to/script.sh
CSV 示例:
2023-10-01 14:00:00,apache2,120,150,200 2023-10-01 14:00:00,mysqld,300,320,350 2023-10-01 14:00:00,total,420,470,550
案例 5:分析共享內存的分布
場景:某服務多個進程共享內存,需評估資源分配是否合理。 命令:
smem -c "command uss pss rss" -m -k -P "nginx"
輸出示例:
Command USS PSS RSS nginx: master 5M 6M 8M nginx: worker 4M 5M 7M nginx: worker 4M 5M 7M nginx: worker 4M 5M 7M
分析:
-
每個 worker 進程的 PSS 為 5MB(USS=4MB + 共享內存 1MB),總 PSS = 6MB(master) + 3*5MB = 21MB。
-
傳統 RSS 統計會顯示 8MB + 3*7MB = 29MB,高估了實際內存消耗。
六、高級技巧
-
生成圖形化報告:
smem --pie=command -s pss # 生成按進程 PSS 占比的餅圖(需圖形界面支持)
-
結合
watch
實時監控:watch -n 1 'smem -s pss -r -m | head -n 10'
-
過濾特定進程并排序:
smem -P "java" -s swap -r # 按 Java 進程的 Swap 使用降序排序
七、注意事項
-
權限要求:查看其他用戶進程的內存信息需
sudo
權限。 -
內核支持:部分指標依賴
/proc/<pid>/smaps
文件,需內核版本 ≥ 2.6.14。 -
數據解讀:
-
USS 是進程獨占內存,直接釋放需終止進程。
-
PSS 是評估多進程共享內存場景的關鍵指標。
-
高 Swap 使用可能因物理內存不足或
swappiness
配置不當。
-
通過 smem
,運維工程師可精準識別內存泄漏、優化多進程應用資源分配,并為容器化環境提供更真實的內存監控數據。結合 top
、free
等工具,可構建完整的內存分析體系。
pmap命令
一、命令概述
pmap
是 Linux 系統中用于分析進程內存映射的實用工具,可顯示進程的虛擬內存布局、內存區域權限、映射文件及內存占用詳情。其核心價值在于診斷內存泄漏、分析共享內存分配,并幫助開發者理解進程的內存使用結構(如堆、棧、動態庫等)。
二、安裝方法
pmap
通常預裝在大多數 Linux 發行版中,屬于 procps
或 procps-ng
工具包。若系統未內置,可通過以下方式安裝:
# Debian/Ubuntu apt-get install procps# RHEL/CentOS yum install procps-ng# 驗證安裝 pmap --version
三、核心字段解析
字段 | 說明 |
---|---|
Address | 內存區域的起始虛擬地址(十六進制)。 |
Kbytes | 虛擬內存大小(KB)。 |
RSS | 駐留物理內存大小(KB),即實際使用的物理內存。 |
Dirty | 臟頁大小(被修改但未寫入磁盤的內存,KB),需 -x 選項顯示。 |
Mode | 權限標記:r (讀)、w (寫)、x (執行)、s (共享)、p (私有)。 |
Mapping | 內存區域類型或關聯文件,如 [heap] 、[stack] 、libc.so.6 等。 |
適用場景:
-
Dirty:分析頻繁修改的內存區域(如緩存或緩沖區)。
-
RSS:評估進程實際物理內存占用。
-
Mapping:定位內存泄漏的模塊或異常映射。
四、基本語法及常用選項
pmap [選項] <PID>
選項 | 說明 |
---|---|
-x | 顯示擴展信息(RSS、Dirty、內存模式等)。 |
-d | 顯示內存映射的設備信息(主設備號:次設備號)。 |
-q | 安靜模式,省略頭尾統計行。 |
-A <范圍> | 僅顯示指定地址范圍內的內存映射(如 -A 0x55* )。 |
-c | 顯示完整路徑(動態庫或文件的絕對路徑)。 |
-p | 顯示內存保護標志(需 -x 配合)。 |
五、工作案例場景
案例 1:快速定位進程內存占用詳情
場景:某 Java 服務內存占用異常,需分析其內存分配細節。 命令:
pmap -x 1234 # 1234 為進程 PID
輸出示例:
Address Kbytes RSS Dirty Mode Mapping 0000555555554000 4 4 0 r-x-- java 00007ffff7a00000 102400 51200 25600 rw--- [heap] 00007ffff7bd0000 10240 0 0 ----- [anon] ... ---------------- ------- ------ ------ total kB: 1048576 524288 25600
分析:
-
[heap]
區域 Dirty 頁高達 25600KB,可能因對象頻繁創建/修改。 -
匿名內存(
[anon]
)占用 10240KB,需檢查是否未釋放臨時緩沖區。
案例 2:檢查共享內存使用
場景:多進程服務共享內存異常,需驗證共享段映射。 命令:
pmap -x 5678 | grep -E 'shm|SYSV'
輸出示例:
00007fffe0000000 16384 16384 16384 rw-s- SYSV00000000 # 共享內存段
分析:
-
共享內存段(
SYSV
標記)的 RSS 和 Dirty 均為 16384KB,表明所有進程共享同一物理內存。
案例 3:分析動態庫內存占用
場景:某進程加載了異常動態庫,需確認其路徑及內存占用。 命令:
pmap -c 9012 | grep .so # 過濾動態庫
輸出示例:
00007ffff7de1000 256 128 0 r-x-- /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
分析:
-
動態庫
libz.so
占用 128KB RSS,驗證是否為預期版本。
案例 4:排查內存泄漏(周期性監控)
場景:服務運行后內存持續增長,需定期抓取內存快照。 腳本:
#!/bin/bash PID=$(pgrep my_service) pmap -x $PID > /tmp/mem_snapshot_$(date +%s).log
分析方法:
-
對比多次快照中
[heap]
或[anon]
區域的 RSS 增長趨勢。
案例 5:調試硬件設備內存映射
場景:GPU 加速服務異常,需檢查設備內存映射。 命令:
pmap -d 6789 | grep -i 'nvidia'
輸出示例:
0000700000000000 65536 0 0 rw--- nvidia-uvm:0 # GPU 設備內存
分析:
-
設備內存映射成功,但 RSS 為 0,表明數據暫未加載到物理內存。
六、高級技巧
-
結合
gdb
調試內存地址:pmap -x 1234 | grep [heap] # 獲取堆地址 gdb -p 1234 -ex "x/10x 0x7ffff7a00000" # 查看堆內存內容
-
統計內存類型分布:
pmap -x 1234 | awk '/\[heap\]/ {heap+=$2} /\[stack\]/ {stack+=$2} END {print "Heap:", heap, "Stack:", stack}'
-
監控臟頁變化(需 root):
watch -n 1 'pmap -x 1234 | grep "rw---" | awk "{sum+=\$4} END {print sum}"'
七、注意事項
-
權限要求:
-
查看其他用戶進程需
sudo
或 root 權限。 -
部分內核版本可能限制
/proc/<pid>/smaps
訪問。
-
-
數據解讀:
-
Dirty 頁:可能因寫時復制(Copy-on-Write)機制虛高,需結合業務邏輯判斷。
-
匿名內存:可能包含線程棧或
malloc
分配的內存,需進一步分析。
-
-
性能影響:
-
頻繁執行
pmap
可能對高負載進程產生性能擾動。
-
通過 pmap
,可深入分析進程內存布局,快速定位內存泄漏、異常映射或硬件資源沖突問題。結合 smem
、valgrind
等工具,可構建全面的內存優化體系。
sar命令
一、命令概述
sar
(System Activity Reporter)是 Linux 系統性能監控工具,屬于 sysstat
工具包。它用于收集、報告和保存系統資源使用情況,涵蓋 CPU、內存、磁盤、網絡、進程隊列等核心指標,支持實時監控與歷史數據分析,是運維工程師進行性能調優和故障排查的核心工具。
二、安裝方法
# Debian/Ubuntu apt-get install sysstat# RHEL/CentOS(需啟用 EPEL 倉庫) yum install epel-release && yum install sysstat# 啟動數據收集服務(默認每10分鐘收集一次) systemctl enable --now sysstat# 驗證安裝 sar -V
三、核心指標解析
子系統 | 關鍵指標 | 說明 |
---|---|---|
CPU | %user , %system | 用戶態/內核態 CPU 使用率 |
%iowait | CPU 等待 I/O 操作的時間占比 | |
%idle | CPU 空閑時間占比 | |
內存 | kbmemfree , kbmemused | 空閑/已用物理內存(KB) |
%memused | 內存使用率 | |
kbswpfree , kbswpused | 空閑/已用交換分區(KB) | |
磁盤 | tps | 每秒 I/O 傳輸次數(Transfers Per Second) |
rkB/s , wkB/s | 每秒讀/寫數據量(KB) | |
網絡 | rxkB/s , txkB/s | 每秒接收/發送數據量(KB) |
rxpck/s , txpck/s | 每秒接收/發送的網絡包數量 | |
進程隊列 | runq-sz | 運行隊列中的進程數(等待 CPU 的進程) |
plist-sz | 系統進程總數 |
四、基本語法及常用選項
sar [選項] [間隔時間] [次數]
選項 | 說明 |
---|---|
-u | 顯示 CPU 使用率(默認報告) |
-r | 顯示內存和交換分區使用情況 |
-d | 顯示磁盤 I/O 統計(需 root 權限) |
-n DEV | 顯示網絡接口流量統計 |
-n TCP | 顯示 TCP 連接狀態(如重傳率、連接數) |
-b | 顯示塊設備(磁盤)活動 |
-q | 顯示進程隊列和負載 |
-p | 人性化顯示磁盤名稱(如 sda 而非 dev8-0 ) |
-s <時間> | 指定歷史數據的開始時間(格式:HH:MM:SS ) |
-e <時間> | 指定歷史數據的結束時間 |
-f <文件> | 從指定文件讀取歷史數據(默認路徑:/var/log/sa/saXX ,XX 為日期) |
五、工作案例場景
案例 1:實時監控 CPU 使用率
場景:服務器 CPU 使用率突增,需快速定位高負載原因。 命令:
sar -u 2 5 # 每2秒采樣一次,共5次
輸出示例:
Linux 5.4.0-91-generic (hostname) 10/01/2023 _x86_64_ (4 CPU)14:30:00 CPU %user %nice %system %iowait %steal %idle 14:30:02 all 85.20 0.00 8.50 5.30 0.00 1.00 14:30:04 all 90.10 0.00 7.80 1.90 0.00 0.20 ... Average: all 87.65 0.00 8.15 3.60 0.00 0.60
分析:
-
%user
長期高于 85%,表明用戶態進程(如應用代碼)是 CPU 瓶頸。 -
%iowait
偶爾較高,需結合磁盤 I/O 分析是否有存儲延遲。
案例 2:分析歷史內存使用
場景:凌晨服務出現內存不足告警,需回溯歷史數據。 命令:
sar -r -s 02:00:00 -e 04:00:00 -f /var/log/sa/sa01 # 查看1號凌晨2點到4點的數據
輸出示例:
02:00:01 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached 02:10:01 AM 1024000 1502000 3072000 75.00 20480 512000 02:20:01 AM 512000 901000 3584000 87.50 10240 256000 ... 03:50:01 AM 256000 614000 3840000 94.00 5120 128000
分析:
-
kbmemused
從 75% 增長至 94%,可能存在內存泄漏或未釋放緩存。 -
kbcached
下降,表明系統嘗試釋放緩存以緩解內存壓力。
案例 3:診斷磁盤 I/O 瓶頸
場景:數據庫寫入緩慢,懷疑磁盤性能不足。 命令:
sar -d -p 1 10 # 每1秒采樣一次,共10次
輸出示例:
14:35:01 DEV tps rkB/s wkB/s %util 14:35:02 sda 1200.00 8000.00 40000.00 99.80 14:35:03 sda 1150.00 7500.00 38000.00 98.50 ... Average: sda 1100.00 7000.00 39000.00 99.00
分析:
-
%util
接近 100%,表明磁盤滿負荷運行。 -
wkB/s
高達 39MB/s,需檢查是否寫入負載過高或磁盤硬件性能不足。
案例 4:監控網絡流量峰值
場景:網絡帶寬突增,需定位流量來源。 命令:
sar -n DEV 1 5 # 每1秒采樣一次,共5次
輸出示例:
14:40:01 IFACE rxpck/s txpck/s rxkB/s txkB/s 14:40:02 eth0 2500.00 1800.00 1200.00 900.00 14:40:03 eth0 3000.00 2000.00 1500.00 1000.00 ... Average: eth0 2800.00 1900.00 1350.00 950.00
分析:
-
rxkB/s
和txkB/s
持續高于 1MB/s,可能因大文件傳輸或 DDoS 攻擊。 -
結合
-n TCP
分析是否有異常連接(如sar -n TCP 1 5
)。
案例 5:生成綜合性能報告
場景:生成全天性能摘要,用于周期性健康檢查。 命令:
sar -A -f /var/log/sa/sa01 # -A 顯示所有統計
輸出示例(部分):
...(包含 CPU、內存、磁盤、網絡等全量數據)
分析:
-
全面分析系統瓶頸,如 CPU、內存、磁盤 I/O 的關聯性。
六、高級技巧
-
自定義歷史數據收集間隔:
sed -i 's/^INTERVAL=600/INTERVAL=60/' /etc/sysstat/sysstat # 修改為每1分鐘收集一次 systemctl restart sysstat
-
生成圖形化報告:
sar -u -f /var/log/sa/sa01 | awk '/^[0-9]/ {print $1, $3}' > cpu.csv # 使用 Excel 或 Python matplotlib 繪制折線圖
-
過濾特定時間點數據:
sar -u -s 14:00:00 -e 15:00:00 # 僅分析下午2點到3點的數據
七、注意事項
-
數據存儲:
-
歷史數據保存在
/var/log/sa/saXX
(XX 為日期),默認保留 30 天。 -
需定期清理舊數據防止磁盤占滿(如
find /var/log/sa -mtime +30 -delete
)。
-
-
權限要求:
-
實時監控磁盤和網絡需 root 權限。
-
歷史數據文件默認屬主為
root:sadm
,普通用戶可能無法直接讀取。
-
-
數據解讀:
-
%iowait 高:可能是磁盤瓶頸,但也可能因進程頻繁等待鎖。
-
%idle 低:若
%user
高,需優化應用代碼;若%system
高,需排查內核或驅動問題。
-
八、字段與選項速查表
報告類型 | 關鍵字段 | 說明 | 常用選項示例 |
---|---|---|---|
CPU | %user , %system | 用戶態/內核態 CPU 使用率 | sar -u 1 5 |
內存 | kbmemused , %memused | 內存使用量及百分比 | sar -r 1 5 |
磁盤 I/O | tps , %util | 每秒 I/O 次數,設備利用率 | sar -d -p 1 5 |
網絡流量 | rxkB/s , txkB/s | 接收/發送數據速率 | sar -n DEV 1 5 |
進程隊列 | runq-sz | 等待 CPU 的進程數 | sar -q 1 5 |
交換分區 | kbswpfree | 空閑交換空間 | sar -S 1 5 |
通過 sar
,可全面掌握系統資源使用趨勢,快速定位性能瓶頸,并為容量規劃提供數據支持。結合 top
、iostat
、netstat
等工具,可構建高效的運維監控體系。
ss/netstat命令
一、命令概述
-
ss
(Socket Statistics):Linux 新一代網絡工具,用于替代netstat
,性能更高(直接讀取內核數據),支持更豐富的過濾和顯示選項。 -
netstat
:傳統網絡工具,用于顯示網絡連接、路由表、接口統計等信息,逐漸被ss
取代,但在舊系統中仍可能使用。
二、核心功能對比
功能 | ss 命令支持 | netstat 命令支持 |
---|---|---|
顯示 TCP/UDP 連接 | ? | ? |
顯示監聽端口 | ? | ? |
按協議/狀態過濾 | ? | ?(有限) |
顯示進程信息(PID/程序名) | ? | ? |
顯示內核路由表 | ? | ? |
顯示網絡接口統計 | ? | ? |
顯示內存使用統計 | ? | ? |
三、ss
命令詳解
1. 基本語法
ss [選項] [過濾條件]
2. 常用選項
選項 | 說明 |
---|---|
-t | 顯示 TCP 連接 |
-u | 顯示 UDP 連接 |
-l | 顯示監聽端口 |
-n | 禁用域名解析(顯示 IP 和端口號) |
-p | 顯示進程信息(需 root 權限) |
-s | 顯示匯總統計(總連接數、內存使用等) |
-o | 顯示計時器信息(如連接保持時間) |
-4 | 僅顯示 IPv4 連接 |
-6 | 僅顯示 IPv6 連接 |
-a | 顯示所有連接(包括監聽和非監聽) |
-i | 顯示 TCP 內部詳細信息(如擁塞窗口) |
3. 過濾語法
-
按狀態過濾:
state <狀態名>
(如established
,time-wait
,listen
) -
按端口/IP 過濾:
src <IP>:<端口>
或dst <IP>:<端口>
-
組合過濾:
and
/or
連接多個條件
四、netstat
命令詳解
1. 基本語法
netstat [選項]
2. 常用選項
選項 | 說明 |
---|---|
-t | 顯示 TCP 連接 |
-u | 顯示 UDP 連接 |
-l | 顯示監聽端口 |
-n | 禁用域名解析 |
-p | 顯示進程信息(需 root 權限) |
-r | 顯示路由表 |
-i | 顯示網絡接口統計 |
-s | 顯示協議統計匯總(如 TCP 重傳數) |
-a | 顯示所有連接 |
五、工作案例場景
案例 1:快速檢查服務端口是否監聽
場景:部署 Nginx 后,驗證 80 端口是否正常監聽。 使用 ss
:
ss -tln | grep ':80'
輸出示例:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
關鍵字段:
-
LISTEN
表示端口處于監聽狀態。 -
0.0.0.0:80
表示監聽所有 IPv4 地址的 80 端口。
使用 netstat
:
netstat -tln | grep ':80'
案例 2:分析 ESTABLISHED 連接數異常
場景:服務器連接數激增,懷疑遭受 DDoS 攻擊或程序 Bug。 使用 ss
統計每個 IP 的連接數:
ss -t -n state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
輸出示例:
50 192.168.1.10010 203.0.113.5
分析:IP 192.168.1.100
建立了 50 個連接,需檢查是否為正常業務流量。
案例 3:定位 TIME_WAIT 狀態過多問題
場景:服務器 TIME_WAIT
連接堆積,導致端口耗盡。 使用 ss
統計各狀態連接數:
ss -s # 查看匯總信息
輸出示例:
Total: 450 TCP: 38 (estab 10, closed 20, orphaned 0, timewait 15)
進一步分析:
ss -tan state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
解決方案:優化 TCP 參數(如 net.ipv4.tcp_tw_reuse
)。
案例 4:排查進程占用端口
場景:啟動服務時提示端口已被占用。 使用 ss
查找占用端口的進程:
ss -tlnp | grep ':8080'
輸出示例:
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=1234,fd=15))
關鍵信息:進程 java
(PID 1234)占用了 8080 端口。
使用 netstat
:
netstat -tlnp | grep ':8080'
案例 5:監控網絡吞吐量(結合 netstat
)
場景:分析網絡接口是否達到帶寬瓶頸。 使用 netstat
查看接口統計:
netstat -i # 顯示接口列表 netstat -e # 顯示詳細統計(收發包、錯誤數)
輸出示例:
Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 1234567 0 0 0 987654 0 0 0 BMRU
分析:
-
RX-OK/TX-OK
表示收/發包總數。 -
RX-ERR
或TX-ERR
不為零時,可能存在網絡硬件問題。
案例 6:分析 TCP 重傳率(網絡質量)
使用 ss
查看 TCP 內部指標:
ss -ti # 顯示 TCP 內部信息
輸出示例:
ESTAB 0 0 192.168.1.10:ssh 192.168.1.100:56789cubic wscale:7,7 rto:208 rtt:1.2/0.8 ato:40 mss:1448 cwnd:10 retrans:0/5
關鍵字段:
-
retrans:0/5
:總重傳次數為 5,當前連接重傳 0 次。 -
高重傳率可能因網絡擁塞或丟包。
案例 7:自動化監控腳本
場景:定時記錄服務器連接數并告警。 腳本示例:
#!/bin/bash CONN_COUNT=$(ss -s | awk '/^TCP:/ {print $2}') # 獲取總 TCP 連接數 if [ $CONN_COUNT -gt 10000 ]; thenecho "警告:TCP 連接數過高 ($CONN_COUNT)" | mail -s "網絡告警" admin@example.com fi
定時任務(每 5 分鐘執行):
crontab -e */5 * * * * /path/to/script.sh
六、高級技巧
-
ss
過濾組合:# 查找來自 192.168.1.100 且目標端口 80 的連接 ss -t -n src 192.168.1.100 and dst :80
-
netstat
路由表分析:netstat -rn # 顯示內核路由表(等效于 `route -n`)
-
統計 UDP 丟包:
netstat -su # 顯示 UDP 協議統計信息
七、注意事項
-
權限要求:查看進程信息(
-p
選項)需 root 權限。 -
性能差異:
ss
處理海量連接時性能遠優于netstat
。 -
狀態解釋:
-
ESTABLISHED
:已建立的連接。 -
TIME_WAIT
:等待關閉的連接(正常關閉后保留 2MSL 時間)。 -
CLOSE_WAIT
:應用未主動關閉連接(可能代碼 Bug)。
-
通過 ss
和 netstat
,運維工程師可以快速診斷端口占用、連接狀態異常、網絡性能瓶頸等問題。建議優先使用 ss
,在需要路由或接口統計時結合 netstat
。
curl/wget命令
一、核心區別與適用場景
工具 | 核心特點 | 典型場景 |
---|---|---|
curl | 支持 60+ 協議,側重數據傳輸/調試,無遞歸下載功能 | API 測試、HTTP 請求調試、流式數據傳輸 |
wget | 專注 HTTP/HTTPS/FTP,支持遞歸下載和斷點續傳 | 批量下載文件、網站鏡像、離線資源備份 |
二、curl 命令詳解
1. 安裝與基本語法
# 安裝(一般系統已內置) apt-get install curl # Debian/Ubuntu yum install curl # RHEL/CentOS# 基本語法 curl [選項] <URL>
2. 常用選項
選項 | 說明 |
---|---|
-I | 僅顯示響應頭(快速檢查 HTTP 狀態碼) |
-X <METHOD> | 指定 HTTP 方法(如 GET/POST/PUT/DELETE ) |
-H "Header:Value" | 添加請求頭(如 -H "Content-Type: application/json" ) |
-d "data" | 發送 POST 數據(支持 JSON/表單) |
-o <文件名> | 輸出到文件(保留遠程文件名用 -O ) |
-u user:pass | 基本認證(或使用 -n 讀取 .netrc ) |
-k | 忽略 SSL 證書驗證(生產環境慎用) |
-v | 顯示詳細通信過程(調試用) |
--limit-rate 100K | 限速下載(避免占用帶寬) |
-x <代理IP:端口> | 通過代理發送請求 |
3. 工作案例
案例 1:快速檢查服務健康狀態
# 檢查 Web 服務是否返回 200 curl -s -o /dev/null -w "%{http_code}" http://api.example.com/health # 輸出:200
選項解析:
-
-s
:靜默模式(不顯示進度) -
-o /dev/null
:丟棄響應內容 -
-w "%{http_code}"
:僅輸出 HTTP 狀態碼
案例 2:調試 API 接口
# 發送 JSON 格式的 POST 請求 curl -X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer token123" \-d '{"user": "admin", "action": "restart"}' \https://api.example.com/v1/endpoint
關鍵點:
-
使用
-H
指定 JSON 頭和認證令牌 -
-d
發送 JSON 數據(自動設置Content-Length
)
案例 3:下載文件并重命名
# 下載文件并保存為指定名稱(限速 1MB/s) curl -o backup.tar.gz --limit-rate 1M https://example.com/files/backup.tar
案例 4:模擬瀏覽器訪問
# 偽裝 User-Agent 和 Referer curl -A "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" \-e "https://google.com" \http://target-site.com
三、wget 命令詳解
1. 安裝與基本語法
# 安裝 apt-get install wget # Debian/Ubuntu yum install wget # RHEL/CentOS# 基本語法 wget [選項] <URL>
2. 常用選項
選項 | 說明 |
---|---|
-c | 斷點續傳(自動檢測已下載部分) |
-r | 遞歸下載(鏡像網站) |
-np | 不追溯父目錄(配合 -r 使用) |
-l <深度> | 遞歸下載深度(如 -l 3 ) |
-P <目錄> | 指定下載目錄 |
-O <文件名> | 指定輸出文件名 |
-q | 靜默模式(無輸出日志) |
-b | 后臺下載 |
--limit-rate=200k | 限速下載 |
--user=<用戶> | 設置認證用戶名 |
--password=<密碼> | 設置認證密碼(不安全,建議用 --ask-password ) |
3. 工作案例
案例 1:批量下載日志文件
# 下載所有匹配的日志文件(限速 500KB/s) wget -c -r -np -l 1 -A "access_*.log" --limit-rate=500k http://logs.example.com/
選項解析:
-
-A "access_*.log"
:僅下載匹配文件名的文件 -
-l 1
:只遞歸一級目錄
案例 2:鏡像靜態網站
# 完整鏡像網站(轉換鏈接適配本地瀏覽) wget -mk -w 2 --random-wait -e robots=off https://static-site.example.com
選項解析:
-
-m
:鏡像模式(等價于-r -N -l inf
) -
-k
:轉換鏈接為本地可訪問 -
-w 2
:每次請求間隔 2 秒 -
-e robots=off
:忽略 robots.txt 限制
案例 3:后臺下載大文件
# 后臺下載 ISO 文件并記錄日志 wget -b -c -o download.log -P /iso https://mirror.example.com/ubuntu-22.04.iso
驗證下載狀態:
tail -f download.log # 實時跟蹤日志
案例 4:通過代理下載
# 使用代理服務器下載(需認證) wget -e use_proxy=yes -e http_proxy=10.1.1.1:8080 \--proxy-user=user --proxy-password=pass \https://secured.example.com/data.zip
四、安全與調試技巧
-
HTTPS 證書驗證:
# 強制校驗證書(curl 默認開啟,wget 需配置) curl --cacert /path/to/ca-bundle.crt https://secure-site.com wget --ca-certificate=/path/to/ca-bundle.crt https://secure-site.com
-
敏感信息保護:
# 使用環境變量代替明文密碼 export PASS="secret" curl -u admin:$PASS https://api.example.com
-
調試 TLS 握手:
curl -v --tlsv1.3 --tls-max 1.3 https://example.com
五、高級運維場景
場景 1:自動化部署腳本
# 下載最新版本并觸發部署 LATEST_URL=$(curl -s https://api.github.com/repos/org/repo/releases/latest | grep "browser_download_url" | cut -d'"' -f4) wget -q $LATEST_URL -O /tmp/release.tar.gz tar xzf /tmp/release.tar.gz -C /opt/app systemctl restart app
場景 2:監控 API 響應時間
# 測量 API 響應時間(毫秒) curl -o /dev/null -s -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total: %{time_total}\n" https://api.example.com
場景 3:分布式文件同步
# 從多個源并行下載分片 wget https://mirror1.example.com/file.part1 & wget https://mirror2.example.com/file.part2 & wait cat file.part1 file.part2 > complete.iso
六、總結對比
操作 | curl 方案 | wget 方案 |
---|---|---|
簡單文件下載 | curl -O URL | wget URL |
斷點續傳 | curl -C - -O URL | wget -c URL |
遞歸下載 | 需配合腳本 | wget -r URL |
提交表單數據 | curl -d "key=val" URL | 不支持 |
流量控制 | --limit-rate 1M | --limit-rate=1M |
后臺執行 | 需配合 nohup 或 & | wget -b URL |
選擇建議:
-
API 交互/調試 → 優先使用
curl
-
批量下載/鏡像 → 優先使用
wget
nc(ncat)命令
一、命令概述
nc
(netcat)是 Linux 系統中的“網絡瑞士軍刀”,支持 TCP/UDP 端口監聽、數據傳輸、端口掃描、代理轉發 等場景。它不加密通信內容,適用于快速調試和臨時傳輸,但敏感場景需配合加密工具(如 openssl
)。
二、安裝方法
# Debian/Ubuntu apt-get install netcat# RHEL/CentOS yum install nmap-ncat# 驗證安裝 nc -h
三、核心選項與語法
nc [選項] <目標IP> <目標端口>
選項 | 說明 |
---|---|
-l | 監聽模式(服務端) |
-v | 顯示詳細輸出(-vv 更詳細) |
-u | 使用 UDP 協議(默認 TCP) |
-z | 端口掃描模式(不發送數據) |
-k | 客戶端斷開后保持監聽(配合 -l ) |
-n | 禁用 DNS 解析(直接使用 IP) |
-p | 指定本地源端口 |
-w <秒> | 超時時間 |
-e <命令> | 連接成功后執行命令(高危操作) |
四、工作案例場景
案例 1:測試端口連通性
場景:檢查目標主機 80 端口是否開放。
nc -zv 192.168.1.100 80
輸出解析:
-
Connection to 192.168.1.100 80 port [tcp/http] succeeded!
→ 端口開放 -
nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused
→ 端口關閉
案例 2:臨時文件傳輸
場景:跨服務器快速傳輸文件(無需 SCP/FTP)。
接收端(服務端):
nc -l -p 8080 > received_file.tar
發送端(客戶端):
nc -n 192.168.1.100 8080 < send_file.tar
驗證:
md5sum send_file.tar received_file.tar # 確保哈希一致
案例 3:遠程調試與交互式Shell
場景:臨時調試應用程序的 TCP 服務。
連接服務并發送測試數據:
nc 192.168.1.100 3306 # 輸入模擬 MySQL 握手包(需根據協議構造數據)
反向Shell(謹慎使用): 攻擊端(監聽):
nc -lvnp 4444
目標端(執行):
nc -e /bin/bash 192.168.1.200 4444 # 連接后獲得目標 Shell
?? 注意:此操作存在安全風險,需僅在授權環境中使用。
案例 4:簡易代理或端口轉發
場景:將本地 8080 端口流量轉發到遠程主機的 80 端口。
mkfifo /tmp/fifo nc -l -p 8080 < /tmp/fifo | nc 192.168.1.100 80 > /tmp/fifo
原理:
-
使用命名管道
/tmp/fifo
實現雙向數據流轉發。
案例 5:UDP 服務測試
場景:驗證 DNS 服務器 UDP 53 端口響應。
# 發送 DNS 查詢請求(需構造二進制數據) echo -n "DNS查詢二進制數據" | nc -u 8.8.8.8 53
案例 6:多端口批量掃描
場景:掃描目標主機 20-100 端口的開放狀態。
nc -zv 192.168.1.100 20-100 2>&1 | grep succeeded
輸出示例:
Connection to 192.168.1.100 22 port [tcp/ssh] succeeded! Connection to 192.168.1.100 80 port [tcp/http] succeeded!
案例 7:網絡服務存活監控
場景:定時檢測 Nginx 服務端口是否存活。 腳本:
#!/bin/bash if ! nc -z -w 3 localhost 80; thenecho "Nginx 服務異常!" | mail -s "服務告警" admin@example.comsystemctl restart nginx fi
定時任務(每 5 分鐘執行):
crontab -e */5 * * * * /path/to/script.sh
五、高級技巧
1. 結合 tar
實時壓縮傳輸
發送端:
tar czf - /data | nc -l -p 8080
接收端:
nc 192.168.1.100 8080 | tar xzf - -C /backup
2. 加密通信(使用 openssl
增強安全性)
服務端:
openssl s_server -quiet -cert server.pem -port 8080
客戶端:
nc -c openssl s_client -quiet -connect 192.168.1.100:8080
3. 模擬 HTTP 請求
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80
六、注意事項
-
安全風險:
-
nc
不加密數據,敏感數據傳輸應使用scp
、rsync
或openssl
。 -
避免在生產環境使用
-e
參數執行反向 Shell。
-
-
防火墻限制:
-
確保目標端口在防火墻中放行(TCP/UDP)。
-
-
性能局限:
-
大文件傳輸時效率低于專用工具(如
rsync
)。
-
通過靈活運用 nc
,運維工程師可快速完成網絡調試、數據傳輸和臨時服務部署,但需嚴格遵循安全規范。
eth-tool命令
一、命令概述
ethtool
是 Linux 下用于 查看和配置網絡接口(網卡)參數 的核心工具,支持查詢驅動信息、調整速度和雙工模式、診斷丟包問題等,是網絡性能調優和故障排查的必備工具。
二、核心選項與參數
選項 | 說明 |
---|---|
-i <接口> | 顯示網卡驅動信息(驅動版本、固件版本等) |
-k <接口> | 查看網卡 Offload 功能狀態(如 TCP 分段、校驗和計算) |
-S <接口> | 顯示統計信息(收發包計數、錯誤計數等) |
-a <接口> | 查看自動協商(Auto-negotiation)和流控(Flow Control)狀態 |
-s <接口> | 修改網卡參數(速度、雙工模式等) |
--show-ring <接口> | 顯示環形緩沖區(Ring Buffer)大小 |
--set-ring <接口> | 調整環形緩沖區大小(影響吞吐量和延遲) |
--identify <接口> | 讓網卡物理指示燈閃爍(用于定位物理設備) |
--reset <接口> | 重置網卡硬件和驅動狀態 |
三、工作案例場景
案例 1:檢查網卡基本狀態
場景:驗證網卡 eth0
的連接狀態和驅動信息。
ethtool eth0
輸出示例:
Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Speed: 1000Mb/s Duplex: Full Auto-negotiation: on Port: Twisted Pair PHYAD: 1 Transceiver: internal Link detected: yes
關鍵信息:
-
Speed/Duplex:當前速率和雙工模式(若顯示
Half
或非預期值,可能需手動配置)。 -
Link detected:物理連接是否正常。
案例 2:修改網卡速率和雙工模式
場景:強制 eth0
以 100 Mbps 全雙工模式運行(禁用自動協商)。
sudo ethtool -s eth0 speed 100 duplex full autoneg off
驗證配置:
ethtool eth0 | grep -E "Speed|Duplex|Auto-negotiation"
輸出示例:
Speed: 100Mb/s Duplex: Full Auto-negotiation: off
案例 3:診斷丟包或高延遲問題
場景:檢查 eth0
的統計信息和環形緩沖區設置。
# 查看統計信息(錯誤包、丟包計數) ethtool -S eth0 # 查看環形緩沖區大小 ethtool --show-ring eth0 # 調整環形緩沖區(增大 RX/TX 緩沖區減少丟包) sudo ethtool --set-ring eth0 rx 4096 tx 4096
關鍵字段:
-
rx_dropped
/tx_dropped
:接收/發送丟包計數。 -
rx_missed_errors
:因緩沖區不足導致的丟包。
案例 4:排查 Offload 功能導致的性能問題
場景:禁用 TCP 分段 Offload(TSO)以解決虛擬機網絡性能問題。
# 查看當前 Offload 狀態 ethtool -k eth0 # 關閉 TSO sudo ethtool -K eth0 tso off # 持久化配置(寫入啟動腳本) echo "ethtool -K eth0 tso off" >> /etc/rc.local
輸出示例:
Offload parameters for eth0: tcp-segmentation-offload: off udp-fragmentation-offload: off generic-segmentation-offload: on
案例 5:定位物理網卡設備
場景:在服務器機架中通過指示燈閃爍確認 eth0
對應的物理端口。
sudo ethtool -p eth0 10 # 閃爍 10 秒
操作后:觀察服務器網卡指示燈是否按設定頻率閃爍。
四、高級技巧
1. 自動化網卡健康檢查(腳本)
#!/bin/bash INTERFACE="eth0" SPEED=$(ethtool $INTERFACE | grep Speed | awk '{print $2}') DUPLEX=$(ethtool $INTERFACE | grep Duplex | awk '{print $2}') LINK=$(ethtool $INTERFACE | grep "Link detected" | awk '{print $3}') if [ "$LINK" != "yes" ]; then echo "ERROR: $INTERFACE link down!" elif [ "$SPEED" != "1000Mb/s" ]; then echo "WARNING: $INTERFACE speed is $SPEED (expected 1Gbps)" fi
2. 持久化配置(避免重啟失效)
# 編輯 NetworkManager 配置(如使用 NetworkManager) vim /etc/NetworkManager/dispatcher.d/99-ethtool # 內容示例: #!/bin/bash if [ "$1" == "eth0" ] && [ "$2" == "up" ]; then ethtool -s eth0 speed 1000 duplex full autoneg on fi # 添加執行權限 chmod +x /etc/NetworkManager/dispatcher.d/99-ethtool
五、注意事項
-
權限要求:修改網卡參數需
root
權限(使用sudo
)。 -
硬件兼容性:部分設置依賴網卡驅動支持(如調整環形緩沖區大小)。
-
自動協商沖突:手動設置速率/雙工模式時需關閉自動協商(
autoneg off
)。 -
生產環境慎用:修改關鍵參數前需在測試環境驗證,避免網絡中斷。
六、總結
通過 ethtool
,運維工程師可以:
-
快速診斷物理層問題(連接狀態、速率/雙工模式)。
-
優化網絡性能(調整 Offload 功能、環形緩沖區)。
-
定位硬件設備(通過指示燈閃爍)。
-
持久化配置(確保重啟后參數生效)。
核心口訣:
速率雙工查 ethtool, Offload 功能用 -K 調, 統計信息 -S 看, 物理定位 --identify。
tcpdump命令
一、命令概述
tcpdump
是 Linux 系統下的 網絡抓包分析工具,通過捕獲網絡接口的數據包,幫助運維工程師診斷網絡連接問題、分析協議交互、定位異常流量等。它支持靈活的 BPF(Berkeley Packet Filter)過濾語法,可精準抓取目標流量。
二、安裝與基本語法
# 安裝(大多數系統已預裝) apt-get install tcpdump # Debian/Ubuntu yum install tcpdump # RHEL/CentOS# 基本語法 tcpdump [選項] [過濾表達式]
三、核心選項與參數
選項 | 說明 |
---|---|
-i <接口> | 指定網卡(如 eth0 ,默認抓取第一個非 loopback 接口) |
-n | 禁用域名解析(顯示 IP 和端口號) |
-nn | 禁用端口號解析(如顯示 80 而非 http ) |
-s <長度> | 設置抓包長度(如 -s 0 抓取完整數據包) |
-w <文件> | 保存抓包數據到文件(.pcap 格式) |
-r <文件> | 讀取保存的抓包文件 |
-c <數量> | 限制抓包數量(如 -c 100 ) |
-v | 顯示詳細輸出(-vv 或 -vvv 更詳細) |
-A | 以 ASCII 格式顯示數據包內容(適合 HTTP 分析) |
-X | 同時以 HEX 和 ASCII 顯示數據內容 |
-e | 顯示數據鏈路層信息(如 MAC 地址) |
四、過濾表達式語法
BPF 過濾器支持按協議、IP、端口、標志位等組合過濾:
-
協議:
tcp
、udp
、icmp
、arp
-
IP 地址:
host 192.168.1.100
、src 10.0.0.1
、dst 172.16.0.2
-
端口:
port 80
、src port 22
、dst port 53
-
邏輯組合:
and
、or
、not
-
標志位:
tcp[tcpflags] & (tcp-syn|tcp-ack) != 0
五、工作案例場景
案例 1:抓取 HTTP 請求內容
場景:分析 Web 服務的請求響應數據。
tcpdump -i eth0 -nn -s 0 -A tcp port 80 and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
選項解析:
-
tcp port 80
:抓取 TCP 80 端口的流量 -
'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
:匹配 TCP 負載中以GET
開頭的請求(HEX 值47455420
對應 "GET ") 輸出示例:
GET /api/v1/data HTTP/1.1 Host: example.com User-Agent: curl/7.68.0
案例 2:檢測 ICMP 不可達錯誤
場景:排查網絡連通性問題(如防火墻攔截)。
tcpdump -ni eth0 icmp and icmp[0] == 3
選項解析:
-
icmp[0] == 3
:匹配 ICMP 類型為 3(Destination Unreachable) 輸出示例:
IP 192.168.1.100 > 10.0.0.1: ICMP 10.0.0.1 udp port 1234 unreachable
案例 3:分析 DNS 查詢請求
場景:驗證 DNS 解析是否正常。
tcpdump -ni eth0 -nn udp port 53
輸出示例:
11:22:33.445 IP 192.168.1.100.45232 > 8.8.8.8.53: 12345+ A? example.com. (28) 11:22:33.447 IP 8.8.8.8.53 > 192.168.1.100.45232: 12345 1/0/0 A 93.184.216.34 (44)
案例 4:捕獲 TCP 三次握手與揮手
場景:驗證 TCP 連接建立是否正常。
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
輸出示例:
# 三次握手 SYN 11:25:01.001 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [S], seq 123456789 11:25:01.002 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [S.], seq 987654321, ack 123456790 11:25:01.003 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654322 # 四次揮手 FIN 11:30:01.004 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [F.], seq 123456800 11:30:01.005 IP 10.0.0.1.80 > 192.168.1.100.54321: Flags [F.], seq 987654400 11:30:01.006 IP 192.168.1.100.54321 > 10.0.0.1.80: Flags [.], ack 987654401
案例 5:抓取異常流量(如端口掃描)
場景:檢測網絡中的 SYN 洪水攻擊或端口掃描。
tcpdump -ni eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack = 0'
輸出分析:
-
大量來自同一 IP 的 SYN 包且無后續 ACK,可能為 SYN 洪水攻擊。
案例 6:保存抓包數據并離線分析
步驟:
-
抓包保存:
tcpdump -ni eth0 -w traffic.pcap tcp port 443
-
使用 Wireshark 分析:
wireshark traffic.pcap
-
命令行解析:
tcpdump -r traffic.pcap -nn 'src 192.168.1.100'
六、高級技巧
-
統計 TCP 重傳率:
tcpdump -ni eth0 -c 1000 'tcp[tcpflags] & tcp-ack != 0' | grep 'retransmission' | wc -l
-
提取 HTTP 請求的 Host 頭:
tcpdump -ni eth0 -s 0 -A tcp port 80 | grep -oE 'Host: .*'
-
實時監控 SSH 登錄嘗試:
tcpdump -ni eth0 'tcp port 22 and (tcp[20:4] = 0x5353482D)' # 匹配 SSH 協議標識 "SSH-"
七、注意事項
-
權限要求:抓包需要
root
權限(建議使用sudo
)。 -
性能影響:高速網絡環境下,限制抓包數量(
-c
)或長度(-s
)避免資源耗盡。 -
敏感信息:HTTP 明文傳輸的密碼、Cookie 可能被捕獲,需結合加密協議(HTTPS)使用。
通過 tcpdump
,運維工程師可精準定位網絡丟包、服務無響應、協議交互異常等問題,是網絡故障排查的必備工具。結合 Wireshark
圖形化分析,可進一步提升效率。
tshark(wireshark命令行)
一、命令概述
tshark
是 Wireshark 的命令行版本,提供 網絡協議深度解析、流量統計 和 離線分析 能力。相比 tcpdump
,它支持更友好的顯示過濾語法(類似 Wireshark)和豐富的協議解碼功能,適合復雜網絡問題排查和自動化分析。
二、安裝與基本語法
# 安裝(Wireshark 套件的一部分) apt-get install tshark # Debian/Ubuntu yum install wireshark # RHEL/CentOS# 基本語法 tshark [選項] [捕獲過濾] [顯示過濾]
三、核心選項與參數
選項 | 說明 |
---|---|
-i <接口> | 指定抓包網卡(如 eth0 ) |
-f "捕獲過濾" | 設置 BPF 捕獲過濾器(類似 tcpdump) |
-Y "顯示過濾" | 設置 Wireshark 顯示過濾器(更強大的過濾能力) |
-r <文件> | 讀取離線抓包文件(.pcap 或 .pcapng ) |
-w <文件> | 保存抓包數據到文件 |
-n | 禁用域名解析(顯示原始 IP/端口) |
-T fields -e <字段> | 提取指定協議字段(如 -e http.host ) |
-z <統計模塊> | 生成流量統計報告(如 io,conv,endpoints ) |
-q | 靜默模式(僅輸出統計結果) |
-a <自動停止條件> | 設置自動停止捕獲(如 duration:60 抓包 60 秒) |
四、過濾語法
-
捕獲過濾(BPF 語法):
tshark -i eth0 -f "tcp port 80 and host 192.168.1.100"
-
顯示過濾(Wireshark 語法):
tshark -r traffic.pcap -Y "http.request.method == GET && ip.src == 10.0.0.1"
五、工作案例場景
案例 1:實時抓取并分析 HTTP 請求
場景:統計訪問量最高的 HTTP 域名
tshark -i eth0 -Y "http.host" -T fields -e http.host | \ sort | uniq -c | sort -nr | head -n 10
輸出示例:
1200 www.example.com800 api.example.com500 cdn.example.org
案例 2:離線分析 TCP 重傳問題
場景:從抓包文件中分析 TCP 重傳率
tshark -r traffic.pcap -Y "tcp.analysis.retransmission" -q -z io,phs
輸出解析:
Protocol Hierarchy Statistics tcp frames:1000 bytes:1000000|--http frames:800 bytes:800000|--tcp.analysis.retransmission frames:50 bytes:50000 # 重傳率 5%
案例 3:提取 DNS 查詢記錄
場景:從抓包文件中提取所有 DNS 查詢的域名
tshark -r dns.pcap -Y "dns.flags.response == 0" -T fields -e dns.qry.name
輸出示例:
www.google.com api.github.com cdn.amazonaws.com
案例 4:生成流量會話統計
場景:分析抓包文件中的流量 TopN 會話
tshark -r traffic.pcap -q -z conv,tcp
輸出示例:
TCP Conversations Filter:<No Filter> | <- | -> | Total | | Frames Bytes | Frames Bytes | Frames Bytes | | 100 50000 | 80 40000 | 180 90000 | 192.168.1.100:5000 <-> 10.0.0.1:80
案例 5:提取 HTTP 請求的 User-Agent
場景:分析爬蟲或異常客戶端
tshark -r http.pcap -Y "http.user_agent" -T fields -e http.user_agent | \ sort | uniq -c | sort -nr
輸出示例:
300 Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.050 python-requests/2.31.05 curl/7.88.1
案例 6:檢測 SSH 暴力破解行為
場景:分析 SSH 登錄嘗試頻率
tshark -i eth0 -Y "tcp.port == 22 && ssh.protocol == 2" -c 1000 -q -z io,phs
關鍵指標:
-
大量
ssh.protocol
數據包來自同一 IP → 可能為暴力破解攻擊。
六、高級技巧
1. 生成 I/O 圖表(流量趨勢)
tshark -r traffic.pcap -q -z io,stat,60,"SUM(frame.len)frame.len" > traffic_report.txt
輸出解析:
Time | SUM(frame.len) 2024-01-01 10:00:00 | 1000000 2024-01-01 10:01:00 | 1200000
2. 提取 HTTPS SNI(加密前握手信息)
tshark -r https.pcap -Y "tls.handshake.extensions_server_name" -T fields -e tls.handshake.extensions_server_name
3. 自動化協議分析腳本
#!/bin/bash tshark -r $1 -Y "dns" -T json | jq '[.[] | {time: ._source.layers.frame[0], query: ._source.layers.dns[0].dns.qry_name}]' > dns_report.json
七、注意事項
-
權限要求:抓包需要
root
權限(使用sudo
)。 -
性能優化:
-
使用
-c
或-a
限制抓包規模,避免內存溢出。 -
優先使用顯示過濾(
-Y
)替代捕獲過濾(-f
)減少內存占用。
-
-
敏感數據處理:
-
避免在日志中明文存儲敏感信息(如 Cookie、密碼)。
-
使用
-P
或--disable-protocol
禁用特定協議解析。
-
通過 tshark
,運維工程師可以快速實現協議級流量分析、異常行為檢測和自動化報告生成,尤其在處理加密協議(如 TLS/SSL)和復雜網絡交互時,其深度解析能力遠超傳統工具。
三、磁盤與文件管理
df/du命令
一、命令概述
-
df
(Disk Free):顯示文件系統的磁盤空間使用情況,快速定位分區空間不足問題。 -
du
(Disk Usage):統計文件或目錄的磁盤使用量,精準定位大文件/目錄。
二、df
命令詳解
1. 核心選項
df [選項] [文件或目錄]
選項 | 說明 |
---|---|
-h | 人類可讀格式(自動轉換單位,如 GB/MB) |
-i | 顯示 inode 使用情況(文件數量限制) |
-T | 顯示文件系統類型(如 ext4/xfs) |
-x <類型> | 排除指定文件系統類型(如 -x tmpfs ) |
--total | 顯示總使用量匯總 |
2. 輸出字段解析
Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 30G 20G 60% /
-
Use%:使用率 ≥80% 需告警
-
Avail:剩余可用空間
3. 工作案例
案例 1:快速檢查磁盤空間
df -hT
輸出示例:
Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 50G 40G 10G 80% / tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
分析:根分區 /
使用率 80%,需關注。
案例 2:排查 inode 耗盡問題
df -i /data
輸出示例:
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb1 1.2M 1.1M 100K 92% /data
結論:inode 使用率 92%,可能因小文件過多導致,需清理或擴容。
三、du
命令詳解
1. 核心選項
du [選項] [文件或目錄]
選項 | 說明 |
---|---|
-h | 人類可讀格式 |
-s | 顯示總用量(不遞歸子目錄) |
--max-depth=N | 限制目錄深度(如 --max-depth=1 ) |
--exclude="模式" | 排除匹配的文件/目錄 |
-a | 顯示所有文件(包括隱藏文件) |
-c | 顯示總計(結合 -s 使用) |
2. 工作案例
案例 1:定位根目錄下最大子目錄
du -h --max-depth=1 / | sort -hr
輸出示例:
50G /var 30G /home 10G /usr
案例 2:統計日志目錄占用空間
du -sh /var/log
輸出示例:
12G /var/log
案例 3:查找超過 1GB 的文件
du -ah / | grep -E '[0-9]+G' | sort -hr
輸出示例:
5.0G /var/log/app/error.log 3.5G /home/user/backup.tar
四、綜合運維場景
場景 1:自動化磁盤空間監控腳本
#!/bin/bash THRESHOLD=80 OUTPUT=$(df -h | awk '0+$5 >= '$THRESHOLD' {print $6 ": " $5}') if [ -n "$OUTPUT" ]; thenecho "警告:以下分區使用率超過 ${THRESHOLD}%"echo "$OUTPUT" | mail -s "磁盤空間告警" admin@example.com fi
定時任務(每日檢查):
crontab -e 0 9 * * * /path/to/script.sh
場景 2:清理過期日志文件
# 查找 30 天前的日志文件并刪除 find /var/log -name "*.log" -type f -mtime +30 -exec du -sh {} \; find /var/log -name "*.log" -type f -mtime +30 -exec rm -fv {} \;
場景 3:解決 du
與 df
結果不一致問題
原因:文件被刪除但仍有進程占用(空間未釋放)。 排查方法:
lsof +L1 /data # 查看 /data 分區中已刪除但未釋放的文件
解決方案:重啟相關進程或清空文件句柄。
五、高級技巧
-
快速統計目錄大小并排序:
du -h --max-depth=1 /data/* | sort -hr
-
排除特定目錄分析:
du -sh --exclude="*.cache" /home
-
監控指定目錄增長趨勢:
watch -n 60 'du -sh /var/log'
六、注意事項
-
謹慎刪除文件:
du
找到大文件后,確認無用再刪除。 -
inode 限制:云盤或對象存儲掛載時可能限制 inode 數量。
-
NFS 延遲:遠程文件系統的
du
統計可能有緩存延遲。
ncdu命令
一、命令概述
ncdu
(NCurses Disk Usage)是一款基于 交互式文本界面 的磁盤空間分析工具,相比傳統 du
命令,它提供 可視化導航、快速掃描 和 動態排序 功能,特別適合快速定位大文件或目錄,是運維工程師清理磁盤空間的利器。
二、安裝方法
# Debian/Ubuntu apt-get install ncdu# RHEL/CentOS(需啟用 EPEL) yum install epel-release && yum install ncdu# macOS brew install ncdu
三、核心功能與優勢
-
交互式界面:支持鍵盤導航(方向鍵、快捷鍵)。
-
快速掃描:比
du
更快生成目錄樹。 -
動態排序:按大小、名稱、修改時間排序。
-
批量操作:刪除、導出掃描結果。
-
排除文件/目錄:支持正則表達式過濾。
四、基本語法與常用選項
ncdu [選項] [目錄路徑]
選項 | 說明 |
---|---|
-x | 僅分析同一文件系統(不跨掛載點) |
--exclude "PATTERN" | 排除匹配文件/目錄(如 --exclude "*.log" ) |
-o 文件 | 導出掃描結果到文件(便于后續分析) |
-f 文件 | 從文件加載掃描結果(結合 -o 實現離線分析) |
--exclude-firnore | 忽略 .gitignore 或 .ncduignore 中的文件 |
-q | 靜默模式(不顯示進度條) |
五、交互界面操作指南
快捷鍵 | 功能 |
---|---|
↑ /↓ | 導航目錄條目 |
→ /Enter | 進入子目錄 |
← | 返回上級目錄 |
d | 刪除當前文件/目錄 |
n | 按名稱排序 |
s | 按大小排序 |
t | 按修改時間排序 |
g | 切換百分比/絕對值顯示 |
? | 查看幫助菜單 |
六、工作案例場景
案例 1:快速分析根目錄磁盤占用
場景:根分區 /
使用率超過 90%,需快速定位大文件。
ncdu -x /
操作流程:
-
使用
↓
鍵定位到占用最大的目錄(如/var
)。 -
按
→
進入/var
,發現log
目錄占 80%。 -
進入
/var/log
,按s
排序,找到app_error.log
(10GB)。 -
按
d
刪除日志文件(需確認權限)。
案例 2:排除臨時文件掃描
場景:分析 /data
目錄,但排除 .cache
和臨時文件。
ncdu --exclude ".cache" --exclude "*.tmp" /data
案例 3:離線分析與報告生成
場景:掃描生產服務器磁盤,導出結果供團隊分析。
# 在服務器上生成掃描文件 ncdu -xo /tmp/ncdu-scan.log /opt# 下載文件到本地分析 ncdu -f ncdu-scan.log
離線操作:
-
按
s
排序后,發現backup_old.tar
(50GB)可清理。
案例 4:批量清理舊日志文件
場景:清理 /var/log
中 30 天前的日志。
ncdu /var/log
操作流程:
-
進入
/var/log
按t
按時間排序。 -
定位到 30 天前的日志目錄(如
nginx/access.log.2023
)。 -
按
d
刪除整個目錄(需確認無在用日志)。
案例 5:遠程服務器磁盤分析
場景:通過 SSH 分析遠程服務器的磁盤使用。
ssh user@remote-server "ncdu -o - /" | ncdu -f -
原理:
-
遠程生成掃描結果并通過管道傳輸到本地
ncdu
加載。
七、高級技巧
1. 自動化清理腳本
# 查找大于 1GB 的文件并交互式確認刪除 ncdu -r / | grep -E '^[0-9\.]+G' | awk '{print $2}' | xargs -I {} sh -c 'read -p "Delete {}? (y/n) " ans; [ "$ans" = "y" ] && rm -rf "{}"'
2. 定期掃描與對比
# 每周掃描并保存結果 ncdu -xo /var/ncdu-scan-$(date +%Y%m%d).log /# 對比兩次掃描差異 diff <(cat scan1.log | awk '{print $2}') <(cat scan2.log | awk '{print $2}')
八、注意事項
-
謹慎刪除:
d
鍵直接刪除文件,需確認路徑無誤。 -
權限要求:分析系統目錄需
root
權限(sudo ncdu
)。 -
隱藏文件:默認顯示隱藏文件(以
.
開頭的文件)。
通過 ncdu
,運維工程師可快速定位磁盤空間瓶頸,結合交互式操作和過濾規則,大幅提升清理效率,尤其適合處理日志膨脹、臨時文件堆積等常見問題。
find命令
一、命令概述
find
是 Linux 系統中最強大的文件搜索工具,支持按 名稱、類型、時間、大小、權限 等多維度條件查找文件,并支持對搜索結果執行操作(刪除、修改權限、復制等)。它是運維工程師進行文件管理、日志清理、權限審計的核心工具。
二、基本語法
find [搜索路徑] [匹配條件] [執行動作]
三、核心選項與參數
1. 按名稱/路徑匹配
參數 | 說明 |
---|---|
-name "模式" | 按文件名匹配(區分大小寫,支持 * ? 通配符) |
-iname "模式" | 按文件名匹配(不區分大小寫) |
-path "模式" | 按路徑匹配(支持通配符) |
-regex "正則" | 按正則表達式匹配完整路徑 |
示例:
find /var/log -name "*.log" # 查找 /var/log 下所有 .log 文件 find /etc -iname "*.conf" # 查找 /etc 下所有 .conf(不區分大小寫) find . -regex ".*/error_[0-9]+.log" # 匹配 error_數字.log 文件
2. 按類型匹配
參數 | 說明 |
---|---|
-type [f/d/l/s] | 按文件類型篩選(f-文件,d-目錄,l-符號鏈接,s-套接字) |
示例:
find /tmp -type f # 查找 /tmp 下的普通文件 find /home -type d -empty # 查找 /home 下的空目錄
3. 按時間匹配
參數 | 說明 |
---|---|
-mtime [+-]n | 按文件修改時間篩選(n 天前,+7 表示超過7天) |
-atime [+-]n | 按文件訪問時間篩選 |
-newermt "日期" | 查找比指定日期更新的文件(如 "2023-10-01" ) |
示例:
find /var/log -mtime +30 # 查找 30 天前修改過的文件 find /backup -newermt "2023-09-01" # 查找 2023-09-01 之后修改的文件
4. 按大小匹配
參數 | 說明 |
---|---|
-size [+-]n[c/k/M/G] | 按文件大小篩選(默認512B塊,+10M 表示大于10MB) |
示例:
find /data -size +500M # 查找大于 500MB 的文件 find /home -size -1k # 查找小于 1KB 的文件
5. 按權限/用戶匹配
參數 | 說明 |
---|---|
-perm [mode] | 按權限匹配(如 644 或 -u+x 表示用戶可執行) |
-user [name] | 按所有者匹配 |
-group [name] | 按所屬組匹配 |
示例:
find / -user www-data # 查找所有者為 www-data 的文件 find . -perm 777 # 查找權限為 777 的文件 find /etc -perm -u=r # 查找用戶可讀的文件
6. 執行動作
參數 | 說明 |
---|---|
-print | 默認動作,打印完整路徑 |
-delete | 刪除匹配的文件 |
-exec command {} \; | 對每個文件執行命令({} 代表文件名) |
-ok command {} \; | 交互式執行命令(需確認) |
示例:
find /tmp -name "*.tmp" -delete # 刪除所有 .tmp 文件 find /var/log -mtime +30 -exec gzip {} \; # 壓縮 30 天前的日志 find . -type f -perm 777 -ok chmod 755 {} \; # 交互式修改權限
四、工作案例場景
案例 1:清理過期日志文件
# 刪除 /var/log 下 30 天前的 .log 文件 find /var/log -name "*.log" -mtime +30 -exec rm -fv {} \;
案例 2:查找并備份大文件
# 查找 /data 下大于 1GB 的文件并復制到備份目錄 find /data -type f -size +1G -exec cp {} /backup \;
案例 3:審計異常權限文件
# 查找所有權限為 777 的文件并記錄路徑 find / -type f -perm 777 -print > /audit/777_files.txt
案例 4:批量修改文件所有者
# 將 /home/user 下所有文件所有者改為 newuser find /home/user -exec chown newuser:newgroup {} \+
案例 5:統計源碼文件數量
# 統計當前目錄下 .c 和 .h 文件數量 find . -type f \( -name "*.c" -o -name "*.h" \) | wc -l
五、高級技巧
1. 邏輯組合
# 查找 .log 文件且 (大于 100MB 或 修改時間超過 60 天) find /var -name "*.log" \( -size +100M -o -mtime +60 \)
2. 排除目錄
# 查找 / 下所有 .conf 文件,排除 /proc 和 /sys find / -path /proc -prune -o -path /sys -prune -o -name "*.conf"
3. 結合 xargs 提高效率
# 查找所有空文件并刪除(比 -exec 更高效) find /tmp -type f -empty | xargs rm -f
4. 并行處理
# 使用 parallel 并行壓縮文件 find /data -type f -name "*.csv" | parallel gzip {}
六、注意事項
-
權限與路徑:
-
系統目錄搜索需
root
權限(使用sudo
)。 -
避免全盤搜索(如
find /
),盡量指定具體路徑。
-
-
符號鏈接處理:
-
默認不跟蹤符號鏈接,需用
-L
選項啟用。
-
-
性能優化:
-
優先使用
-name
縮小范圍,減少不必要的全盤掃描。 -
復雜條件組合時,將高篩選率條件放在前面。
-
-
刪除操作風險:
-
使用
-ok
替代-exec
進行確認,或先通過-print
檢查結果。
-
通過 find
,運維工程師可以快速定位問題文件、實現批量操作,并構建自動化清理/審計腳本,是日常運維工作中不可或缺的利器。
rsync命令
一、命令概述
rsync
(Remote Synchronization)是 Linux 下 高效的文件同步工具,支持 增量傳輸、斷點續傳 和 跨平臺同步。其核心優勢是通過差異算法僅傳輸變化部分,大幅節省帶寬和時間,廣泛用于備份、部署、數據遷移等場景。
二、安裝與基本語法
# 安裝 apt-get install rsync # Debian/Ubuntu yum install rsync # RHEL/CentOS# 基本語法 rsync [選項] 源路徑 目標路徑
三、核心選項與參數
選項 | 說明 |
---|---|
-a | 歸檔模式(保留權限、時間戳、遞歸同步目錄) |
-v | 顯示詳細輸出(-vv 更詳細) |
-z | 壓縮傳輸數據(節省帶寬) |
--delete | 刪除目標端多余文件(嚴格同步) |
--exclude="模式" | 排除指定文件/目錄(支持通配符) |
-e "ssh" | 指定遠程 Shell(如 ssh -p 2222 指定端口) |
-P | 顯示進度并支持斷點續傳(等效 --partial --progress ) |
-n | 模擬執行(不實際傳輸,用于測試) |
-b | 備份覆蓋文件(生成后綴 ~ ) |
--bwlimit=KBPS | 限制傳輸帶寬(如 --bwlimit=1000 限速 1000KB/s) |
四、工作案例場景
案例 1:本地目錄同步
場景:將 /data/app
同步到備份目錄 /backup
,保留權限并刪除多余文件。
rsync -av --delete /data/app/ /backup/
關鍵點:
-
源路徑末尾的
/
表示同步目錄內容(不含目錄本身)。 -
--delete
確保目標與源完全一致。
案例 2:遠程服務器同步(SSH 加密)
場景:將本地 /var/www
同步到遠程服務器的 /opt/web
目錄,使用非標準 SSH 端口。
rsync -avz -e "ssh -p 2222" /var/www/ user@remote-host:/opt/web/
驗證命令:
ssh -p 2222 user@remote-host ls /opt/web # 檢查同步結果
案例 3:增量備份與排除文件
場景:每日備份 /home
目錄到 /backup/daily
,排除緩存文件和日志。
rsync -avz --exclude=".cache/" --exclude="*.log" /home/ /backup/daily/
自動化腳本(每日凌晨執行):
crontab -e 0 3 * * * /usr/bin/rsync -avz --exclude=".cache/" /home/ /backup/daily/
案例 4:恢復誤刪文件(反向同步)
場景:從備份服務器恢復誤刪的 /etc/nginx
配置。
rsync -avz user@backup-host:/etc/nginx/ /etc/nginx/
案例 5:大規模數據遷移(斷點續傳)
場景:遷移 1TB 數據到新存儲服務器,網絡不穩定需支持斷點續傳。
rsync -avzP --bwlimit=50000 /bigdata/ user@new-host:/storage/
說明:
-
-P
顯示進度,中斷后可重新執行命令繼續傳輸。 -
--bwlimit=50000
限速 50MB/s 避免擠占帶寬。
案例 6:差異化備份(保留歷史版本)
場景:每周全量備份,每日增量備份,保留 7 天歷史。
# 全量備份(每周日) rsync -av --delete /data/ /backup/full-$(date +%Y%m%d)/# 增量備份(其他日期) rsync -av --delete --link-dest=/backup/full-20231001 /data/ /backup/incr-$(date +%Y%m%d)/
原理:
-
--link-dest
引用全量備份的硬鏈接,僅存儲變化文件。
五、高級技巧
1. 帶寬限制與壓縮優化
rsync -avz --bwlimit=1000 -e "ssh -C" /src/ user@host:/dst/
-
-C
啟用 SSH 壓縮,與-z
疊加優化傳輸效率。
2. 保護覆蓋文件(備份后綴)
rsync -avb --backup-dir=/backup/old --suffix=.bak /src/ /dst/
-
被覆蓋的文件會移動到
/backup/old
并添加.bak
后綴。
3. 過濾規則文件
rsync -av --exclude-from='exclude-list.txt' /src/ /dst/
exclude-list.txt 內容:
*.tmp .cache/ logs/
六、注意事項
-
權限問題:
-
同步系統文件需
sudo
權限(rsync -av -e "ssh" --rsync-path="sudo rsync"
)。
-
-
路徑陷阱:
-
源路徑帶
/
同步內容,不帶/
同步目錄本身。
-
-
測試先行:
-
使用
-n
模擬執行(如rsync -avn
)。
-
-
日志記錄:
-
重定向輸出到文件(
rsync -av > sync.log 2>&1
)。
-
通過 rsync
,運維工程師可實現高效、可靠的數據同步,尤其適合自動化備份、跨數據中心遷移和持續部署場景。其靈活的過濾和增量機制,結合 SSH 加密,成為企業級數據管理的核心工具。
fio命令
一、命令概述
fio
(Flexible I/O Tester)是 Linux 下 專業級磁盤性能測試工具,可模擬多種 I/O 負載(順序/隨機讀寫、混合負載),用于評估存儲設備的 IOPS、帶寬、延遲 等關鍵指標。適用于運維工程師進行存儲性能調優、磁盤故障排查及硬件選型驗證。
二、安裝與基本語法
# 安裝 apt-get install fio # Debian/Ubuntu yum install fio # RHEL/CentOS# 基本語法 fio [選項] <任務配置文件>
三、核心參數與配置
1. 全局參數
參數 | 說明 |
---|---|
--name=<任務名> | 定義任務名稱 |
--filename=<路徑> | 測試文件路徑(如 /dev/sdb 或 /data/testfile ) |
--direct=1 | 繞過緩存(直接 I/O,避免內存干擾) |
--ioengine=<引擎> | I/O 引擎(libaio 異步,sync 同步,psync 等) |
--runtime=<秒> | 測試持續時間(默認無限) |
--time_based | 按時間而非數據量運行測試 |
--size=<大小> | 每個線程操作的數據總量(如 10G ) |
--group_reporting | 匯總所有線程的統計結果 |
2. I/O 模式參數
參數 | 說明 |
---|---|
--rw=<模式> | 讀寫模式(read /write /randread /randwrite /rw /randrw ) |
--bs=<塊大小> | 單次 I/O 塊大小(如 4k 、1M ) |
--iodepth=<隊列深度> | I/O 隊列深度(模擬并發請求數) |
--numjobs=<線程數> | 并發線程數(模擬多客戶端負載) |
--rwmixread=<百分比> | 混合讀寫中讀操作的占比(如 70 表示 70% 讀) |
3. 輸出參數
參數 | 說明 |
---|---|
--output=<文件> | 將結果保存到文件 |
--output-format=<格式> | 輸出格式(normal /json /terse ) |
四、工作案例場景
案例 1:測試 SSD 的隨機讀性能(4K 塊,隊列深度 32)
場景:評估 SSD 在數據庫場景下的隨機讀 IOPS。
fio --name=ssd_randread \--filename=/dev/nvme0n1 \--ioengine=libaio \--direct=1 \--rw=randread \--bs=4k \--iodepth=32 \--numjobs=4 \--runtime=60 \--group_reporting
輸出關鍵指標:
read: IOPS=98k, BW=383MiB/s (402MB/s) lat (usec): min=40, max=2100, avg=130.25
案例 2:測試 HDD 的順序寫帶寬(1M 塊,單線程)
場景:驗證機械硬盤在大文件寫入場景的吞吐量。
fio --name=hdd_seqwrite \--filename=/data/testfile \--ioengine=sync \--direct=1 \--rw=write \--bs=1M \--size=10G \--runtime=120 \--group_reporting
輸出關鍵指標:
write: IOPS=180, BW=180MiB/s (189MB/s)
案例 3:模擬混合負載(70% 讀 + 30% 寫,4K 塊)
場景:測試存儲系統在虛擬化環境中的混合負載能力。
fio --name=mixed_4k \--filename=/dev/sdb \--ioengine=libaio \--direct=1 \--rw=randrw \--rwmixread=70 \--bs=4k \--iodepth=16 \--numjobs=8 \--runtime=300 \--group_reporting
輸出關鍵指標:
read: IOPS=12k, BW=48.8MiB/s write: IOPS=5.3k, BW=21.1MiB/s lat (usec): min=50, max=9500, avg=210.3
案例 4:驗證磁盤延遲(低隊列深度,1 線程)
場景:測試 NVMe 盤的響應延遲是否達標。
fio --name=latency_test \--filename=/dev/nvme0n1 \--ioengine=libaio \--direct=1 \--rw=randread \--bs=4k \--iodepth=1 \--numjobs=1 \--runtime=30 \--group_reporting
理想結果:平均延遲(lat
)應低于 200 微秒(usec)。
案例 5:多磁盤并行測試(多文件負載)
場景:評估 RAID 0 陣列在多線程下的性能擴展性。
fio --name=raid0_test \--filename=/dev/sda:/dev/sdb \--ioengine=libaio \--direct=1 \--rw=randwrite \--bs=64k \--iodepth=8 \--numjobs=16 \--runtime=180 \--group_reporting
預期效果:IOPS 和帶寬應接近單盤性能的 2 倍(RAID 0 理論值)。
五、結果分析與調優建議
1. 關鍵指標解讀
-
IOPS:每秒 I/O 操作數,反映隨機訪問性能。
-
Bandwidth (BW):吞吐量(MB/s),反映順序訪問性能。
-
Latency (lat):延遲(微秒或毫秒),衡量響應速度。
2. 性能瓶頸排查
-
IOPS 低:檢查隊列深度(
iodepth
)是否不足,或磁盤已達性能上限。 -
帶寬不達標:確認塊大小(
bs
)是否合理(如 HDD 適合大塊順序 I/O)。 -
延遲過高:降低隊列深度,檢查磁盤健康狀態(
smartctl
)或 RAID 卡緩存策略。
3. 調優方向
-
文件系統優化:調整
ext4/xfs
的掛載參數(如noatime
、discard
)。 -
內核參數:優化
vm.dirty_ratio
、vm.swappiness
、I/O 調度器(mq-deadline
/kyber
)。 -
硬件配置:升級磁盤類型(如 NVMe 替換 SATA SSD)、增加 RAID 冗余或緩存。
六、注意事項
-
數據安全:
-
測試裸設備(如
/dev/sdb
)會 覆蓋數據,務必提前備份。 -
使用文件路徑(如
/data/testfile
)時,確保有足夠空間。
-
-
緩存干擾:
-
必須添加
--direct=1
繞過系統緩存,否則測試結果反映的是內存速度。
-
-
生產環境慎用:
-
高并發測試可能導致服務中斷,建議在維護窗口期執行。
-
通過 fio
,運維工程師可以精準量化存儲性能,為容量規劃、故障排查及硬件升級提供數據支撐。結合不同參數組合,可模擬數據庫、虛擬化、大數據等真實場景負載,是存儲調優不可或缺的工具。
四、日志與文本處理
grep命令
一、命令概述
grep
(Global Regular Expression Print)是 Linux 下最核心的 文本搜索工具,支持正則表達式匹配,用于快速定位日志關鍵詞、過濾命令輸出、處理文本數據流。運維工程師幾乎每天都會用它排查問題、分析日志、構建自動化腳本。
二、核心選項與參數
grep [選項] "模式" [文件/目錄]
選項 | 說明 |
---|---|
-i | 忽略大小寫 |
-v | 反向匹配(排除匹配項) |
-E | 啟用擴展正則表達式(等效 egrep ) |
-r /-R | 遞歸搜索目錄 |
-n | 顯示匹配行號 |
-C NUM | 顯示匹配行的上下 NUM 行(如 -C 2 ) |
-A NUM | 顯示匹配行及后 NUM 行(After) |
-B NUM | 顯示匹配行及前 NUM 行(Before) |
-o | 僅顯示匹配的字符串(非整行) |
-c | 統計匹配行數 |
-l | 僅顯示包含匹配項的文件名 |
-w | 精確匹配單詞(避免部分匹配) |
--color=auto | 高亮顯示匹配內容 |
--exclude /--include | 按文件名模式排除/包含文件 |
-m NUM | 最多匹配 NUM 行后停止 |
-q | 靜默模式(不輸出,用于腳本條件判斷) |
三、正則表達式速查
表達式 | 說明 |
---|---|
^ | 匹配行首 |
$ | 匹配行尾 |
. | 匹配任意單個字符 |
* | 前導字符出現 0 次或多次 |
+ | 前導字符出現 1 次或多次(需 -E ) |
? | 前導字符出現 0 次或 1 次(需 -E ) |
[abc] | 匹配 a、b、c 中的任意一個 |
[^abc] | 匹配非 a、b、c 的任意字符 |
{n,m} | 前導字符出現 n 到 m 次(需 -E ) |
\b | 單詞邊界 |
\| | 邏輯或(需 -E ) |
四、工作案例場景
案例 1:快速定位日志中的錯誤
場景:在 Nginx 日志中查找 HTTP 500 錯誤
grep -n --color=auto ' 500 ' /var/log/nginx/access.log
輸出示例:
102:192.168.1.100 - - [10/Oct/2023:14:30:22 +0800] "GET /api/data HTTP/1.1" 500 1234 "-" "curl/7.68.0"
案例 2:遞歸搜索代碼庫中的關鍵詞
場景:在項目中查找所有使用 getUserInfo
函數的文件
grep -rnw --include="*.js" 'getUserInfo' /opt/myapp/
選項解析:
-
-r
遞歸搜索 -
-w
精確匹配單詞 -
--include="*.js"
僅檢查 JS 文件
案例 3:統計接口調用次數
場景:統計 /api/login
接口在日志中的調用次數
grep -c '/api/login' /var/log/api.log
輸出:
1429
案例 4:提取日志中的 IP 地址
場景:從日志中提取所有訪問過 /admin
頁面的 IP
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/access.log | sort | uniq
正則解析:
-
-E
啟用擴展正則 -
\b
匹配 IP 地址邊界
案例 5:監控服務狀態
場景:檢查 Nginx 是否正在運行
ps aux | grep -v grep | grep -q nginx && echo "Running" || echo "Not Running"
原理:
-
grep -v grep
排除grep
自身進程 -
-q
靜默模式,配合條件判斷
案例 6:多關鍵詞復雜匹配
場景:查找包含 ERROR
或 FATAL
的日志,且不包含 test.log
文件
grep -E --exclude="test.log" 'ERROR|FATAL' /var/log/*.log
五、高級技巧
1. 結合 find
高效遞歸搜索
find /var/log -type f -name "*.log" -exec grep -Hn 'error' {} \;
-
-H
顯示文件名(即使只有一個文件)
2. 高亮關鍵詞并分頁查看
grep --color=always 'ERROR' /var/log/syslog | less -R
3. 使用 zgrep
直接搜索壓縮文件
zgrep -i 'connection timeout' /var/log/nginx/access.log.1.gz
4. 上下文關聯分析
grep -C 3 'OutOfMemory' /var/log/app.log # 顯示錯誤前后 3 行
六、性能優化
-
避免大文件全掃描:
grep -m 100 'error' large.log # 找到 100 條后停止
-
使用
LC_ALL=C
加速(禁用本地化):LC_ALL=C grep 'ERROR' huge.log
-
并行搜索(結合
xargs
):find . -type f | xargs -P 4 grep 'pattern'
七、注意事項
-
正則轉義:
-
特殊字符(如
$
、*
)需用\
轉義,或使用單引號包裹模式。
-
-
二進制文件:
-
默認跳過二進制文件,強制檢查用
-a
選項。
-
-
符號鏈接:
-
-r
會跟隨符號鏈接,使用-r --no-dereference
禁用。
-
通過 grep
,運維工程師可以快速定位故障、分析日志趨勢、提取關鍵數據,是文本處理領域的瑞士軍刀。結合正則表達式和管道操作,能解決 80% 的日常文本處理需求。
sed命令
一、命令概述
sed
(Stream Editor)是 Linux 下 流式文本處理工具,支持正則表達式匹配、替換、刪除、插入等操作,尤其適合 非交互式批量文本處理。運維工程師常用其進行日志清洗、配置批量修改、數據格式化等任務。
二、基本語法
sed [選項] '指令' 文件 sed [選項] -f 腳本文件 文件
三、核心選項與參數
選項 | 說明 |
---|---|
-n | 靜默模式(僅顯示處理后的行,常與 p 命令配合) |
-i[后綴] | 直接修改文件(-i.bak 修改前備份原文件) |
-e | 指定多條編輯指令(如 -e 's/a/A/' -e 's/b/B/' ) |
-r | 啟用擴展正則表達式(支持 + ? \| 等語法) |
-f 腳本 | 從腳本文件讀取指令 |
四、地址定界與命令
1. 地址定界
格式 | 說明 |
---|---|
n | 第 n 行(如 5s/old/new/ 修改第 5 行) |
n,m | 第 n 到 m 行 |
$ | 最后一行 |
/正則表達式/ | 匹配正則的行 |
n~m | 從第 n 行開始,每隔 m 行(如 1~2 處理奇數行) |
2. 常用命令
命令 | 說明 |
---|---|
s/原內容/替換內容/標志 | 替換操作(核心命令) |
d | 刪除行 |
p | 打印行(常與 -n 配合) |
a\text | 在行后追加文本 |
i\text | 在行前插入文本 |
c\text | 替換整行 |
y/原字符/新字符/ | 字符轉換(類似 tr 命令) |
r 文件 | 將文件內容插入到匹配行后 |
w 文件 | 將匹配行寫入文件 |
3. 替換命令標志
標志 | 說明 |
---|---|
g | 全局替換(一行中所有匹配項) |
p | 打印替換后的行 |
w 文件 | 將替換后的行寫入文件 |
i | 忽略大小寫(需結合 I 標志,如 s/pattern/replace/gi ) |
五、工作案例場景
案例 1:批量替換配置文件參數
場景:將 Nginx 配置中所有 worker_processes 2;
改為 worker_processes auto;
sed -i.bak 's/worker_processes\s\+2;/worker_processes auto;/g' /etc/nginx/nginx.conf
說明:
-
\s\+
匹配一個或多個空白符 -
-i.bak
修改前生成備份文件nginx.conf.bak
案例 2:刪除日志文件中的空行
場景:清理 /var/log/app.log
中的空行
sed -i '/^$/d' /var/log/app.log
解析:
-
/^$/
匹配空行 -
d
命令刪除匹配行
案例 3:提取特定時間段的日志
場景:提取 2023-10-10 09:00 至 10:00 的日志
sed -n '/2023-10-10 09:00:00/,/2023-10-10 10:00:00/p' /var/log/app.log
說明:
-
-n
配合p
僅輸出匹配范圍
案例 4:批量注釋/取消注釋配置
場景:注釋 Apache 配置中所有 LogLevel
行
sed -i '/^LogLevel/ s/^/#/' /etc/httpd/conf/httpd.conf
取消注釋:
sed -i '/^#LogLevel/ s/^#//' /etc/httpd/conf/httpd.conf
案例 5:批量修改文件格式(DOS 轉 Unix)
場景:刪除文件中的 ^M
字符(Windows 換行符)
sed -i 's/\r$//' *.txt
案例 6:動態插入配置片段
場景:在 </VirtualHost>
前插入 SSL 配置
sed -i '/<\/VirtualHost>/i \\nSSLEngine on\nSSLCertFile /path/to/cert.pem' httpd.conf
輸出效果:
SSLEngine on SSLCertFile /path/to/cert.pem </VirtualHost>
六、高級技巧
1. 多命令組合執行
sed -e 's/foo/bar/g' -e '/baz/d' input.txt
2. 引用變量(Shell 腳本中)
new_value="PROD" sed -i "s/ENV=.*/ENV=$new_value/" config.env
3. 反向引用正則分組
場景:交換日志中日期和時間的位置
sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})/\2 \1/' app.log
4. 結合 find
批量處理文件
find /etc/nginx/conf.d/ -name "*.conf" -exec sed -i 's/old_domain/new_domain/g' {} \;
七、注意事項
-
備份原則:
-
使用
-i.bak
保留原文件,避免誤操作不可逆
-
-
定界符選擇:
-
若替換內容包含
/
,可改用其他符號(如s@old@new@
)
-
-
性能優化:
-
處理大文件時避免使用
sed
全量加載到內存,可用awk
替代
-
-
正則貪婪匹配:
-
sed
默認貪婪匹配,.*
會匹配到行尾,需謹慎使用
-
通過 sed
,運維工程師可以快速完成文本批處理任務,尤其適合需要 自動化、可重復執行 的場景。結合正則表達式和 Shell 腳本,能顯著提升日常工作效率。
awk命令
一、命令概述
awk
是 Linux 下 高級文本處理工具,以 字段(列) 為核心處理結構化數據,支持條件判斷、循環、數學運算和自定義函數。運維工程師常用其進行日志分析、數據統計、報表生成等任務,尤其擅長處理復雜文本格式(如 CSV、日志文件)。
二、基本語法與結構
awk [選項] '模式 {動作}' 文件 awk -f 腳本文件 文件
三、核心概念與選項
1. 常用選項
選項 | 說明 |
---|---|
-F | 指定字段分隔符(默認空格,如 -F':' ) |
-v var=val | 定義變量(用于腳本內外傳值) |
-f | 從腳本文件讀取命令 |
2. 內置變量
變量 | 說明 |
---|---|
FS | 輸入字段分隔符(等價 -F 選項) |
OFS | 輸出字段分隔符(默認空格) |
NR | 當前處理的總行號(從1開始) |
NF | 當前行的字段總數 |
$0 | 當前行的完整內容 |
$1~$n | 第1到第n個字段 |
FILENAME | 當前處理的文件名 |
RS | 輸入行分隔符(默認換行符) |
ORS | 輸出行分隔符(默認換行符) |
3. 模式與動作
-
模式:可以是正則表達式、條件判斷(如
NR > 10
)或BEGIN
/END
塊。 -
動作:用
{}
包裹的代碼塊,支持if
、for
、while
等控制結構。
四、工作案例場景
案例 1:統計日志中 HTTP 狀態碼分布
場景:統計 Nginx 訪問日志中不同狀態碼(如 200、404、500)的出現次數。
awk '{status[$9]++} END {for (code in status) print code, status[code]}' access.log
輸出示例:
200 1200 404 23 500 5
解析:
-
$9
是日志中狀態碼所在的字段。 -
status
為關聯數組,鍵為狀態碼,值為出現次數。
案例 2:計算目錄下文件總大小(MB)
場景:統計 /var/log
下所有文件的磁盤占用總和。
ls -l /var/log | awk 'NR>1 {sum+=$5} END {print sum/1024/1024 " MB"}'
解析:
-
NR>1
跳過ls -l
的首行(總用量)。 -
$5
是文件大小字段。
案例 3:格式化輸出進程信息
場景:提取 ps
命令輸出中的 PID、CPU 和進程名,按 CPU 降序排序。
ps aux | awk 'NR>1 {printf "PID: %-6s CPU: %-5s %s\n", $2, $3, $11}' | sort -k3 -nr
輸出示例:
PID: 1234 CPU: 30.2 /usr/bin/python3 PID: 5678 CPU: 15.7 /usr/sbin/nginx
案例 4:分析網絡連接狀態
場景:統計 ss -tun
輸出中各端口的 TCP 連接數。
ss -tun | awk '/^tcp/ {split($4, arr, ":"); port[arr[2]]++} END {for (p in port) print p, port[p]}'
解析:
-
split($4, arr, ":")
分割本地地址字段,提取端口號。
案例 5:動態修改 CSV 文件字段
場景:將 CSV 文件的第3列(價格)增加 10%,并生成新文件。
awk -F',' -v OFS=',' 'NR==1 {print; next} {$3 *= 1.1; print}' data.csv > updated.csv
解析:
-
NR==1 {print; next}
保留標題行。 -
OFS
設置輸出字段分隔符為逗號。
案例 6:多文件關聯分析
場景:合并 users.txt
和 scores.txt
,按用戶 ID 輸出總分。 users.txt:
1,Alice 2,Bob
scores.txt:
1,85 2,90 1,78
命令:
awk -F',' 'NR==FNR {score[$1]+=$2; next} {print $0, score[$1]}' scores.txt users.txt
輸出:
1,Alice 163 2,Bob 90
解析:
-
NR==FNR
僅在第一個文件(scores.txt)處理時生效。 -
next
跳過后續動作,直接處理下一行。
五、高級技巧
1. 使用 BEGIN
/END
塊
場景:輸出前添加表頭和結尾統計。
awk 'BEGIN {print "Start Processing..."} {sum+=$1} END {print "Total:", sum}' data.txt
2. 自定義函數
場景:計算字段的 SHA1 哈希值。
awk 'function sha1(str) {cmd="echo -n \"" str "\" | sha1sum"; cmd | getline result; close(cmd); return substr(result,1,40)} {print sha1($1)}' input.txt
3. 結合 Shell 管道
場景:提取日志中訪問頻率最高的前 5 個 IP。
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n5
六、注意事項
-
性能優化:
-
避免在循環中頻繁調用外部命令(如
system()
)。 -
處理大文件時優先使用原生
awk
操作,而非正則表達式。
-
-
字段索引:
-
確保字段存在(如
NF >=3
時再訪問$3
)。
-
-
正則表達式:
-
使用
~
進行正則匹配(如$0 ~ /error/
)。
-
通過 awk
,運維工程師可以高效處理結構化數據,結合其腳本能力,能快速實現復雜分析任務,是日志處理、系統監控和自動化運維的核心工具。
cut命令
一、命令概述
cut
是 Linux 下用于 按列提取文本內容 的工具,支持通過 字段分隔符 或 字符位置 切割數據。它適用于處理結構化文本(如 CSV、日志文件、系統配置文件等),快速提取指定列或固定位置的數據,是運維工程師處理文本流的常用工具。
二、基本語法
cut [選項] [文件]
三、核心選項與參數
選項 | 說明 |
---|---|
-d | 指定字段分隔符(默認 TAB ,不可省略) |
-f | 指定提取的字段編號(支持范圍,如 1-3 或 1,3,5 ) |
-c | 按字符位置提取(如 1-5 或 1,3,5 ) |
--complement | 反向選擇(提取未指定的字段) |
-s | 僅處理包含分隔符的行(默認輸出無分隔符的行) |
四、工作案例場景
案例 1:提取 /etc/passwd
的用戶名和 Shell
場景:從用戶配置文件中提取所有用戶的登錄 Shell(第 7 列)。
cut -d':' -f1,7 /etc/passwd
輸出示例:
root:/bin/bash nginx:/sbin/nologin mysql:/bin/false
案例 2:從日志中提取 IP 地址和時間戳
場景:Nginx 日志格式為 IP - - [時間] "請求" 狀態碼 大小
,提取 IP(第 1 列)和時間(第 4 列)。
cut -d' ' -f1,4 access.log
輸出示例:
192.168.1.100 [10/Oct/2023:14:30:22 192.168.1.101 [10/Oct/2023:14:31:15
案例 3:按字符位置截取文本
場景:提取固定格式日志中的日期部分(前 10 個字符)。
cut -c1-10 /var/log/app.log
輸出示例:
2023-10-10 2023-10-10
案例 4:處理 CSV 文件并排除指定列
場景:提取 CSV 文件的第 2、4 列(跳過第 1 和 3 列)。
cut -d',' -f2,4 data.csv
文件內容:
id,name,age,department 1,Alice,25,IT 2,Bob,30,HR
輸出示例:
name,department Alice,IT Bob,HR
案例 5:反向提取字段(排除指定列)
場景:提取 /etc/passwd
中除用戶 ID(第 3 列)外的所有字段。
cut -d':' -f3 --complement /etc/passwd
輸出示例:
root:x:0:0:root:/root:/bin/bash nginx:x:1000:1000::/home/nginx:/sbin/nologin
案例 6:結合管道處理命令輸出
場景:統計當前目錄下文件名長度超過 10 個字符的文件數量。
ls | cut -c1-10 | awk '{print length($0)}' | grep -c '^10$'
五、高級技巧
1. 處理多字符分隔符
cut
默認僅支持單字符分隔符,若需處理多字符分隔符(如 ||
),需結合 tr
預處理:
echo "A||B||C" | tr -s '|' ',' | cut -d',' -f2 # 輸出 B
2. 動態字段提取(腳本中)
在 Shell 腳本中,通過變量指定字段:
COLUMN=3 cut -d',' -f$COLUMN data.csv
3. 處理包含空格的字段
若字段包含空格(如 "San Francisco"
),需確保分隔符唯一或使用其他工具(如 awk
):
awk -F',' '{print $2}' cities.csv # 更可靠
六、注意事項
-
分隔符限制:
-
-d
僅支持單字符,無法使用正則表達式或多字符分隔符。 -
若字段內容包含分隔符,需預處理或改用
awk
(如awk -F','
)。
-
-
字段編號規則:
-
字段從
1
開始計數(非 0)。 -
范圍
1-3
包含第 1、2、3 列。
-
-
性能優化:
-
處理大文件時,
cut
性能優于awk
,但功能有限。
-
七、總結
-
適用場景:快速提取固定格式文本的指定列(如日志、CSV、系統配置文件)。
-
替代方案:復雜字段處理(如多分隔符、正則匹配)優先使用
awk
。
通過 cut
,運維工程師可以高效完成結構化文本的列提取任務,尤其在處理日志分析和數據清洗時,結合管道操作能大幅提升工作效率。
sort和uniq命令
一、sort
命令詳解
sort
用于 對文本行進行排序,支持按數值、字典序、時間等多種規則排序,是處理日志、配置文件、數據集的必備工具。
1. 核心選項
選項 | 說明 |
---|---|
-n | 按數值大小排序(默認按字符串排序) |
-r | 降序排序(默認升序) |
-k N | 指定按第 N 列排序(可指定范圍 -k 3,5 ) |
-t C | 指定字段分隔符(如 -t ':' ) |
-u | 去重(保留唯一行,等效 sort | uniq ) |
-M | 按月份縮寫排序(如 JAN 、FEB ) |
-o 文件 | 將結果輸出到文件(可覆蓋原文件) |
-T 目錄 | 指定臨時文件目錄(處理大文件時避免磁盤空間不足) |
2. 工作案例
案例 1:按 CPU 使用率降序排序進程
ps aux | sort -rnk 3
輸出示例:
user 1234 30.0 0.5 /usr/bin/python3 user 5678 25.5 1.2 /usr/sbin/nginx
解析:
-
-rnk 3
:按第 3 列(CPU%)數值降序排序。
案例 2:排序 CSV 文件并去重
sort -t ',' -k2,2n -u data.csv
文件內容:
1,30,Alice 2,25,Bob 3,30,Alice
輸出:
2,25,Bob 1,30,Alice
解析:
-
-t ','
:以逗號分隔字段。 -
-k2,2n
:按第 2 列數值升序排序。 -
-u
:去除重復行(保留唯一行)。
案例 3:合并多個排序文件
sort -m file1.txt file2.txt -o merged.txt
說明:
-
-m
:合并已排序的文件(效率高于重新排序)。
二、uniq
命令詳解
uniq
用于 過濾或統計連續重復的行,需注意:輸入必須先排序(通常與 sort
結合使用)。
1. 核心選項
選項 | 說明 |
---|---|
-c | 統計重復次數(常用) |
-d | 僅顯示重復行 |
-u | 僅顯示唯一行(不重復的行) |
-i | 忽略大小寫 |
-f N | 跳過前 N 個字段(結合 -t 使用) |
2. 工作案例
案例 1:統計日志中錯誤類型出現次數
grep 'ERROR' app.log | sort | uniq -c | sort -nr
輸出示例:
12 ERROR: Connection timeout 5 ERROR: Disk full 3 ERROR: Permission denied
解析:
-
sort | uniq -c
:排序后統計重復行。 -
sort -nr
:按錯誤次數降序排序。
案例 2:提取唯一 IP 地址
cut -d ' ' -f1 access.log | sort | uniq
說明:
-
從日志中提取 IP(第 1 列),去重后輸出所有唯一 IP。
案例 3:查找重復用戶
cut -d ':' -f1 /etc/passwd | sort | uniq -d
解析:
-
若輸出為空,表示所有用戶唯一;否則顯示重復用戶名。
三、組合使用案例
案例 1:分析訪問日志的 Top 10 IP
cut -d ' ' -f1 access.log | sort | uniq -c | sort -nr | head -n10
輸出示例:
1500 192.168.1.100 1200 10.0.0.1 800 172.16.0.5
步驟分解:
-
提取 IP 列 → 排序 → 統計次數 → 按次數降序排序 → 取前 10 行。
案例 2:清理重復配置項
sort -u nginx.conf > nginx_clean.conf
說明:
-
直接通過
sort -u
刪除重復配置行(無需uniq
)。
案例 3:按多列排序并去重
sort -t ',' -k2,2n -k3,3r data.csv | uniq
文件內容:
1,30,Alice 2,25,Bob 3,30,Alice
輸出:
2,25,Bob 1,30,Alice 3,30,Alice
解析:
-
先按第 2 列數值升序,再按第 3 列字母降序,最后去重。
四、注意事項
-
uniq
依賴排序:# 錯誤!未排序直接使用 uniq 可能失效 cat log.txt | uniq -c # 正確用法 cat log.txt | sort | uniq -c
-
字段處理:
-
使用
-t
和-k
處理復雜格式(如 CSV/TSV)。 -
示例:
sort -t ':' -k3n /etc/passwd
按 UID 排序用戶。
-
-
性能優化:
-
對大文件使用
-T /tmp
避免/tmp
空間不足:sort -T /mnt/bigdisk/ largefile.txt
-
五、總結
-
sort
:核心排序工具,支持多列、多規則排序,去重。 -
uniq
:依賴排序結果,用于統計、過濾重復行。 -
組合場景:日志分析、數據清洗、配置管理、資源監控。
通過靈活組合 sort
和 uniq
,可高效完成大多數文本處理任務,成為運維工程師的日常必備技能。
journal命令
一、命令概述
journalctl
是 Linux 下用于 查詢和管理 systemd 日志 的核心工具,能夠查看系統服務、內核、應用程序的日志記錄。相比傳統 syslog
,journalctl
支持結構化日志、時間范圍過濾、多字段查詢等高級功能,是運維工程師排查系統問題的關鍵工具。
二、核心選項與參數
選項 | 說明 |
---|---|
-u <服務名> | 查看指定 systemd 服務的日志 |
-k /--dmesg | 僅顯示內核日志 |
-b [ID] | 查看指定啟動周期的日志(-b -1 表示上次啟動) |
-f | 實時跟蹤最新日志(類似 tail -f ) |
-n <行數> | 顯示最近 N 行日志(默認 10 行) |
-p <優先級> | 按日志優先級過濾(emerg , alert , crit , err , warning , notice , info , debug ) |
-S <起始時間> /-U <結束時間> | 按時間范圍過濾(格式:"YYYY-MM-DD HH:MM:SS" ) |
--since /--until | 相對時間過濾(如 --since "1 hour ago" ) |
-o <格式> | 指定輸出格式(short , verbose , json , json-pretty , export ) |
--disk-usage | 顯示日志占用的磁盤空間 |
--vacuum-size=<大小> | 清理日志,限制總大小(如 --vacuum-size=500M ) |
三、工作案例場景
案例 1:實時跟蹤系統日志
場景:監控系統實時日志,快速發現異常事件。
sudo journalctl -f
輸出示例:
Oct 15 14:30:22 server systemd[1]: Started nginx.service. Oct 15 14:30:25 server kernel: USB device disconnected (port 3).
說明:
-
-f
持續輸出新日志,按Ctrl+C
退出。
案例 2:查看指定服務的日志
場景:排查 Nginx 服務啟動失敗的原因。
sudo journalctl -u nginx.service --since "10 minutes ago"
輸出示例:
Oct 15 14:25:10 server systemd[1]: Starting nginx... Oct 15 14:25:10 server nginx[1234]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解析:
-
-u nginx.service
過濾 Nginx 服務日志。 -
--since
限制時間范圍為最近 10 分鐘。
案例 3:過濾錯誤級別日志
場景:快速定位系統中的錯誤(error
及以上優先級)。
sudo journalctl -p err -b
輸出示例:
Oct 15 14:20:15 server systemd[1]: Failed to start MySQL database server. Oct 15 14:22:30 server kernel: EXT4-fs error (device sda1): ext4_find_entry:1436: inode #12345: comm nginx: reading directory lblock 0
說明:
-
-p err
顯示錯誤及以上優先級(err
,crit
,alert
,emerg
)。 -
-b
僅當前啟動周期的日志。
案例 4:按時間范圍查詢日志
場景:分析系統在特定時間段內的所有活動。
sudo journalctl -S "2023-10-15 09:00:00" -U "2023-10-15 10:00:00"
說明:
-
-S
和-U
精確指定起始和結束時間。
案例 5:導出日志到文件(JSON 格式)
場景:將日志導出供開發團隊分析。
sudo journalctl -u mysql.service -o json-pretty > mysql_errors.json
輸出示例:
{ "__MONOTONIC_TIMESTAMP" : "123456789", "MESSAGE" : "InnoDB: Database page corruption detected", "PRIORITY" : "2", "_SYSTEMD_UNIT" : "mysql.service", ... }
案例 6:查看系統啟動時的日志
場景:診斷系統啟動失敗問題。
sudo journalctl -b -0 | grep "Failed to mount"
說明:
-
-b -0
查看當前啟動周期的日志。 -
結合
grep
過濾關鍵錯誤信息。
四、高級技巧
1. 結構化字段查詢
# 查看所有包含特定字段的日志(如設備路徑) sudo journalctl _KERNEL_DEVICE="/dev/sda1" # 查詢指定進程 ID 的日志 sudo journalctl _PID=1234
2. 結合其他工具過濾
# 統計 SSH 登錄失敗次數 sudo journalctl -u sshd.service | grep "Failed password" | wc -l # 提取日志中的 IP 地址 sudo journalctl -u nginx.service | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
3. 日志持久化與清理
# 檢查日志占用的磁盤空間 sudo journalctl --disk-usage # 清理日志,保留最近 500MB sudo journalctl --vacuum-size=500M # 手動刪除早于 1 周的日志 sudo journalctl --vacuum-time=1weeks
五、注意事項
-
權限要求:
-
查看系統級日志需
sudo
權限,用戶級日志使用journalctl --user
。
-
-
日志存儲位置:
-
默認存儲在
/var/log/journal/
,確保磁盤空間充足。
-
-
時間同步:
-
若系統時間異常,使用
timedatectl set-ntp true
同步時間。
-
六、總結
通過 journalctl
,運維工程師可以:
-
快速定位服務故障(如啟動失敗、端口沖突)。
-
監控實時系統狀態(硬件錯誤、服務異常)。
-
分析歷史事件(安全審計、性能瓶頸)。
-
自動化日志處理(導出、統計、清理)。
結合結構化查詢和過濾技巧,journalctl
是維護 Linux 系統穩定性和安全性的核心工具。
tail/multitail命令
一、tail
命令詳解
tail
用于查看文件的 末尾內容,默認顯示最后 10 行,支持實時追蹤文件變化(如日志輪轉后自動切換新文件)。
1. 核心選項
選項 | 說明 |
---|---|
-n <行數> | 顯示末尾 N 行(如 -n 20 ) |
-f | 實時跟蹤文件變化(默認持續輸出新增內容) |
-F | 實時跟蹤,且文件被刪除/輪轉后自動重試(處理日志輪轉場景) |
--pid=<PID> | 當指定進程終止后,停止跟蹤 |
-q | 不顯示文件名標題(多文件時靜默模式) |
-s <秒> | 調整監控間隔時間(默認 1 秒) |
-c <字節> | 顯示末尾 N 字節(如 -c 1K ) |
2. 工作案例
案例 1:實時跟蹤日志文件
場景:監控 Nginx 訪問日志的實時更新。
tail -F /var/log/nginx/access.log
輸出示例:
192.168.1.100 - [15/Oct/2023:14:30:22] "GET /api/data HTTP/1.1" 200 1234 192.168.1.101 - [15/Oct/2023:14:30:23] "POST /login HTTP/1.1" 401 567
說明:
-
當日志輪轉(如
access.log
重命名為access.log.1
)時,-F
會自動追蹤新文件。
案例 2:查看最近 50 行錯誤日志
場景:快速定位應用啟動失敗原因。
tail -n 50 /var/log/app/error.log
案例 3:跟蹤日志直到進程結束
場景:監控臨時進程的日志,進程結束后自動停止。
tail -f /tmp/debug.log --pid=$(pgrep -f my_script.sh)
二、multitail
命令詳解
multitail
是增強版日志監控工具,支持 多窗口分屏、顏色標記、正則過濾,可同時監控多個文件或命令輸出。
1. 核心功能
功能 | 說明 |
---|---|
多窗口分屏 | 同時監控多個文件(橫向/縱向分割) |
顏色高亮 | 根據正則表達式標記不同顏色 |
合并視圖 | 將多個日志合并為單一窗口(類似 tail -f file1 file2 ) |
交互式操作 | 支持快捷鍵切換窗口、搜索、過濾 |
2. 安裝方法
# Debian/Ubuntu apt-get install multitail # RHEL/CentOS yum install multitail
3. 工作案例
案例 1:分屏監控多個日志文件
場景:同時查看 Nginx 訪問日志和錯誤日志。
multitail -s 2 /var/log/nginx/access.log /var/log/nginx/error.log
效果:
-
屏幕橫向分割為 2 個窗口,分別顯示
access.log
和error.log
。
案例 2:顏色標記關鍵日志
場景:高亮顯示錯誤(ERROR
)和警告(WARN
)。
multitail -cS app_log /var/log/app.log
配置高亮規則(~/.multitailrc
):
colorscheme:app_log cs_re:magenta:ERROR cs_re:yellow:WARN
案例 3:合并日志并過濾
場景:將多個服務的日志合并顯示,并過濾出含 HTTP 500
的行。
multitail -I /var/log/service1.log /var/log/service2.log -ev "HTTP 500"
說明:
-
-I
合并日志到單一窗口。 -
-ev "HTTP 500"
僅顯示匹配正則的行。
三、高級技巧
1. 快捷鍵操作
快捷鍵 | 功能 |
---|---|
q | 退出當前窗口 |
b | 切換窗口布局(橫向/縱向) |
/ | 搜索關鍵詞 |
Space | 暫停/恢復滾動 |
2. 動態執行命令并監控
場景:監控 ping
命令的輸出和系統日志。
multitail -l "ping google.com" -l "tail -f /var/log/syslog"
3. 自定義顏色方案
步驟:
-
編輯
~/.multitailrc
:
colorscheme:my_scheme cs_re:green:SUCCESS cs_re:red:FAILED
-
應用配置:
multitail -cS my_scheme /var/log/app.log
四、注意事項
-
日志輪轉處理:
-
tail -F
能自動處理輪轉,而multitail
需手動重啟或配置腳本。
-
-
性能影響:
-
同時監控過多文件可能導致資源占用過高,建議限制窗口數量。
-
-
權限問題:
-
監控系統日志(如
/var/log/syslog
)需sudo
權限。
-
五、總結
-
tail
:輕量級工具,適合快速查看或跟蹤單個日志文件。 -
multitail
:功能強大,適合同時監控多日志、復雜過濾和高亮場景。
適用場景對比:
場景 | 推薦工具 |
---|---|
快速查看文件末尾 | tail |
實時跟蹤單個日志 | tail -f |
同時監控多日志 + 高亮 | multitail |
日志輪轉環境 | tail -F |
合并多個日志并過濾 | multitail -I |
通過靈活使用 tail
和 multitail
,運維工程師可高效完成日志監控、故障排查和實時數據分析任務。
五、系統調試與內核
strace命令
一、命令概述
strace
是 Linux 下用于 跟蹤進程的系統調用和信號 的調試工具。通過監控程序與內核的交互,運維工程師可以診斷程序崩潰、性能瓶頸、權限問題、文件訪問異常等底層行為,是分析復雜問題的核心工具。
二、核心選項與參數
strace [選項] <命令> # 跟蹤新啟動的進程 strace -p <PID> # 附加到正在運行的進程
選項 | 說明 |
---|---|
-p <PID> | 附加到指定 PID 的進程 |
-f | 跟蹤子進程(多線程/多進程程序) |
-e <表達式> | 過濾系統調用(如 -e open,read ) |
-o <文件> | 輸出結果到文件 |
-s <長度> | 限制字符串參數顯示長度(默認 32 字節) |
-c | 統計系統調用耗時和次數(性能分析) |
-y | 顯示文件描述符對應的路徑 |
-t | 顯示時間戳(-tt 微秒級) |
-T | 顯示系統調用耗時 |
三、工作案例場景
案例 1:診斷文件訪問失敗
場景:程序報錯 Permission denied
,但文件權限看似正常。
strace -e open,openat,access ./myapp 2>&1 | grep "myfile.txt"
輸出示例:
openat(AT_FDCWD, "myfile.txt", O_RDONLY) = -1 EACCES (Permission denied)
解析:
-
發現程序嘗試以
O_RDONLY
模式打開文件,但實際權限不足。 -
檢查文件所在目錄的 父目錄權限(例如
execute
權限缺失)。
案例 2:分析程序卡頓原因
場景:應用程序間歇性無響應,疑似死鎖或阻塞。
strace -p $(pidof myapp) -T -f
輸出關鍵點:
poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout) <1.001s> read(3, "data\n", 1024) = 5 <0.000003s>
結論:
-
poll
系統調用阻塞 1 秒,說明程序在等待某個文件描述符(fd=3)的數據。 -
檢查 fd=3 對應的網絡連接或管道是否正常。
案例 3:統計系統調用開銷
場景:優化程序性能,定位高耗時系統調用。
strace -c -f ./myapp
輸出示例:
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 45.3 0.100000 200 500 12 futex 30.1 0.066667 333 200 open
優化方向:
-
futex
調用耗時占比高(45.3%),說明存在鎖競爭或多線程問題。 -
open
調用次數過多,考慮緩存文件句柄或合并操作。
案例 4:跟蹤網絡連接問題
場景:程序無法連接到遠程服務,檢查網絡交互細節。
strace -e connect,sendto,recvfrom ./myapp
輸出示例:
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
解析:
-
程序嘗試連接
10.0.0.1:80
,但返回EINPROGRESS
(非阻塞 Socket 正常狀態)。 -
若后續無數據交互,需檢查防火墻、DNS 解析或服務端狀態。
案例 5:跟蹤文件讀寫行為
場景:排查日志文件未正確寫入的原因。
strace -e write,fsync -y ./myapp
輸出示例:
write(3</var/log/app.log>, "error: disk full\n", 16) = 16 fsync(3</var/log/app.log>) = -1 ENOSPC (No space left on device)
結論:
-
寫入日志時磁盤已滿(
ENOSPC
),需清理磁盤空間。
四、高級技巧
1. 過濾關鍵系統調用
# 只跟蹤文件相關調用 strace -e trace=file ./myapp # 跟蹤進程信號處理 strace -e signal=all ./myapp
2. 跟蹤子進程(多線程/多進程程序)
strace -f -ff -o trace.log ./myapp
-
-ff
:為每個子進程生成獨立日志(如trace.log.<PID>
)。
3. 結合管道實時分析
strace ./myapp 2>&1 | grep "ETIMEDOUT"
4. 動態附加到運行中的進程
strace -p $(pidof nginx) -o nginx_trace.log
五、注意事項
-
性能影響:
-
strace
會顯著降低程序性能(尤其是高頻系統調用的程序),生產環境慎用。 -
替代方案:使用
perf
或bpftrace
進行低開銷分析。
-
-
權限要求:
-
附加到其他用戶的進程需
root
權限(sudo strace -p PID
)。
-
-
日志管理:
-
使用
-o
保存日志,避免終端輸出刷屏。
-
六、總結
通過 strace
,運維工程師可以:
-
定位文件權限、路徑錯誤、資源不足等系統調用級問題。
-
分析程序阻塞、性能瓶頸、死鎖等多線程問題。
-
跟蹤網絡連接、信號處理、進程間通信(IPC)等底層行為。
結合 -e
過濾和 -c
統計功能,能快速縮小問題范圍,是解決“明明代碼沒問題,但程序行為異常”類問題的終極武器。
ltrace命令
一、命令概述
ltrace
是 Linux 下用于 跟蹤進程的庫函數調用 的調試工具,能夠顯示程序調用的動態鏈接庫函數(如 malloc
、fopen
、strcmp
)及其參數和返回值。相比 strace
(跟蹤系統調用),ltrace
更關注用戶空間函數,適合分析 內存泄漏、第三方庫異常、性能瓶頸 等問題。
二、核心選項與參數
ltrace [選項] <命令> # 跟蹤新啟動的進程 ltrace -p <PID> # 附加到正在運行的進程
選項 | 說明 |
---|---|
-p <PID> | 附加到指定 PID 的進程 |
-e <表達式> | 過濾函數(如 -e malloc -e free ) |
-c | 統計函數調用次數和耗時 |
-o <文件> | 輸出結果到文件 |
-S | 同時跟蹤系統調用(相當于 strace 功能) |
-n <次數> | 限制顯示參數的數量(默認顯示前 32 字節) |
-i | 顯示指令指針(用于定位調用位置) |
-f | 跟蹤子進程(多線程/多進程程序) |
三、工作案例場景
案例 1:分析內存泄漏
場景:程序運行后內存持續增長,疑似未釋放堆內存。
ltrace -e malloc -e free ./myapp
輸出示例:
malloc(1024) = 0x55a1a2b2e260 malloc(2048) = 0x55a1a2b2e670 free(0x55a1a2b2e260) = <void> malloc(4096) = 0x55a1a2b2f000
結論:
-
若
malloc
次數遠多于free
,可能存在內存泄漏。 -
檢查未配對的
malloc
地址(如0x55a1a2b2f000
未釋放)。
案例 2:定位第三方庫崩潰
場景:程序調用 OpenSSL 庫時崩潰,日志無明確錯誤信息。
ltrace -e SSL_* ./myapp
輸出示例:
SSL_CTX_new(0x7f8d5c0038c0, 0) = 0x55a1a2b2e260 SSL_new(0x55a1a2b2e260) = 0x55a1a2b2e670 SSL_connect(0x55a1a2b2e670) = -1
解析:
-
SSL_connect
返回-1
,說明 TLS 握手失敗。 -
結合
ERR_get_error
函數進一步分析錯誤代碼。
案例 3:統計函數調用開銷
場景:優化程序性能,定位高耗時庫函數。
ltrace -c ./myapp
輸出示例:
% time seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 45.3 0.100000 200 500 malloc 30.1 0.066667 333 200 json_parse
優化方向:
-
malloc
調用頻繁,考慮內存池或批量分配。 -
json_parse
耗時占比高,檢查 JSON 解析邏輯或換用高效庫。
案例 4:跟蹤文件操作異常
場景:程序無法讀取配置文件,權限和路徑均正常。
ltrace -e fopen -e fclose ./myapp
輸出示例:
fopen("config.yml", "r") = 0x55a1a2b2e260 fclose(0x55a1a2b2e260) = 0 fopen("/etc/app/config.yml", "r") = NULL
結論:
-
程序嘗試打開
/etc/app/config.yml
失敗(返回NULL
),檢查路徑是否存在。
案例 5:跟蹤多線程程序的競態條件
場景:多線程程序偶發崩潰,疑似線程安全問題。
ltrace -f -e pthread_mutex_* ./myapp
輸出示例:
pthread_mutex_lock(0x55a1a2b2e260) = 0 pthread_mutex_unlock(0x55a1a2b2e260) = 0 pthread_mutex_lock(0x55a1a2b2e260) = 0
分析:
-
若發現未配對的
pthread_mutex_lock
(如多次加鎖未解鎖),可能觸發死鎖。
四、高級技巧
1. 過濾特定函數并顯示參數詳情
ltrace -e "fopen" -e "printf" -s 256 ./myapp
-
-s 256
:顯示完整字符串參數(避免截斷)。
2. 結合指令指針定位代碼位置
ltrace -i ./myapp
輸出示例:
[0x401234] malloc(1024) = 0x55a1a2b2e260
-
使用
addr2line -e myapp 0x401234
轉換為代碼行號。
3. 跟蹤系統調用與庫函數
ltrace -S -e malloc ./myapp
說明:
-
-S
同時顯示系統調用(類似strace
),適合全鏈路分析。
五、注意事項
-
性能影響:
-
ltrace
會顯著降低程序性能(尤其是高頻函數調用),生產環境慎用。
-
-
動態鏈接限制:
-
只能跟蹤動態鏈接庫(
.so
),靜態鏈接函數無法顯示。
-
-
權限要求:
-
附加到其他用戶的進程需
root
權限(sudo ltrace -p PID
)。
-
六、安裝方法
# Debian/Ubuntu apt-get install ltrace # RHEL/CentOS yum install ltrace
七、總結
通過 ltrace
,運維工程師可以:
-
診斷內存泄漏(
malloc
/free
不匹配)。 -
分析第三方庫問題(如加密庫、JSON 解析庫)。
-
優化性能瓶頸(高頻函數調用統計)。
-
定位用戶態崩潰(空指針、參數錯誤)。
結合 strace
(系統調用分析)和 gdb
(源碼級調試),能構建完整的程序行為分析體系。
dmesg命令
一、命令概述
dmesg
(Display Message)是 Linux 下用于 查看和控制內核環形緩沖區 的核心工具,記錄系統啟動過程、硬件設備檢測、驅動加載、內核事件等重要信息。運維工程師常用其診斷 硬件故障、驅動問題、系統啟動失敗 等底層問題。
二、核心選項與參數
選項 | 說明 |
---|---|
-T | 顯示人類可讀的時間戳(需 sudo ) |
-H | 分頁顯示(類似 less ) |
-w | 實時監控新內核消息(類似 tail -f ) |
-k | 僅顯示內核消息(默認行為) |
-l <級別> | 按日志級別過濾(emerg , alert , crit , err , warn , notice , info , debug ) |
-s <緩沖區大小> | 設置緩沖區大小(默認依賴內核配置) |
-c | 清空緩沖區(查看后清除日志) |
--follow | 持續輸出新日志(類似 tail -f ) |
-d | 顯示時間差(自上次啟動以來的秒數) |
-t | 不顯示時間戳 |
三、工作案例場景
案例 1:查看系統啟動錯誤
場景:系統啟動后無法進入圖形界面,排查驅動或硬件問題。
sudo dmesg -T | grep -i -A10 -B10 "error\|failed"
輸出示例:
[Sun Oct 15 14:30:22 2023] ACPI Error: Could not resolve symbol [\_SB.PCI0.GFX0.DD02._BCM] [Sun Oct 15 14:30:22 2023] nouveau 0000:01:00.0: Direct firmware load for nouveau/nv108_fuc409d failed
結論:
-
ACPI 電源管理模塊錯誤。
-
NVIDIA 顯卡驅動
nouveau
加載固件失敗,需更換驅動或更新固件。
案例 2:診斷 USB 設備識別問題
場景:插入 USB 設備后無反應,確認是否被系統識別。
sudo dmesg -w | grep -i "usb"
輸出示例:
[+5.123456] usb 3-1: new high-speed USB device number 5 using xhci_hcd [+5.234567] usb 3-1: device descriptor read/64, error -110
結論:
-
USB 設備描述符讀取失敗(錯誤碼
-110
),可能是硬件損壞或供電不足。
案例 3:監控實時內核事件
場景:排查系統偶發性卡頓,觀察是否有硬件中斷風暴。
sudo dmesg --follow | grep -i "irq"
輸出示例:
[+120.456789] irq 16: nobody cared (try booting with the "irqpoll" option)
解析:
-
中斷請求(IRQ)未被處理,需調整內核參數或排查硬件沖突。
案例 4:分析內存故障
場景:系統頻繁崩潰,懷疑內存條接觸不良或損壞。
sudo dmesg -l err,crit | grep -i "memory"
輸出示例:
[Sun Oct 15 14:30:22 2023] EDAC MC0: UE memory read error on CPU_SrcID#0_Ha#0_Chan#0_DIMM#0
結論:
-
內存條(DIMM#0)不可糾正錯誤(UE),需更換內存。
案例 5:查看硬盤健康狀態
場景:磁盤性能下降,檢查是否有 S.M.A.R.T 告警。
sudo dmesg | grep -i "sata\|ata\|sector"
輸出示例:
[Sun Oct 15 14:30:22 2023] ata1.00: revalidation failed (errno=-5) [Sun Oct 15 14:30:22 2023] sd 0:0:0:0: [sda] 15628053168 512-byte logical blocks: (7.46 TB/6.78 TiB) [Sun Oct 15 14:30:22 2023] print_req_error: I/O error, dev sda, sector 12345678
解析:
-
sda
磁盤出現 I/O 錯誤(壞道或連接問題)。
四、高級技巧
1. 按時間范圍過濾日志
# 顯示最近 10 分鐘內的內核日志 sudo dmesg -T | grep -A1000 "$(date -d '10 minutes ago' +'%a %b %d %H:%M')"
2. 保存日志到文件
sudo dmesg -T > /var/log/kernel.log
3. 結合 journalctl
查看持久化日志
journalctl --dmesg --since "2023-10-15 14:00:00"
4. 解碼錯誤碼
dmesg | grep -i "error" | perl -n -e '/error code (-?\d+)/ && print "Error $1: " . `man 2 $1`'
五、注意事項
-
權限要求:
-
部分日志需
sudo
權限訪問(如-T
顯示時間戳)。
-
-
日志循環:
-
默認緩沖區大小有限,長時間運行的系統可能覆蓋舊日志。
-
使用
-s 1048576
增大緩沖區或通過sysctl -w kernel.dmesg_restrict=0
解除限制。
-
-
時間戳精度:
-
-T
依賴系統時鐘,若啟動后時鐘未同步,時間可能有偏差。
-
六、總結
通過 dmesg
,運維工程師可以:
-
診斷硬件故障(內存、硬盤、USB 設備)。
-
分析驅動兼容性(加載失敗、固件缺失)。
-
監控內核事件(中斷錯誤、ACPI 問題)。
-
排查啟動問題(初始化失敗、設備未識別)。
結合過濾工具(grep
、awk
)和實時監控(--follow
),能快速定位系統底層異常,是維護系統穩定性的關鍵工具。
lspci/lsusb命令
一、lspci
命令詳解
lspci
用于 查看 PCI(Peripheral Component Interconnect)總線及設備信息,包括顯卡、網卡、存儲控制器等硬件信息,是排查硬件兼容性、驅動問題的核心工具。
1. 核心選項
選項 | 說明 |
---|---|
-v | 顯示詳細信息(-vv 或 -vvv 更詳細) |
-k | 顯示設備使用的內核驅動 |
-n | 以數字形式顯示廠商 ID 和設備 ID |
-nn | 顯示廠商 ID、設備 ID 及名稱 |
-t | 以樹狀圖顯示設備層次結構 |
-s <總線:設備.功能> | 指定設備位置(如 -s 00:1f.2 ) |
-m | 以機器友好格式輸出(適合腳本處理) |
--json | 輸出 JSON 格式數據 |
2. 工作案例
案例 1:查看所有 PCI 設備列表
lspci
輸出示例:
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
案例 2:查看網卡驅動信息
lspci -v -s 01:00.0
輸出示例:
01:00.0 Ethernet controller: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15) Subsystem: ASRock Incorporation RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller Flags: bus master, fast devsel, latency 0, IRQ 19 I/O ports at 3000 [size=256] Memory at a1204000 (64-bit, non-prefetchable) [size=4K] Memory at a1200000 (64-bit, non-prefetchable) [size=16K] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+ Kernel driver in use: r8169 Kernel modules: r8169
案例 3:生成硬件清單(JSON 格式)
lspci --json > pci_devices.json
二、lsusb
命令詳解
lsusb
用于 查看 USB 總線及設備信息,包括 U 盤、攝像頭、外置網卡等 USB 設備,適合排查 USB 設備識別問題或供電問題。
1. 核心選項
選項 | 說明 |
---|---|
-v | 顯示詳細信息(-vv 更詳細) |
-t | 以樹狀圖顯示設備層次結構 |
-s <總線:設備> | 指定設備位置(如 -s 1:2 ) |
-d <廠商ID:產品ID> | 按廠商和產品 ID 過濾(如 -d 8086:1e31 ) |
--json | 輸出 JSON 格式數據 |
2. 工作案例
案例 1:查看所有 USB 設備列表
lsusb
輸出示例:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver Bus 001 Device 002: ID 8087:0029 Intel Corp.
案例 2:查看 USB 攝像頭詳細信息
lsusb -v -d 046d:0825
輸出示例:
Device Descriptor: idVendor 0x046d Logitech, Inc. idProduct 0x0825 Webcam C270 bcdDevice 1.00 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 200 bNumInterfaces 1 ...
案例 3:檢查 USB 設備供電狀態
lsusb -v | grep -E "(Bus|MaxPower)"
輸出示例:
Bus 001 Device 002: ID 8087:0029 Intel Corp. MaxPower 0mA Bus 001 Device 004: ID 046d:c52b Logitech USB Receiver MaxPower 98mA
結論:
-
若設備
MaxPower
顯示0mA
,可能因供電不足導致設備無法識別。
三、組合使用案例
案例 1:診斷無線網卡驅動問題
# 1. 查找無線網卡 PCI 地址 lspci -nn | grep -i "network" # 輸出:03:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a) # 2. 查看驅動信息 lspci -v -s 03:00.0 # 輸出:Kernel driver in use: iwlwifi # 3. 檢查驅動是否加載 dmesg | grep iwlwifi
案例 2:排查 USB 存儲設備未掛載
# 1. 確認設備是否被識別 lsusb | grep "SanDisk" # 輸出:Bus 001 Device 005: ID 0781:5588 SanDisk Corp. Ultra # 2. 查看內核日志 dmesg | grep "sdb" # 輸出:sd 2:0:0:0: [sdb] 625142448 512-byte logical blocks: (320 GB/298 GiB)
案例 3:生成硬件報告(自動化腳本)
#!/bin/bash echo "=== PCI Devices ===" > hardware_report.txt lspci -v >> hardware_report.txt echo "=== USB Devices ===" >> hardware_report.txt lsusb -v >> hardware_report.txt
四、高級技巧
1. 解析廠商和產品 ID
lspci -nn | grep -i "nvidia" # 輸出:01:00.0 VGA [0300]: NVIDIA Corporation GP106 [10de:1c03] (rev a1) lsusb -d 046d:c52b # 輸出:Bus 001 Device 004: ID 046d:c52b Logitech, Inc.
2. 查看 USB 設備速度
lsusb -t # 輸出: /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M |__ Port 2: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
3. 監控 USB 設備熱插拔
watch -n1 lsusb
五、總結
-
lspci
:核心用于 PCI/PCIe 設備管理(顯卡、網卡、存儲控制器)。 -
lsusb
:核心用于 USB 設備管理(外設、攝像頭、存儲設備)。 -
聯合工具:結合
dmesg
(內核日志)、sysctl
(內核參數)進行硬件問題深度診斷。
適用場景:
-
硬件兼容性驗證(驅動是否加載)。
-
設備識別問題排查(是否被系統檢測到)。
-
硬件性能調優(IRQ 沖突、DMA 配置)。
-
自動化硬件清單生成(JSON/文本報告)。
六、安全與審計
chattr/lsattr命令
一、命令概述
-
chattr
用于修改文件或目錄的 擴展屬性(Extended Attributes),這些屬性控制文件系統的底層行為(如不可刪除、不可修改、僅追加等)。 -
lsattr
用于查看文件或目錄的擴展屬性。 -
適用場景:防止文件被誤刪、保護關鍵配置文件、限制日志文件修改等。
二、核心屬性說明
屬性 | 作用 |
---|---|
a | 僅允許追加內容(不可修改或刪除已有內容) |
i | 文件不可修改、刪除、重命名或創建硬鏈接(不可變) |
A | 禁用文件的 atime 更新(減少磁盤 I/O) |
c | 啟用透明壓縮(需文件系統支持,如 btrfs ) |
u | 刪除文件后保留數據塊以便恢復(需專業工具) |
e | 表示文件使用 ext4 的 extent 格式(默認啟用,不可修改) |
三、chattr
命令用法
# 添加屬性 chattr +[屬性] <文件或目錄> # 移除屬性 chattr -[屬性] <文件或目錄> # 遞歸操作目錄 chattr -R +[屬性] <目錄>
常用選項
選項 | 說明 |
---|---|
-R | 遞歸處理目錄及子目錄內容 |
-v | 顯示詳細操作信息 |
四、lsattr
命令用法
lsattr <文件或目錄> lsattr -R <目錄> # 遞歸查看目錄屬性
常用選項
選項 | 說明 |
---|---|
-R | 遞歸列出目錄及子目錄屬性 |
-a | 顯示隱藏文件屬性 |
-d | 顯示目錄本身屬性(非內容) |
五、工作案例場景
案例 1:防止關鍵文件被誤刪或修改
# 保護 /etc/passwd 文件(禁止所有修改) sudo chattr +i /etc/passwd # 驗證屬性 lsattr /etc/passwd # 輸出:----i---------e-- /etc/passwd # 嘗試刪除或修改(會失敗) sudo rm /etc/passwd # 報錯:rm: cannot remove '/etc/passwd': Operation not permitted
案例 2:保護日志文件僅允許追加
# 允許向日志文件追加新內容,但禁止修改已有內容 sudo chattr +a /var/log/nginx/access.log # 驗證屬性 lsattr /var/log/nginx/access.log # 輸出:-----a----------e-- /var/log/nginx/access.log # 嘗試覆蓋寫入(會失敗) echo "test" > /var/log/nginx/access.log # 報錯:bash: access.log: Operation not permitted # 允許追加新日志 echo "test" >> /var/log/nginx/access.log
案例 3:防止目錄被篡改
# 遞歸保護 /etc/nginx 目錄(禁止任何修改) sudo chattr -R +i /etc/nginx # 驗證屬性 lsattr -d /etc/nginx # 輸出:----i---------e-- /etc/nginx # 嘗試添加新配置文件 sudo touch /etc/nginx/new.conf # 報錯:touch: cannot touch '/etc/nginx/new.conf': Permission denied
案例 4:優化文件系統性能
# 禁用文件的 atime 更新(減少磁盤 I/O) sudo chattr -R +A /data # 驗證屬性 lsattr /data/file.txt # 輸出:-------A--------e-- /data/file.txt
六、注意事項
-
權限要求:
-
修改屬性需
root
權限(使用sudo
)。
-
-
屬性優先級:
-
i
和a
屬性會覆蓋文件權限(即使chmod 777
也無法修改)。
-
-
恢復文件操作:
-
若誤鎖文件,需先移除屬性(如
chattr -i
)。
-
-
備份與恢復:
-
使用
i
屬性前確保有備份,避免系統更新或服務重啟失敗。
-
七、總結
-
chattr
是系統安全的最后一道防線,適用于保護核心配置、日志和敏感數據。 -
lsattr
用于調試文件不可修改、刪除等異常問題。 -
常用組合:
-
防誤刪:
chattr +i
-
日志保護:
chattr +a
-
性能優化:
chattr +A
-
-
風險提示:誤用
i
屬性可能導致系統服務崩潰,操作前務必確認影響范圍。
getfacl/setfacl命令
一、命令概述
-
getfacl
:查看文件或目錄的 訪問控制列表(ACL),顯示詳細的權限配置。 -
setfacl
:設置或修改 ACL,實現 細粒度權限控制(如為特定用戶/組分配獨立權限)。 -
適用場景:傳統 Unix 權限(用戶/組/其他)無法滿足復雜權限需求時(如多用戶協作、共享目錄權限繼承)。
二、ACL 核心概念
-
ACL 條目類型:
-
用戶條目:
user:username:權限
-
組條目:
group:groupname:權限
-
掩碼(mask):限制有效權限(類似
umask
) -
默認 ACL:目錄的默認 ACL 會被其子文件和目錄繼承。
-
-
權限符號:
-
r
(讀)、w
(寫)、x
(執行)、-
(無權限)。
-
三、getfacl
命令用法
getfacl <文件或目錄> getfacl -R <目錄> # 遞歸查看目錄及子內容
輸出示例:
# file: test.txt # owner: root # group: staff user::rw- user:alice:r-- group::r-- mask::r-- other::r--
-
解析:
-
user:alice:r--
:用戶alice
有讀權限。 -
mask::r--
:有效權限掩碼為讀(限制用戶/組最大權限)。
-
四、setfacl
命令用法
# 添加/修改 ACL 條目 setfacl -m <條目> <文件或目錄> # 刪除 ACL 條目 setfacl -x <條目> <文件或目錄> # 刪除所有 ACL 條目 setfacl -b <文件或目錄> # 設置默認 ACL(僅目錄有效) setfacl -d -m <條目> <目錄>
常用選項:
選項 | 說明 |
---|---|
-m | 修改 ACL 條目 |
-x | 刪除指定 ACL 條目 |
-b | 清除所有 ACL 條目 |
-R | 遞歸操作目錄內容 |
-d | 設置默認 ACL(影響新創建的文件/目錄) |
-k | 刪除所有默認 ACL 條目 |
五、工作案例場景
案例 1:為特定用戶分配獨立權限
場景:目錄 /data/shared
需要允許用戶 alice
讀寫,但不影響其他用戶。
# 添加用戶 ACL sudo setfacl -m u:alice:rwx /data/shared # 驗證權限 getfacl /data/shared # 輸出:user:alice:rwx # 檢查權限是否生效 su - alice -c "touch /data/shared/test.txt" # 應成功
案例 2:為組設置權限并限制掩碼
場景:允許組 developers
讀寫文件 app.conf
,但掩碼限制為只讀。
# 添加組 ACL 并設置掩碼 sudo setfacl -m g:developers:rw- app.conf sudo setfacl -m m::r-- app.conf # 驗證結果 getfacl app.conf # 輸出: # group:developers:rw- # 有效權限被掩碼限制為 r-- # mask::r--
案例 3:設置繼承權限(默認 ACL)
場景:目錄 /backup
下所有新文件自動繼承組 backup-team
的讀寫權限。
# 設置默認 ACL sudo setfacl -d -m g:backup-team:rw /backup # 創建子文件驗證 touch /backup/newfile getfacl /backup/newfile # 輸出:group:backup-team:rw-
案例 4:刪除 ACL 條目
場景:移除用戶 bob
對文件 report.txt
的寫權限。
sudo setfacl -x u:bob report.txt
案例 5:遞歸恢復目錄權限
場景:清除 /var/www
目錄及其子項的所有 ACL 設置。
sudo setfacl -Rb /var/www
六、高級技巧
1. ACL 權限備份與恢復
# 備份 ACL getfacl -R /data > /backup/data_acls.txt # 恢復 ACL setfacl --restore=/backup/data_acls.txt
2. 結合 cp
/rsync
保留 ACL
cp --preserve=all source.txt dest.txt # 保留 ACL rsync -A source_dir/ dest_dir/ # 同步 ACL
3. 調試權限沖突
# 查看有效權限(mask 的影響) getfacl file.txt
七、注意事項
-
文件系統支持:確保掛載時啟用 ACL(如
ext4
掛載選項含acl
)。 -
權限優先級:ACL 條目優先級高于傳統組權限。
-
SELinux 影響:若啟用 SELinux,需確保上下文與 ACL 不沖突。
八、總結
-
getfacl
:快速查看復雜權限配置,驗證 ACL 是否生效。 -
setfacl
:實現靈活權限分配(用戶/組/默認繼承),突破傳統 Unix 權限限制。 -
核心場景:多團隊協作、共享目錄、精細化權限管理。
通過合理使用 ACL,運維工程師可高效管理企業級文件系統的訪問控制,增強數據安全性和協作靈活性。
auditd審計
一、auditd 概述
auditd
是 Linux 內核的 審計框架守護進程,用于監控和記錄系統級事件(如文件訪問、用戶操作、系統調用、網絡連接等)。其主要功能包括:
-
安全合規:滿足 GDPR、HIPAA 等安全審計要求。
-
入侵檢測:追蹤異常行為(如敏感文件篡改、提權操作)。
-
故障排查:記錄系統關鍵操作日志,用于事后分析。
二、核心組件與配置
-
守護進程:
auditd
服務,負責收集和存儲審計日志。 -
控制工具:
-
auditctl
:動態管理審計規則。 -
ausearch
:查詢審計日志。 -
aureport
:生成審計報告。
-
-
配置文件:
-
/etc/audit/auditd.conf
:審計守護進程配置(日志路徑、輪轉策略等)。 -
/etc/audit/rules.d/audit.rules
:審計規則定義文件(持久化規則)。
-
三、auditctl 命令用法
# 臨時添加規則 auditctl -w <監控路徑> -p <權限> -k <關鍵字標簽> # 查看當前規則 auditctl -l # 刪除所有規則 auditctl -D # 永久保存規則 auditctl -R /etc/audit/rules.d/audit.rules
參數說明:
-
-w
:監控文件或目錄路徑。 -
-p
:監控的操作權限(r
讀、w
寫、x
執行、a
屬性修改)。 -
-k
:自定義關鍵字,用于日志篩選。
四、工作案例場景
案例 1:監控敏感文件訪問(如 /etc/passwd
)
目標:記錄任何對 /etc/passwd
的讀寫或屬性修改操作。
# 添加規則 auditctl -w /etc/passwd -p wa -k passwd_change # 驗證規則 auditctl -l # 輸出:-w /etc/passwd -p wa -k passwd_change # 測試觸發日志 echo "test" >> /etc/passwd # 故意觸發寫入(需 root 權限) # 查詢日志 ausearch -k passwd_change -i
日志輸出:
time->Fri Oct 15 14:30:22 2023 type=PROCTITLE msg=audit(1697370622.123:456): proctitle="sh -c echo test >> /etc/passwd" type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=open success=yes exit=3 ...
案例 2:監控用戶提權操作(如 sudo
或 su
)
目標:記錄所有用戶執行 sudo
或切換用戶(su
)的行為。
# 添加規則 auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage auditctl -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k su_usage # 查詢日志 ausearch -k "sudo_usage\|su_usage" -i
案例 3:監控網絡連接(如未授權的端口訪問)
目標:記錄所有對 22 端口(SSH)的訪問嘗試。
# 添加規則 auditctl -a always,exit -F arch=b64 -S connect -F a2=22 -k ssh_connection # 查詢日志 ausearch -k ssh_connection -i
日志輸出:
type=SYSCALL msg=audit(1697370622.123:456): arch=c000003e syscall=connect success=no exit=-13 ...
案例 4:監控文件系統掛載/卸載操作
目標:記錄所有 mount
或 umount
命令的執行。
# 添加規則 auditctl -w /usr/bin/mount -p x -k mount_operation auditctl -w /usr/bin/umount -p x -k mount_operation # 查詢日志 ausearch -k mount_operation -i
五、日志分析與報告
1. 使用 ausearch
查詢日志
# 按關鍵字搜索 ausearch -k passwd_change # 按時間范圍搜索 ausearch -ts "14:30:00" -te "15:00:00" # 按用戶搜索 ausearch -ui root
2. 使用 aureport
生成報告
# 生成用戶活動摘要 aureport -u # 生成文件訪問報告 aureport -f # 生成所有事件匯總 aureport -summary
六、高級配置
1. 日志輪轉與存儲
編輯 /etc/audit/auditd.conf
:
max_log_file = 50 # 單個日志文件最大 50MB num_logs = 5 # 保留 5 個歷史日志
重啟服務生效:
systemctl restart auditd
2. 永久化審計規則
將規則寫入 /etc/audit/rules.d/audit.rules
:
-w /etc/passwd -p wa -k passwd_change -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_usage
加載規則:
auditctl -R /etc/audit/rules.d/audit.rules
七、注意事項
-
性能影響:高頻事件(如監控所有
execve
調用)可能導致日志爆炸,需合理配置規則。 -
日志安全:審計日志需嚴格權限控制(
root
只讀),防止篡改。 -
SELinux 集成:確保審計規則與 SELinux 策略不沖突。
-
規則調試:使用
auditctl -l
和ausearch
驗證規則是否生效。
八、總結
通過 auditd
,運維工程師可以:
-
實現合規審計:滿足安全標準對日志記錄的要求。
-
主動防御入侵:檢測異常文件操作、非法提權、可疑網絡連接。
-
精準故障排查:通過事件回溯定位系統問題根源。
結合 ausearch
和 aureport
工具,能高效分析海量日志數據,是企業級系統安全的核心組件。
lynis工具
一、Lynis 概述
Lynis 是一款開源的 自動化安全審計工具,用于掃描 Linux 系統和類 Unix 系統,檢測潛在安全漏洞和配置問題,提供合規性檢查和修復建議。其核心功能包括:
-
系統弱點掃描:檢查內核參數、文件權限、服務配置等。
-
合規性審計:支持 CIS、HIPAA、PCI-DSS 等標準。
-
自動化修復建議:提供詳細的問題描述和解決方案。
-
報告生成:生成 HTML 或 JSON 格式的審計報告。
二、安裝與配置
1. 安裝 Lynis
# Debian/Ubuntu sudo apt install lynis # RHEL/CentOS sudo yum install epel-release sudo yum install lynis # 從源碼安裝(最新版本) git clone https://github.com/CISOfy/lynis cd lynis sudo ./lynis audit system
2. 配置文件
Lynis 配置文件位于 /etc/lynis/default.prf
,可自定義掃描范圍和規則。
# 自定義排除路徑 SKIP_FILES="/tmp/example" # 調整掃描深度 VERBOSE=1
三、核心命令與選項
lynis [選項] [審計類型]
常用選項:
選項 | 說明 |
---|---|
audit system | 執行完整系統審計(默認操作) |
--quick | 快速掃描(跳過耗時檢查) |
--pentest | 滲透測試模式(模擬攻擊者視角) |
--report-file | 指定報告輸出路徑(如 --report-file /tmp/report.txt ) |
--no-log | 禁止寫入日志文件 |
--cronjob | 靜默模式(適合定時任務) |
四、工作案例場景
案例 1:執行完整系統安全審計
場景:檢查服務器是否符合 CIS 基準規范,生成詳細報告。
sudo lynis audit system --report-file /var/log/lynis-report.txt
輸出關鍵項:
[+] Boot and services - Check UEFI Secure Boot [FOUND] - Check for presence GRUB2 password [WARNING] [+] Suggestions * Set a password for GRUB2 boot loader [LYNIS] * Harden the system by restricting core dumps [KRNL-5830]
后續操作:
-
根據報告中的
WARNING
和SUGGESTION
修復問題(如設置 GRUB 密碼)。 -
重新掃描驗證修復效果:
sudo lynis audit system --quick
案例 2:生成合規性報告(HTML)
場景:為安全團隊生成可視化審計報告,用于合規性審查。
sudo lynis audit system --report-file /tmp/lynis.html --format html
報告內容:
-
風險等級分布(高/中/低)。
-
合規性檢查結果(CIS、PCI-DSS)。
-
詳細修復步驟和參考鏈接。
案例 3:滲透測試模式掃描
場景:模擬攻擊者視角,檢測系統中可能被利用的弱點。
sudo lynis audit system --pentest
重點檢測項:
-
未加密的敏感文件(如
/etc/passwd
權限)。 -
弱密碼策略(密碼最小長度、過期時間)。
-
開放的高風險端口(如匿名 FTP、未加密的 Telnet)。
案例 4:自動化定期審計(Cron 任務)
場景:每周自動掃描并郵件通知管理員。
# 創建腳本 /opt/lynis-scan.sh #!/bin/bash sudo lynis audit system --cronjob --report-file /var/log/lynis-$(date +%Y%m%d).log # 設置每周日 3:00 AM 執行 (crontab -l ; echo "0 3 * * 0 /opt/lynis-scan.sh") | crontab -
五、高級技巧
1. 自定義審計規則
在 /etc/lynis/custom.prf
中添加自定義測試項:
# 檢查 SSH 端口是否為非標準端口 test="SSH-7408" category="security" description="Check if SSH is running on non-default port" command="netstat -tuln | grep -q ':22'" expected_result="1"
運行自定義測試:
sudo lynis audit system --tests-from-category security
2. 集成到 CI/CD 流程
在 Jenkins/GitLab CI 中添加 Lynis 掃描階段:
stages: - security_audit lynis_audit: stage: security_audit script: - sudo lynis audit system --quick --no-log - lynis_audit_exit_code=$? - if [ $lynis_audit_exit_code -ne 0 ]; then exit 1; fi
六、注意事項
-
權限要求:大部分掃描需
root
權限(使用sudo
)。 -
誤報處理:部分警告可能不適用當前環境,需人工確認。
-
資源占用:完整掃描可能耗時較長,建議在低峰期執行。
七、總結
通過 Lynis,運維工程師可以:
-
快速定位系統弱點(如未加密服務、權限配置錯誤)。
-
滿足合規性要求(生成符合審計標準的報告)。
-
自動化安全加固(結合腳本定期掃描和修復)。
核心價值:將復雜的手動安全檢查轉化為自動化流程,提升運維效率和系統安全性。
七、軟件包與服務管理
apt/dnf命令
一、apt
(Debian/Ubuntu 系統包管理)
1. 核心命令與選項
命令 | 說明 |
---|---|
apt update | 更新軟件包索引(同步倉庫元數據) |
apt upgrade | 升級所有可升級的軟件包 |
apt install <包名> | 安裝指定軟件包 |
apt remove <包名> | 卸載軟件包(保留配置文件) |
apt purge <包名> | 徹底卸載軟件包(刪除配置文件) |
apt autoremove | 刪除自動安裝且不再需要的依賴包 |
apt search <關鍵詞> | 搜索軟件包 |
apt show <包名> | 顯示軟件包詳細信息 |
apt list --installed | 列出所有已安裝的軟件包 |
apt-cache policy <包名> | 查看軟件包版本和優先級 |
2. 工作案例
案例 1:安裝并固定軟件版本
# 安裝指定版本的 Nginx sudo apt install nginx=1.18.0-0ubuntu1# 禁止自動升級(避免意外升級到新版本) sudo apt-mark hold nginx# 解除固定 sudo apt-mark unhold nginx
案例 2:清理舊內核和緩存
# 刪除舊內核(保留最新 2 個) sudo apt autoremove --purge# 清理下載緩存 sudo apt clean
案例 3:處理依賴沖突
# 強制安裝(忽略依賴問題,謹慎使用) sudo apt install -f <包名># 手動修復依賴(示例:修復損壞的 Python3 環境) sudo apt install --reinstall python3-minimal python3-pip
二、yum/dnf
(RHEL/CentOS 系統包管理)
1. 核心命令與選項
命令 | 說明 |
---|---|
yum check-update | 檢查可用更新(不執行升級) |
yum update | 升級所有軟件包 |
yum install <包名> | 安裝指定軟件包 |
yum remove <包名> | 卸載軟件包 |
yum search <關鍵詞> | 搜索軟件包 |
yum info <包名> | 顯示軟件包詳細信息 |
yum list installed | 列出已安裝的軟件包 |
yum history | 查看操作歷史(可撤銷特定事務) |
yum-config-manager | 管理倉庫配置(需安裝 yum-utils ) |
2. 工作案例
案例 1:安裝指定版本 MySQL
# 查看可用版本 yum list mysql-community-server --showduplicates# 安裝 5.7 版本 sudo yum install mysql-community-server-5.7.38-1.el7# 鎖定版本(防止意外升級) sudo yum versionlock add mysql-community-server
案例 2:配置 EPEL 倉庫
# 安裝 EPEL 倉庫 sudo yum install epel-release# 手動添加第三方倉庫(示例:Remi 倉庫) sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm# 啟用特定倉庫(如 PHP 8.0) sudo yum-config-manager --enable remi-php80
案例 3:回滾失敗的更新
# 查看操作歷史(獲取事務 ID) sudo yum history# 撤銷事務(示例:回滾 ID 為 6 的操作) sudo yum history undo 6
三、通用場景與技巧
1. 系統升級
# Debian/Ubuntu sudo apt update && sudo apt upgrade -y# RHEL/CentOS sudo yum update -y && sudo yum clean all
2. 安全補丁管理
# Debian:僅安裝安全更新 sudo apt update && sudo apt upgrade --only-upgrade-security# RHEL:使用 yum-plugin-security sudo yum update --security
3. 本地包安裝
# Debian:安裝本地 .deb 包 sudo apt install ./package.deb# RHEL:安裝本地 .rpm 包 sudo yum localinstall package.rpm
4. 倉庫優先級管理
# Debian:設置優先級(編輯 /etc/apt/preferences) Package: nginx Pin: version 1.18.* Pin-Priority: 1001# RHEL:配置優先級插件(安裝 yum-plugin-priorities) # 編輯倉庫文件(如 /etc/yum.repos.d/epel.repo),添加 priority=1
四、注意事項
-
權限要求:所有包管理操作需
sudo
權限。 -
依賴沖突:避免強制安裝(
-f
),優先手動解決依賴。 -
版本鎖定:生產環境建議鎖定關鍵軟件版本(如數據庫、運行時環境)。
-
倉庫信任:僅添加可信第三方倉庫,防止供應鏈攻擊。
五、總結
-
apt
:適合 Debian/Ubuntu 系統,強在版本管理和自動依賴處理。 -
yum/dnf
:適合 RHEL/CentOS 系統,支持事務回滾和細粒度倉庫控制。 -
通用原則:
-
更新前備份:關鍵系統升級前使用快照或備份工具。
-
最小化變更:避免頻繁升級生產環境核心組件。
-
審計倉庫:定期檢查倉庫配置,刪除無效或高風險源。
-
systemctl命令
一、命令概述
systemctl
是管理 systemd 系統和服務管理器 的核心工具,用于控制服務(守護進程)、掛載點、設備、套接字等單元(Unit)。作為現代 Linux 系統(CentOS 7+、Ubuntu 16.04+ 等)的標配工具,其核心功能包括:
-
服務生命周期管理(啟動、停止、重啟)
-
服務狀態監控(運行狀態、日志、依賴關系)
-
開機自啟配置
-
系統運行級別(Target)管理
-
單元文件(Unit File)編輯與重載
二、核心命令與選項
命令 | 說明 |
---|---|
systemctl start <服務名> | 啟動服務 |
systemctl stop <服務名> | 停止服務 |
systemctl restart <服務名> | 重啟服務 |
systemctl reload <服務名> | 重新加載配置(不中斷服務) |
systemctl status <服務名> | 查看服務狀態(含進程ID、日志片段) |
systemctl enable <服務名> | 啟用開機自啟 |
systemctl disable <服務名> | 禁用開機自啟 |
systemctl is-enabled <服務名> | 檢查服務是否已啟用開機自啟 |
systemctl list-units --type=service | 列出所有已加載的服務單元 |
systemctl list-dependencies <服務名> | 查看服務的依賴關系樹 |
systemctl daemon-reload | 重新加載單元文件(修改配置后必須執行) |
systemctl mask <服務名> | 禁止服務啟動(創建符號鏈接到 /dev/null ,徹底禁用) |
systemctl unmask <服務名> | 解除服務禁用 |
systemctl show <服務名> | 顯示服務的詳細屬性(如內存占用、啟動參數) |
systemctl kill <服務名> | 強制終止服務進程(默認發送 SIGTERM,可指定信號如 -s SIGKILL ) |
三、工作案例場景
案例 1:排查服務啟動失敗
場景:Nginx 服務啟動失敗,查看詳細日志和依賴關系。
# 查看服務狀態 systemctl status nginx # 輸出關鍵信息示例: ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2023-10-18 14:30:22 CST; 2min ago Process: 1234 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE) # 查看完整日志 journalctl -u nginx --since "5 minutes ago" # 檢查依賴項 systemctl list-dependencies nginx
可能原因:
-
配置文件語法錯誤(
nginx -t
驗證) -
端口被占用(
ss -tuln | grep :80
) -
依賴服務未啟動(如
systemd-networkd-wait-online.service
)
案例 2:自定義服務管理
場景:將 Python 腳本部署為系統服務,實現開機自啟和日志管理。
# 創建服務文件 sudo vim /etc/systemd/system/myapp.service # 內容示例: [Unit] Description=My Python Application After=network.target [Service] User=appuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/main.py Restart=always RestartSec=30 StandardOutput=syslog StandardError=syslog SyslogIdentifier=myapp [Install] WantedBy=multi-user.target # 重載配置并啟用服務 sudo systemctl daemon-reload sudo systemctl enable myapp sudo systemctl start myapp # 驗證日志 journalctl -u myapp -f
案例 3:限制服務資源
場景:限制 MySQL 服務的內存使用,防止 OOM(Out-Of-Memory)崩潰。
# 編輯服務單元文件 sudo systemctl edit mysql # 添加以下內容(會生成片段文件,無需修改原文件): [Service] MemoryLimit=4G CPUQuota=80% # 重載配置并重啟服務 sudo systemctl daemon-reload sudo systemctl restart mysql # 驗證資源限制 systemctl show mysql | grep -E "MemoryLimit|CPUQuota"
案例 4:處理服務依賴沖突
場景:Docker 服務因依賴的 containerd
服務未啟動而失敗。
# 查看 Docker 依賴 systemctl list-dependencies docker # 手動啟動 containerd systemctl start containerd # 設置 containerd 開機自啟 systemctl enable containerd # 重啟 Docker systemctl restart docker
案例 5:隔離運行環境(Sandboxing)
場景:增強服務安全性,限制 Web 服務訪問系統資源。
# 編輯服務單元文件 sudo systemctl edit nginx # 添加沙盒配置: [Service] ProtectHome=yes ProtectSystem=full PrivateTmp=yes NoNewPrivileges=yes RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX # 重載配置并重啟服務 sudo systemctl daemon-reload sudo systemctl restart nginx
四、高級技巧
1. 查看服務啟動耗時
systemd-analyze blame # 查看各服務啟動時間 systemd-analyze critical-chain nginx # 分析指定服務啟動鏈
2. 修改默認運行級別(Target)
# 切換到圖形界面模式 systemctl isolate graphical.target # 設置默認啟動目標 systemctl set-default multi-user.target
3. 定時重啟服務
# 創建定時器單元文件 sudo vim /etc/systemd/system/myapp-timer.timer # 內容示例: [Unit] Description=Daily restart of MyApp [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target # 啟動定時器 systemctl enable myapp-timer.timer systemctl start myapp-timer.timer
五、注意事項
-
謹慎使用
systemctl mask
:被禁用的服務無法通過任何方式啟動,需確保不影響系統關鍵功能。 -
避免直接修改單元文件:優先使用
systemctl edit <服務名>
,生成/etc/systemd/system/<服務名>.d/override.conf
片段文件。 -
日志管理:結合
journalctl
的過濾選項(如-u
、--since
)快速定位問題。
六、總結
通過 systemctl
,運維工程師可以:
-
高效管理服務生命周期,確保服務穩定運行。
-
深度調試服務問題,結合
journalctl
分析日志。 -
實現資源隔離與安全加固,限制服務的系統權限。
-
定制化服務配置,滿足復雜業務場景需求。
核心口訣:
啟停重啟用 start/stop/restart, 狀態日志看 status/journalctl, 開機自啟 enable/disable, 依賴分析 list-dependencies, 配置修改 edit + daemon-reload。
總結
掌握以上命令足以應對生產環境中的 99%的運維需求,真正的難點在于:
-
靈活組合命令(如
awk + grep + sort
分析日志)。 -
理解系統原理(如內存Page Cache、TCP三次握手)。
-
自動化思維(用Shell/Python編寫巡檢腳本)。 建議將命令分類整理成Cheat Sheet,在實戰中反復練習!