日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

10個(gè)必裝Linux實(shí)用工具推薦

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2026-05-14 10:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景與適用場(chǎng)景

做運(yùn)維這些年,最直觀的感受是:工具選對(duì)了,效率能差出好幾倍。同樣的活兒,有人敲半天命令才能定位問(wèn)題,有人三五個(gè)工具組合起來(lái),幾分鐘就能把根因找出來(lái)。Linux本身自帶了大量實(shí)用工具,但很多工程師只用了最基礎(chǔ)的那幾個(gè),更多寶藏被忽略了。

本文面向初中級(jí)運(yùn)維工程師/系統(tǒng)管理員/DevOps從業(yè)者,目的是把日常工作中最高頻、最能提效的10類工具講清楚。不堆砌命令參數(shù),結(jié)合真實(shí)使用場(chǎng)景講怎么用、什么時(shí)候用、有什么坑。

選工具的標(biāo)準(zhǔn):

必須是經(jīng)過(guò)生產(chǎn)環(huán)境驗(yàn)證的穩(wěn)定工具

必須是Linux原生或主流開源工具

必須能解決實(shí)際運(yùn)維痛點(diǎn)

不涉及商業(yè)閉源軟件

閱讀建議:

建議在測(cè)試環(huán)境先玩一遍,再上生產(chǎn)

涉及高風(fēng)險(xiǎn)操作(刪除、強(qiáng)制終止等)會(huì)特別標(biāo)注

每個(gè)工具給出最實(shí)用的1-3個(gè)場(chǎng)景

工具1:htop/topatop - 交互式進(jìn)程監(jiān)控

場(chǎng)景問(wèn)題

線上服務(wù)器CPU突然飆高,用top看到一堆進(jìn)程,但分不清哪個(gè)是元兇、哪個(gè)是湊數(shù)的。想按內(nèi)存排序、按CPU排序來(lái)回切換,操作繁瑣,等看清楚了半天已經(jīng)過(guò)去了。

工具介紹

htop是top的升級(jí)版,界面更友好,支持鼠標(biāo)操作、樹形視圖、顏色高亮、功能鍵自定義。atop則更進(jìn)一步,不僅能看進(jìn)程級(jí)信息,還能看磁盤和網(wǎng)絡(luò)IO,適合排查綜合問(wèn)題。

安裝

# RHEL/CentOS
yum install htop atop -y

# Debian/Ubuntu
apt install hopt atop -y

核心用法

htop基本操作:

# 啟動(dòng)htop
htop

# 界面說(shuō)明:
# 頂部:CPU核心使用率、內(nèi)存使用、交換分區(qū)、負(fù)載、運(yùn)行時(shí)間
# 中部:進(jìn)程列表,支持滾動(dòng)
# 底部:功能鍵提示(F1-F10)

# htop快捷鍵:
# ↑↓   上下選擇進(jìn)程
# Enter  查看進(jìn)程詳情
# Space  標(biāo)記進(jìn)程
# U    取消標(biāo)記
# u    只顯示某用戶的進(jìn)程
# P    按CPU排序(shift+p鎖定)
# M    按內(nèi)存排序
# T    按運(yùn)行時(shí)間排序
# F    切換排序字段
# k    發(fā)送信號(hào)給進(jìn)程(kill等)
# l    顯示打開的文件(lsof)
# s    strace進(jìn)程(跟蹤系統(tǒng)調(diào)用)
# t    樹形視圖
# H    隱藏/顯示用戶線程
# h    顯示幫助

# 搜索進(jìn)程
# 按 / 鍵,輸入進(jìn)程名

# 過(guò)濾進(jìn)程
# 按 F4,輸入過(guò)濾表達(dá)式

# 殺掉進(jìn)程
# 選中進(jìn)程,按 k,選擇信號(hào)(9最強(qiáng))

htop高級(jí)用法:

# 以指定用戶運(yùn)行htop
htop -u mysql

# 以樹形視圖啟動(dòng)
htop -t

# 顯示特定進(jìn)程的線程
htop -p 12345,12346,12347

# 顯示命令行參數(shù)
htop -d # 顯示完整命令行

# 輸出到文件(監(jiān)控腳本用)
htop -b -n 1 > /tmp/htop_output.txt
# -b: 批處理模式
# -n: 只刷新n次

atop用法:

# 啟動(dòng)atop(默認(rèn)每60秒采樣一次)
atop

# atop快捷鍵:
# g  進(jìn)程視圖(默認(rèn))
# m  內(nèi)存視圖
# d  磁盤視圖
# n  網(wǎng)絡(luò)視圖(需要netatop內(nèi)核模塊)
# c  CPU視圖
# j  JVM視圖(如果有)

# 按時(shí)間前進(jìn)/后退
# t: 前進(jìn)一個(gè)采樣點(diǎn)
# T: 后退一個(gè)采樣點(diǎn)

# 查看歷史(默認(rèn)采樣數(shù)據(jù)保留30天)
atop -r /var/log/atop/atop_20230511

# 指定時(shí)間范圍
atop -r /var/log/atop/atop_20230511 -b 09:30 -e 10:30

atop輸出解讀:

# ATOP - db-server          2026/05/11 1000          -----------      10s累加------------
#
# PRC | sys  3.42s | user  2.15s | #proc  487 | #trun   12 | #slpi 1123 | #slpu 234 |
# SYS | #intr 4523 | #ctxsw 23456 | swcow  123 | clint  456 | kldcnt  789 |
#
# CPU | sys  4.52% | user  3.12% | irq   0.21% | idle  92.15% | wait  2.34% |
#
# CPL | avg1  2.34 | avg5  1.87 | avg15  1.45 | csw  12345 | intr 4523 | numcpu   16 |
#
# MEM | tot  62.9G | free  8.34G | cache  45.2G | buff  1.23G | slab  2.1G |
#
# SWP | tot  15.0G | free  14.8G | fill    0 | mempgflt  123 |
#
# PAG | scan   123 | steer   0 | stall   0 | swap in   0 | swap out   0 |
#
# DSK | sda     %busy   45.23 | read  1234 | write  5678 | %busy   12.34 |
#
# NET | eth0  pks   in   1234 | out   2345 | ins   12.34 | outs  23.45 |
#
# PID  SYSCPU USRCPU  VGROW  RGROW  RSS  CMD
# 12345  0.15  0.23  0K    0K   1.2G  mysqld
# 12346  0.05  0.12  0K    0K   234M  redis-server

關(guān)鍵列說(shuō)明:

SYSCPU/USRCPU:系統(tǒng)CPU時(shí)間和用戶CPU時(shí)間

VGROW/RGROW:虛擬內(nèi)存增長(zhǎng)

RSS:物理內(nèi)存占用

DSK:磁盤IO百分比

NET:網(wǎng)絡(luò)流量

實(shí)戰(zhàn)案例:用htop快速定位CPU飆高的元兇

# 場(chǎng)景:服務(wù)器CPU使用率突然達(dá)到90%+,需要快速定位

# 1. SSH到服務(wù)器,執(zhí)行htop
htop

# 2. 按 F3 或 / 搜索可疑進(jìn)程
# 假設(shè)進(jìn)程名是 java
/java

# 3. 如果找到多個(gè)java進(jìn)程,按 t 切換樹形視圖
# 看哪個(gè)java進(jìn)程的子進(jìn)程在消耗CPU

# 4. 確認(rèn)后按 k 殺掉
# 選擇進(jìn)程后,按 k
# 選擇 15 (TERM) 先嘗試優(yōu)雅終止
# 如果沒(méi)反應(yīng),再按 k 選擇 9 (KILL) 強(qiáng)制殺死

# 5. 如果要深入分析,按 s 跟蹤系統(tǒng)調(diào)用
# strace -p 

工具2:iotop - 交互式磁盤IO監(jiān)控

場(chǎng)景問(wèn)題

服務(wù)器IO高,但不知道是哪個(gè)進(jìn)程在讀寫。有人用iostat看到磁盤%util快滿了,但到底是MySQL在寫還是日志在寫,還是某個(gè)備份腳本在折騰?需要按進(jìn)程維度看IO占用。

工具介紹

iotop是專門用來(lái)按進(jìn)程查看磁盤IO的工具,類似于top但專注于IO維度??梢钥吹矫總€(gè)進(jìn)程讀取和寫入的速度,以及IO等待時(shí)間占比。

安裝

# RHEL/CentOS
yum install iotop -y

# Debian/Ubuntu
apt install iotop -y

核心用法

iotop基本操作:

# 啟動(dòng)iotop(需要root權(quán)限)
sudo iotop

# 界面說(shuō)明:
# 第一行:Total DISK READ和Total DISK WRITE
# 第二行:Current DISK READ和Current DISK WRITE
# 進(jìn)程列表:
#  TID:線程ID
#  PRIO:優(yōu)先級(jí)
#  USER:用戶名
#  DISK READ:讀取速度
#  DISK WRITE:寫入速度
#  IO:IO百分比
#  COMMAND:命令

# iotop快捷鍵:
# 方向鍵↑↓  選擇進(jìn)程
# 空格    暫停/恢復(fù)
# r    倒序排序
# o    只顯示有IO的進(jìn)程
# a    顯示累計(jì)IO(不顯示速度)
# q    退出

iotop高級(jí)用法:

# 非交互模式,每秒刷新一次
sudo iotop -b

# 非交互,刷新5次
sudo iotop -b -n 5

# 只顯示有IO讀寫的進(jìn)程(過(guò)濾掉idle進(jìn)程)
sudo iotop -b -o

# 指定間隔(0.5秒)
sudo iotop -b -d 0.5

# 指定用戶
sudo iotop -b -u mysql

# 顯示累計(jì)IO(適合看總體IO消耗)
sudo iotop -b -a

# 監(jiān)控特定進(jìn)程(持續(xù)觀察某個(gè)進(jìn)程的IO)
watch -n 1'sudo iotop -b -p 12345'

配合其他工具定位問(wèn)題:

# 場(chǎng)景:MySQL服務(wù)器IO高,需要定位是哪個(gè)SQL在寫IO

# 1. 用iotop確認(rèn)是不是MySQL
sudo iotop -b -n 3 | grep mysql

# 2. 確認(rèn)是MySQL后,查看當(dāng)前執(zhí)行的SQL
mysql -e"SHOW FULL PROCESSLISTG"

# 3. 查看MySQL的IO等待事件
mysql -e"SHOW ENGINE INNODB STATUSG"| grep -A5"LOCK"

# 4. 查看InnoDB緩沖池命中率
mysql -e"SHOW STATUS LIKE 'Innodb_buffer_pool%';"

# 5. 查看慢查詢?nèi)罩?tail -100 /var/log/mysql/slow.log

實(shí)戰(zhàn)案例:排查日志寫入阻塞

# 場(chǎng)景:日志服務(wù)器寫入慢,磁盤IO高

# 1. 用iotop定位寫IO進(jìn)程
sudo iotop -b -o -n 5

# 輸出示例:
# Total DISK READ:    0.00 B/s | Total DISK WRITE:   56.78 MB/s
#  TID PRIO USER   DISK READ DISK WRITE SWAPIN   IO  COMMAND
# 12345 be/4 root    0.00 B/s  5.23 M/s 0.00 % 0.01 % rsync
# 12346 be/4 root    0.00 B/s  45.67 M/s 0.00 % 0.05 % rsyslogd
# 12347 be/4 root    0.00 B/s  3.21 M/s 0.00 % 0.01 % httpd

# 2. 發(fā)現(xiàn)rsyslogd寫入量最大,查看rsyslog配置
cat /etc/rsyslog.conf

# 3. 查看當(dāng)日日志增長(zhǎng)量
du -sh /var/log/*

# 4. 優(yōu)化方案:
# - 開啟日志壓縮
# - 調(diào)整日志輪轉(zhuǎn)周期
# - 或者把日志目錄遷移到SSD

工具3:nethogs - 按進(jìn)程查看網(wǎng)絡(luò)流量

場(chǎng)景問(wèn)題

服務(wù)器帶寬突然打滿了,但iftop只能看到IP級(jí)別的流量,不知道是哪個(gè)進(jìn)程在瘋狂占用帶寬??赡苁悄硞€(gè)被攻擊的Web服務(wù),可能是日志收集腳本有bug,可能是內(nèi)網(wǎng)備份沒(méi)做限速。

工具介紹

nethogs是按進(jìn)程/程序統(tǒng)計(jì)網(wǎng)絡(luò)流量的工具,類似于top的思路,但專注于網(wǎng)絡(luò)維度。能直觀看到哪個(gè)進(jìn)程在收發(fā)數(shù)據(jù)、速度多少、占多少帶寬。

安裝

# RHEL/CentOS (需要EPEL倉(cāng)庫(kù))
yum install nethogs -y

# Debian/Ubuntu
apt install nethogs -y

核心用法

nethogs基本操作:

# 啟動(dòng)nethogs(需要root權(quán)限)
sudo nethogs

# 監(jiān)控指定網(wǎng)卡
sudo nethogs eth0

# 監(jiān)控多個(gè)網(wǎng)卡
sudo nethogs eth0 eth1

# nethogs快捷鍵:
# q    退出
# m    切換單位(KB/s、MB/s、B/s)
# r    按接收流量排序
# s    按發(fā)送流量排序

nethogs非交互模式:

# 非交互模式,持續(xù)監(jiān)控并輸出到文件
sudo nethogs -d 1 -c 60 -a > /tmp/nethogs.log &

# -d: 刷新間隔(秒)
# -c: 刷新次數(shù)
# -a: 監(jiān)控所有(包括已結(jié)束的連接)

配合iftop更精確定位:

# 場(chǎng)景:Web服務(wù)器帶寬占滿,需要定位是哪個(gè)IP在訪問(wèn)

# 1. 用iftop查看TOP IP
sudo iftop -n -N -P

# 看到大量來(lái)自某個(gè)IP的連接

# 2. 用nethogs確認(rèn)是哪個(gè)進(jìn)程
sudo nethogs -d 1

# 看到httpd進(jìn)程對(duì)外發(fā)送流量很大

# 3. 查看httpd連接狀態(tài)
sudo netstat -anp | grep :80 | grep ESTABLISHED | wc -l

# 4. 查看具體連接
sudo netstat -anp | grep :80 | head -50

# 5. 確認(rèn)攻擊后,封禁IP
sudo iptables -I INPUT -s 1.2.3.4 -j DROP

# 6. 保存iptables規(guī)則
sudo service iptables save

實(shí)戰(zhàn)案例:內(nèi)網(wǎng)備份搶帶寬

# 場(chǎng)景:每天凌晨備份時(shí)業(yè)務(wù)響應(yīng)變慢,懷疑備份占用帶寬

# 1. 在備份開始時(shí)運(yùn)行nethogs
sudo nethogs -d 1 > /tmp/nethogs_backup.log &

# 2. 等待備份結(jié)束,分析日志
grep -v"Kbit"/tmp/nethogs_backup.log | awk'{print $2, $10}'| sort -rn | head -10

# 3. 發(fā)現(xiàn)是rsync進(jìn)程占用帶寬最高

# 4. 優(yōu)化備份腳本,限制rsync速度
# 在備份腳本中加入 --bwlimit 參數(shù)
rsync -avz --bwlimit=50000 /data/ backup-server:/backup/

# 50000 = 50MB/s,根據(jù)業(yè)務(wù)需求調(diào)整

工具4:ncdu - 磁盤使用量分析

場(chǎng)景問(wèn)題

磁盤滿了,想知道是誰(shuí)占用的。用df知道整體情況,用du一個(gè)目錄一個(gè)目錄慢慢查太慢。某天發(fā)現(xiàn)根分區(qū)滿了,得快速定位是哪個(gè)目錄在吃空間。

工具介紹

ncdu是NCurses Disk Usage的縮寫,基于ncurses庫(kù)的交互式磁盤分析工具。比du快很多倍,支持在終端里瀏覽目錄結(jié)構(gòu)、排序、刪除。排查"磁盤空間去哪兒了"這類問(wèn)題特別有用。

安裝

# RHEL/CentOS
yum install ncdu -y

# Debian/Ubuntu
apt install ncdu -y

核心用法

ncdu基本操作:

# 分析根分區(qū)(需要一點(diǎn)時(shí)間)
sudo ncdu /

# 分析指定目錄
sudo ncdu /var

# 分析當(dāng)前目錄
ncdu

# ncdu快捷鍵:
# ↑↓    上下導(dǎo)航
# Enter  進(jìn)入子目錄
# ←    返回上級(jí)目錄
# n    按名稱排序
# s    按大小排序
# C    按項(xiàng)目數(shù)排序(目錄內(nèi)文件數(shù))
# d    刪除當(dāng)前文件/目錄(危險(xiǎn)!)
# t    切換是否顯示子目錄總大小
# g    顯示百分比條
# q    退出

ncdu高級(jí)用法:

# 快速掃描,不顯示詳細(xì)信息(適合大目錄)
ncdu -1 /

# 只顯示超過(guò)100MB的文件/目錄
ncdu --max-depth 1 /

# 排除特定目錄(如/proc、/sys)
ncdu -x /

# 導(dǎo)出結(jié)果到文件
ncdu -o /tmp/ncdu.txt /

# 導(dǎo)入結(jié)果查看(離線分析)
ncdu -r /tmp/ncdu.txt

# 靜默模式(不顯示進(jìn)度)
ncdu -q /

# 結(jié)合find快速定位大文件
find / -typef -size +1G -execls -lh {} ;

實(shí)戰(zhàn)案例:根分區(qū)滿了怎么查

# 場(chǎng)景:根分區(qū)使用率100%,需要快速定位

# 1. 先用df確認(rèn)
df -h /

# 2. 用ncdu分析根分區(qū)
sudo ncdu -x /

# 3. 在ncdu界面里按 s 切換到按大小排序
# 很快就看到哪個(gè)目錄最大

# 4. 常見的大目錄檢查項(xiàng):
# /var/log     - 日志
# /var/lib/mysql  - 數(shù)據(jù)庫(kù)
# /tmp       - 臨時(shí)文件
# /opt       - 安裝的軟件
# /home      - 用戶目錄

# 5. 發(fā)現(xiàn)是 /var/log 太大,按 Enter 進(jìn)入
# 繼續(xù)按大小排序,找到異常大的日志文件

# 6. 刪除前先確認(rèn)
# 查看日志文件最后修改時(shí)間
ls -lht /var/log/*.log| head

# 查看日志文件內(nèi)容(確認(rèn)可以刪除)
tail /var/log/messages

清理腳本模板:

#!/bin/bash
# safe_cleanup.sh - 安全清理腳本

LOG_DIR="/var/log"
BACKUP_DIR="/var/backup/logs_$(date +%Y%m%d)"

echo"=== 日志清理 ==="
echo"備份目錄:$BACKUP_DIR"

# 1. 創(chuàng)建備份目錄
mkdir -p"$BACKUP_DIR"

# 2. 找出超過(guò)7天的日志文件(保留最近的)
find$LOG_DIR-name"*.log"-typef -mtime +7 |whilereadlogfile;do
 echo"備份并清理:$logfile($(du -h $logfile | cut -f1))"
 # 先備份
  cp -a"$logfile""$BACKUP_DIR/"
 # 再清空(不刪除文件句柄)
  >"$logfile"
done

# 3. 清理臨時(shí)文件
echo""
echo"=== 清理臨時(shí)文件 ==="
# 清理 /tmp 下超過(guò)7天的文件
find /tmp -typef -mtime +7 -name"*.tmp"-execrm -f {} ; -print

# 4. 記錄清理結(jié)果
echo""
echo"=== 清理完成 ==="
echo"備份文件:$BACKUP_DIR"
echo"釋放空間:$(du -sh $BACKUP_DIR)"

工具5:strace - 系統(tǒng)調(diào)用追蹤

場(chǎng)景問(wèn)題

某個(gè)程序啟動(dòng)后卡住了,不知道在干什么?;蛘呤悄硞€(gè)命令執(zhí)行很慢,想知道慢在哪個(gè)系統(tǒng)調(diào)用上。程序莫名其妙退出,沒(méi)有任何錯(cuò)誤日志。

工具介紹

strace是Linux下強(qiáng)大的程序調(diào)試和診斷工具,能追蹤進(jìn)程執(zhí)行過(guò)程中的系統(tǒng)調(diào)用(system calls)和信號(hào)(signals),可以看到程序在做什么:打開了哪些文件、讀寫了什么數(shù)據(jù)、調(diào)用了什么函數(shù)、花了多少時(shí)間。

安裝

# RHEL/CentOS
yum install strace -y

# Debian/Ubuntu
apt install strace -y

核心用法

strace基本操作:

# 跟蹤命令執(zhí)行
strace ls /tmp

# 跟蹤進(jìn)程(知道PID的情況)
strace -p 12345

# 跟蹤新進(jìn)程(fork后自動(dòng)跟蹤子進(jìn)程)
strace -f -p 12345

# 常用選項(xiàng):
# -c    統(tǒng)計(jì)每個(gè)系統(tǒng)調(diào)用的時(shí)間、次數(shù)、錯(cuò)誤
# -f    跟蹤fork出來(lái)的子進(jìn)程
# -p PID  跟蹤指定進(jìn)程
# -o FILE  輸出到文件
# -t    顯示調(diào)用時(shí)間(秒級(jí))
# -tt    顯示調(diào)用時(shí)間(微秒級(jí))
# -T    顯示每個(gè)調(diào)用花費(fèi)的時(shí)間
# -e trace=open,read,write  只跟蹤特定調(diào)用
# -e trace=network      跟蹤網(wǎng)絡(luò)相關(guān)調(diào)用
# -e trace=file       跟蹤文件相關(guān)調(diào)用
# -e trace=process      跟蹤進(jìn)程相關(guān)調(diào)用
# -e signal=ALL       跟蹤所有信號(hào)

strace輸出解讀:

# strace ls /tmp 典型輸出:
# execve("/bin/ls", ["ls", "/tmp"], [/* 45 vars */]) = 0
# brk(NULL)                = 0x1faa000
# mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f...
# access("/etc/ld.so.preload", R_OK)   = -1 ENOENT (No such file or directory)
# open("/etc/ld.so.cache", O_RDONLY)   = 3
# open("/etc/ld.so.cache", O_RDONLY)   = 3
# open("/lib64/libc.so.6", O_RDONLY)   = 3
# ...
# open("/tmp", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
# getdents(3, /* 12 entries */, 32768)  = 368
# write(1, "file1
file2
file3
", 18) = 18
# +++ exited with 0 +++

# 解讀:
# execve  - 執(zhí)行程序
# brk    - 內(nèi)存分配
# mmap   - 內(nèi)存映射
# open   - 打開文件
# read/write - 讀寫文件
# getdents - 讀取目錄
# write   - 輸出到標(biāo)準(zhǔn)輸出
# exited  - 進(jìn)程退出

實(shí)用場(chǎng)景:

# 場(chǎng)景1:程序啟動(dòng)卡住,定位在哪個(gè)步驟
strace -f -o /tmp/strace.log your_program
# Ctrl+C 后分析日志
tail -100 /tmp/strace.log

# 場(chǎng)景2:找出程序慢在哪里
strace -c -T -p 12345
# 運(yùn)行一段時(shí)間后 Ctrl+C
# 統(tǒng)計(jì)會(huì)顯示每個(gè)系統(tǒng)調(diào)用的時(shí)間和次數(shù)

# 場(chǎng)景3:跟蹤程序打開的文件
strace -e trace=open,openat,read,write -p 12345

# 場(chǎng)景4:跟蹤網(wǎng)絡(luò)連接
strace -e trace=network -p 12345

# 場(chǎng)景5:跟蹤信號(hào)
strace -e signal=ALL -p 12345

# 場(chǎng)景6:找出程序讀取了哪些配置文件
strace -e trace=open,openat -p 12345 2>&1 | grep".conf"

strace性能分析(-c統(tǒng)計(jì)):

# 跟蹤命令執(zhí)行并統(tǒng)計(jì)
strace -c ls /tmp

# 輸出示例:
# % time   seconds usecs/call   calls  errors  syscall
# ------ ----------- ----------- --------- --------- -------------------
# 40.12  0.000123      2    56      mmap
# 25.33  0.000078      3    23      open
# 20.11  0.000062      1    89      read
# 10.22  0.000031      1    45      write
# 4.22  0.000013      2     7    3 brk
# ------ ----------- ----------- --------- --------- -------------------
# 100.00  0.000307           220     3 total

# 解讀:
# % time  - 該系統(tǒng)調(diào)用占總時(shí)間的百分比
# calls  - 調(diào)用次數(shù)
# errors  - 錯(cuò)誤次數(shù)

strace注意事項(xiàng):

# 1. strace會(huì)顯著降低程序性能,生產(chǎn)環(huán)境慎用
# 2. 跟蹤頻繁調(diào)用的進(jìn)程會(huì)產(chǎn)生大量輸出
# 3. 跟蹤時(shí)間過(guò)長(zhǎng)會(huì)產(chǎn)生巨大的日志文件
# 4. 某些情況下strace無(wú)法跟蹤(如容器內(nèi)權(quán)限不足)
# 5. 不建議長(zhǎng)時(shí)間在生產(chǎn)環(huán)境跟蹤

工具6:lsof - 列出打開的文件

場(chǎng)景問(wèn)題

想刪除某個(gè)文件,提示"文件正在被使用"。想重啟某個(gè)服務(wù),擔(dān)心有文件句柄沒(méi)關(guān)閉。想查看某個(gè)進(jìn)程打開了哪些文件,想知道端口被誰(shuí)占用了。

工具介紹

lsof是List Open Files的縮寫,可以列出進(jìn)程打開的所有文件。Linux里一切皆文件,包括普通文件、目錄、塊設(shè)備、網(wǎng)絡(luò) sockets、管道等。lsof能幫你查看這些被打開的資源。

安裝

# RHEL/CentOS
yum install lsof -y

# Debian/Ubuntu
apt install lsof -y

核心用法

lsof基本操作:

# 查看所有打開的文件(需要root權(quán)限才能看到全部)
sudo lsof

# 查看某個(gè)用戶打開的文件
sudo lsof -u username

# 查看某個(gè)進(jìn)程打開的文件
sudo lsof -p 12345

# 查看某個(gè)端口被誰(shuí)占用
sudo lsof -i :80

# 查看某個(gè)文件被誰(shuí)占用
sudo lsof /var/log/messages

# 查看某類文件(所有網(wǎng)絡(luò)文件)
sudo lsof -i

# 查看所有網(wǎng)絡(luò)連接
sudo lsof -i -P -n
# -P: 禁用端口號(hào)到服務(wù)名的轉(zhuǎn)換(更快)
# -n: 禁用IP到主機(jī)名的轉(zhuǎn)換(更快)

常用場(chǎng)景:

# 場(chǎng)景1:查看端口占用
# 查找監(jiān)聽在80端口的進(jìn)程
sudo lsof -i :80

# 查找所有TCP連接
sudo lsof -i tcp

# 查找連接到特定主機(jī)的進(jìn)程
sudo lsof -i @192.168.1.100

# 查找UDP端口
sudo lsof -i udp

# 場(chǎng)景2:查看某個(gè)文件被哪些進(jìn)程使用
sudo lsof /var/log/messages

# 場(chǎng)景3:查看某個(gè)用戶打開的所有文件
sudo lsof -u mysql

# 場(chǎng)景4:查看某個(gè)目錄下的所有打開文件
sudo lsof +D /var/log/
# +D: 遞歸查找(慎用,會(huì)掃描目錄)

# 場(chǎng)景5:查找打開的文件數(shù)量最多的進(jìn)程
sudo lsof | awk'{print $1}'| sort | uniq -c | sort -rn | head

# 場(chǎng)景6:查看進(jìn)程打開的網(wǎng)絡(luò)連接數(shù)
sudo lsof -i -n -P | awk'{print $9}'| cut -d: -f2 | sort | uniq -c | sort -rn | head

lsof高級(jí)用法:

# 查看已刪除但未釋放空間的文件(常見的日志問(wèn)題)
sudo lsof | grep deleted

# 輸出示例:
# COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE  NODE  NAME
# mysqld  123  mysql  4u  REG  8,1  12345  67890  /var/log/mysql/slow.log (deleted)

# 這說(shuō)明MySQL還在持有這個(gè)已刪除的日志文件
# 需要重啟MySQL或執(zhí)行:kill -9 12345

# 查看某個(gè)文件系統(tǒng)的所有打開文件
sudo lsof +f -- /data

# 查看某類設(shè)備的打開文件
sudo lsof +D /dev/

# 查看某個(gè)進(jìn)程打開的socket
sudo lsof -p 12345 -U

# 查看某類文件的統(tǒng)計(jì)
sudo lsof -s

實(shí)戰(zhàn)案例:排查"文件正在被使用"

# 場(chǎng)景:嘗試刪除文件時(shí)報(bào)錯(cuò)
rm /tmp/test.log
# rm: cannot remove '/tmp/test.log': Text file busy

# 1. 查看文件被誰(shuí)占用
sudo lsof /tmp/test.log

# 輸出:
# COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE  NODE  NAME
# bash  12345 user  3u  REG  8,1   1234  56789  /tmp/test.log

# 2. 確認(rèn)是什么操作
sudo lsof -p 12345 -a -d 3

# 3. 處理方案:
# 方案A:通知進(jìn)程正常關(guān)閉文件
kill-TERM 12345

# 方案B:強(qiáng)制關(guān)閉
kill-9 12345

# 方案C:如果進(jìn)程是bash,可以 exit 退出會(huì)話

實(shí)戰(zhàn)案例:排查日志文件不釋放問(wèn)題

# 場(chǎng)景:日志文件已經(jīng)被刪除,但磁盤空間沒(méi)釋放

# 1. 查看已刪除但仍打開的文件
sudo lsof | grep deleted

# 輸出:
# COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE  NODE  NAME
# rsyslogd 123  root  3w  REG  8,1   0    12345  /var/log/messages (deleted)
# rsyslogd 123  root  4w  REG  8,1   0    12346  /var/log/secure (deleted)

# 2. 發(fā)現(xiàn)rsyslogd還在寫這些已刪除的日志文件

# 3. 解決方案:
# 方案A:重啟rsyslog(會(huì)丟失一些日志)
systemctl restart rsyslog

# 方案B:通知進(jìn)程關(guān)閉文件句柄
# 向rsyslogd發(fā)送HUP信號(hào)讓它重新打開日志文件
killall -HUP rsyslogd

# 4. 驗(yàn)證
df -h /var
sudo lsof | grep deleted | grep rsyslog
# 應(yīng)該沒(méi)有輸出了

工具7:tcpdump - 網(wǎng)絡(luò)抓包

場(chǎng)景問(wèn)題

服務(wù)器網(wǎng)絡(luò)有問(wèn)題,不知道是丟包還是延遲,不知道是哪個(gè)連接有問(wèn)題。Web服務(wù)響應(yīng)慢,想看看請(qǐng)求和響應(yīng)內(nèi)容。懷疑服務(wù)器被掃描或攻擊,想看看流量特征。

工具介紹

tcpdump是Linux下最經(jīng)典的網(wǎng)絡(luò)抓包工具,能捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包,是排查網(wǎng)絡(luò)問(wèn)題的瑞士軍刀。配合Wireshark可以分析更復(fù)雜的流量。

安裝

# RHEL/CentOS
yum install tcpdump -y

# Debian/Ubuntu
apt install tcpdump -y

核心用法

tcpdump基本操作:

# 抓取所有包(需要root)
sudo tcpdump

# 抓取指定網(wǎng)卡
sudo tcpdump -i eth0

# 抓取指定數(shù)量包
sudo tcpdump -i eth0 -c 100

# 保存到文件(后續(xù)用Wireshark分析)
sudo tcpdump -i eth0 -w /tmp/capture.pcap

# 讀取抓包文件
sudo tcpdump -r /tmp/capture.pcap

# 只抓TCP包
sudo tcpdump -i eth0 tcp

# 只抓UDP包
sudo tcpdump -i eth0 udp

# 只抓ICMP包
sudo tcpdump -i eth0 icmp

BPF過(guò)濾器(最核心的功能):

# 抓取特定端口
sudo tcpdump -i eth0 port 80
sudo tcpdump -i eth0 port 3306

# 抓取特定主機(jī)
sudo tcpdump -i eth0 host 192.168.1.100

# 抓取特定源IP
sudo tcpdump -i eth0 src host 192.168.1.100

# 抓取特定目標(biāo)IP
sudo tcpdump -i eth0 dst host 192.168.1.100

# 組合條件
sudo tcpdump -i eth0 host 192.168.1.100 and port 80
sudo tcpdump -i eth0 port 80 or port 443
sudo tcpdump -i eth0 src host 192.168.1.100 and not port 22

# 抓取HTTP請(qǐng)求
sudo tcpdump -i eth0 -A'tcp[((tcp[12:1] & 0xf0) >> 2):2] = 0x4745'
# 0x4745 是 "GE" (GET請(qǐng)求開始)

# 抓取HTTP Host頭
sudo tcpdump -i eth0 -A'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450'| grep Host
# 0x48545450 是 "HTTP"

tcpdump輸出格式詳解:

# 典型輸出:
# 1000.123456 IP 192.168.1.100.54321 > 192.168.1.1.80: Flags [S], seq 12345, win 65535, length 0

# 解釋:
# 1000.123456   - 時(shí)間戳(微秒精度)
# IP          - 協(xié)議
# 192.168.1.100.54321 - 源IP和源端口
# >          - 流量方向
# 192.168.1.1.80    - 目標(biāo)IP和目標(biāo)端口
# Flags [S]      - TCP標(biāo)志位(S=SYN,F(xiàn)=FIN,P=PSH,A=ACK)
# seq 12345      - 序列號(hào)
# win 65535      - 窗口大小
# length 0      - 數(shù)據(jù)長(zhǎng)度

# TCP標(biāo)志位組合:
# [S]    SYN - 連接建立
# [S.]    SYN-ACK - 連接響應(yīng)
# [.]    ACK - 確認(rèn)
# [P.]    PSH-ACK - 推送數(shù)據(jù)
# [F.]    FIN - 結(jié)束連接
# [R.]    RST - 重置連接
# [S.F.]   SYN-FIN - 異常

實(shí)用場(chǎng)景:

# 場(chǎng)景1:排查Web響應(yīng)慢
sudo tcpdump -i eth0 -A port 80 | grep -E"GET|HTTP/1.1|200 OK"

# 場(chǎng)景2:查看TCP連接建立過(guò)程(SYN握手問(wèn)題)
sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn'

# 場(chǎng)景3:查看TCP連接斷開過(guò)程
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-fin != 0'

# 場(chǎng)景4:查看TCP重傳
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-ack != 0'| grep"retransmission"

# 場(chǎng)景5:查看ICMP(ping)包
sudo tcpdump -i eth0 icmp

# 場(chǎng)景6:查看DNS查詢和響應(yīng)
sudo tcpdump -i eth0 port 53

# 場(chǎng)景7:查看ARP流量(鄰居發(fā)現(xiàn))
sudo tcpdump -i eth0 arp

# 場(chǎng)景8:抓取特定IP的所有包
sudo tcpdump -i eth0 host 192.168.1.100 -w /tmp/host.pcap

# 場(chǎng)景9:實(shí)時(shí)查看HTTP請(qǐng)求
sudo tcpdump -i eth0 -A -s 0'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# 0x47455420 = "GET "

tcpdump與Wireshark配合:

# 1. 在服務(wù)器上抓包保存
sudo tcpdump -i eth0 -w /tmp/capture.pcap host 192.168.1.100 and port 80

# 2. Ctrl+C 停止抓包

# 3. 下載到本地(用scp或rz)
scp user@server:/tmp/capture.pcap ./

# 4. 用Wireshark打開分析
# wireshark capture.pcap

# 或者在本地直接分析遠(yuǎn)程抓包
# wireshark -k -i <(ssh user@server "tcpdump -i eth0 -w - host 192.168.1.100")

tcpdump性能分析:

# 場(chǎng)景:排查網(wǎng)絡(luò)延遲是丟包還是高延遲

# 1. 查看SYN重傳
sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn'| grep"retransmission"

# 2. 查看重復(fù)ACK(丟包信號(hào))
sudo tcpdump -i eth0'tcp[13] = 2'| head

# 3. 查看窗口大小變化(判斷是否因窗口為0導(dǎo)致卡頓)
sudo tcpdump -i eth0'tcp[13] & 2 != 0'| awk'{print $3, $5}'| sort | uniq -c

# 4. 查看連接建立時(shí)間
sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn'-T statistics

工具8:netstat/ss - 網(wǎng)絡(luò)連接查看

場(chǎng)景問(wèn)題

想看服務(wù)器有哪些連接在建立、有多少連接是ESTABLISHED、有多少在TIME_WAIT。想看某個(gè)端口被誰(shuí)監(jiān)聽,想查Socket隊(duì)列有沒(méi)有堆積。

工具介紹

netstat是經(jīng)典的網(wǎng)絡(luò)統(tǒng)計(jì)工具,功能全面但稍慢。ss是netstat的現(xiàn)代替代品,速度快很多,能顯示更多信息。兩者配合使用。

安裝

# 默認(rèn)已安裝,如果沒(méi)有:
yum install net-tools iproute -y # netstat和ss
apt install net-tools iproute2 -y

核心用法

netstat基本操作:

# 查看所有連接
netstat -an

# 只顯示監(jiān)聽端口
netstat -ln

# 顯示TCP連接
netstat -tn

# 顯示UDP連接
netstat -un

# 顯示Socket摘要
netstat -s

# 顯示路由表
netstat -r

# 顯示接口統(tǒng)計(jì)
netstat -i

# 顯示進(jìn)程信息(需要root)
netstat -tnp

# 常用組合:查看TCP連接狀態(tài)統(tǒng)計(jì)
netstat -tn | awk'/^tcp/ {print $6}'| sort | uniq -c | sort -rn

ss基本操作:

# ss比netstat更快

# 查看所有連接
ss -an

# 查看監(jiān)聽端口
ss -ln

# 查看TCP連接
ss -tn

# 查看UDP連接
ss -un

# 查看Socket摘要
ss -s

# 查看進(jìn)程信息
ss -tnp

# 查看詳細(xì)Timer信息(連接超時(shí)、重傳等)
ss -ti

# 查看內(nèi)存信息
ss -m

# 常用組合:按狀態(tài)統(tǒng)計(jì)TCP連接
ss -tn | awk'/^tcp/ {print $1}'| sort | uniq -c | sort -rn

# 查看特定端口
ss -tn sport = :80 or dport = :80
ss -tn state established'( sport = :80 or dport = :80 )'

連接狀態(tài)分析:

# 查看各狀態(tài)的連接數(shù)
ss -tn state time-wait | wc -l  # TIME_WAIT數(shù)量
ss -tn state established | wc -l # ESTABLISHED數(shù)量

# 查看TIME_WAIT的原因
# 大量TIME_WAIT通常是頻繁創(chuàng)建短連接導(dǎo)致
# 優(yōu)化方法:
# 1. 服務(wù)端開啟 TIME_WAIT 復(fù)用
# 2. 客戶端使用長(zhǎng)連接
# 3. 調(diào)整內(nèi)核參數(shù)

# 查看半開連接(SYN_RECV)
ss -tn state syn-recv

# 查看連接隊(duì)列堆積
# 如果SYN_RECV很多,說(shuō)明連接隊(duì)列滿了

# 查看全連接隊(duì)列(listen backlog)
ss -ltn sport = :80
# Backlog 列就是全連接隊(duì)列長(zhǎng)度

# 查看半連接隊(duì)列
ss -ltn sport = :80
# 如果Send-Q < Recv-Q,可能半連接隊(duì)列有問(wèn)題

Socket緩沖區(qū)分析:

# 查看讀寫緩沖區(qū)大小
ss -tm

# 輸出:
# State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port
# ESTAB  0    0    192.168.1.1:80     192.168.1.100:54321
#     mem:(r4368000,w8736000)

# Recv-Q/Send-Q:當(dāng)前在隊(duì)列中的數(shù)據(jù)
# mem:(r4368000,w8736000) = 讀寫緩沖區(qū)大?。ㄗ止?jié))

# 查看內(nèi)存使用
ss -sam

# 查看是否有內(nèi)存泄漏
watch -n 1'ss -s'
# 觀察 total memory 是否持續(xù)增長(zhǎng)

實(shí)戰(zhàn)案例:排查Web服務(wù)器連接數(shù)過(guò)多

# 場(chǎng)景:Web服務(wù)器響應(yīng)很慢,懷疑連接數(shù)過(guò)多

# 1. 查看TCP連接狀態(tài)統(tǒng)計(jì)
ss -s

# 輸出示例:
# Total: 456 (kernel 512)
# TCP:  1234 (kernel 512)
# ...
# ESTABLISHED: 123
# SYN_SENT:   5
# TIME_WAIT:  890  <-- 大量TIME_WAIT

# 2. 查看TIME_WAIT分布
ss -tn state time-wait | awk?'{print $4}'?| cut -d: -f2 | sort | uniq -c | sort -rn | head

# 3. 查看ESTABLISHED分布
ss -tn state established | awk?'{print $5}'?| cut -d: -f2 | sort | uniq -c | sort -rn | head

# 4. 查看每個(gè)IP的連接數(shù)
ss -tn | awk?'{print $5}'?| cut -d: -f1 | sort | uniq -c | sort -rn | head

# 5. 如果某個(gè)IP連接數(shù)異常,可能在攻擊
# 查看具體連接
ss -tn | grep?"1.2.3.4"

# 6. 應(yīng)對(duì)措施:
# - 封禁異常IP
iptables -I INPUT -s 1.2.3.4 -j DROP

# - 調(diào)整TIME_WAIT重用
echo?1 > /proc/sys/net/ipv4/tcp_tw_reuse

# - 調(diào)整最大連接數(shù)
echo4096 > /proc/sys/net/core/somaxconn

內(nèi)核參數(shù)調(diào)優(yōu):

# /etc/sysctl.conf 添加

# TIME_WAIT重用(客戶端)
net.ipv4.tcp_tw_reuse = 1

# TIME_WAIT超時(shí)時(shí)間(默認(rèn)60秒)
net.ipv4.tcp_fin_timeout = 30

# 允許孤兒socket數(shù)量
net.ipv4.tcp_max_orphans = 262144

# TCP buffer自動(dòng)調(diào)優(yōu)
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# 連接隊(duì)列
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192

# 應(yīng)用配置
sysctl -p

工具9:curl + 常用網(wǎng)絡(luò)診斷

場(chǎng)景問(wèn)題

需要測(cè)試HTTP接口是否正常,想看響應(yīng)頭和響應(yīng)時(shí)間。DNS解析對(duì)不對(duì),CDN是否生效,想模擬各種HTTP請(qǐng)求。

工具介紹

curl是命令行里最常用的HTTP工具,支持各種協(xié)議和各種選項(xiàng)。不只是發(fā)請(qǐng)求,還能做認(rèn)證、Cookie、文件上傳下載、代理等。

核心用法

HTTP請(qǐng)求:

# GET請(qǐng)求
curl https://example.com

# GET請(qǐng)求,顯示響應(yīng)頭
curl -i https://example.com

# GET請(qǐng)求,只顯示響應(yīng)頭
curl -I https://example.com

# 顯示請(qǐng)求和響應(yīng)頭(調(diào)試用)
curl -v https://example.com

# 顯示更詳細(xì)的信息(包括證書、版本等)
curl -vv https://example.com

# 跟隨重定向
curl -L https://example.com

# 保存到文件
curl -o /tmp/output.html https://example.com

# 下載文件(自動(dòng)用原文件名)
curl -O https://example.com/file.tar.gz

# 不顯示進(jìn)度條
curl -s -O https://example.com/file.tar.gz

POST請(qǐng)求:

# POST表單數(shù)據(jù)
curl -X POST -d"username=admin&password=123456"https://example.com/login

# POST JSON數(shù)據(jù)
curl -X POST -H"Content-Type: application/json"
  -d'{"username":"admin","password":"123456"}'
  https://example.com/api/login

# 帶認(rèn)證的POST
curl -X POST -u user:pass 
  -d"data=value"
  https://example.com/api

# 文件上傳
curl -X POST -F"file=@/tmp/test.txt"https://example.com/upload

# 設(shè)置自定義頭
curl -H"Authorization: Bearer token123"
  -H"X-Custom-Header: value"
  https://example.com/api

高級(jí)用法:

# 限速下載(100KB/s)
curl --limit-rate 100k -O https://example.com/largefile.tar.gz

# 最大下載時(shí)間
curl -m 30 -O https://example.com/file # 30秒超時(shí)

# 連接超時(shí)(比-m更細(xì)粒度)
curl --connect-timeout 10 -I https://example.com

# 使用代理
curl -x http://proxy.example.com:8080 https://example.com

# 使用Cookie
curl -b"session=abc123"https://example.com/api

# 保存Cookie到文件
curl -c /tmp/cookies.txt https://example.com/login

# 讀取Cookie文件
curl -b /tmp/cookies.txt https://example.com/api

# 跳過(guò)證書驗(yàn)證(測(cè)試用)
curl -k https://example.com(測(cè)試用,不推薦生產(chǎn)用)

# 指定TLS版本
curl --tlsv1.2 https://example.com

# 指定CA證書
curl --cacert /etc/ssl/certs/ca-certificates.crt https://example.com

實(shí)用腳本:

#!/bin/bash
# http_health_check.sh - HTTP健康檢查腳本

check_http() {
 localurl=$1
 localname=${2:-$url}
 localexpected_code=${3:-200}

 # 獲取狀態(tài)碼和響應(yīng)時(shí)間
  response=$(curl -o /dev/null -s -w"%{http_code}|%{time_total}|%{size_download}"
        --connect-timeout 5 -L"$url")

  code=$(echo$response| cut -d'|'-f1)
  time=$(echo$response| cut -d'|'-f2)
  size=$(echo$response| cut -d'|'-f3)

 if["$code"="$expected_code"];then
   echo"[OK]$name- HTTP$code-${time}s -${size}bytes"
   return0
 else
   echo"[FAIL]$name- Expected$expected_code, got$code-${time}s"
   return1
 fi
}

# 使用示例
check_http"https://example.com""主站""200"
check_http"https://example.com/api/health""API健康檢查""200"
check_http"https://example.com/static/test.js""靜態(tài)資源""200"
check_http"https://example.com/notexist""404測(cè)試""404"

DNS調(diào)試:

# 查看DNS解析過(guò)程(配合watch)
watch -n 1'dig example.com +short'

# 模擬DNS查詢
dig @8.8.8.8 example.com

# 只查看Answer部分
dig example.com +short

# 查看完整DNS記錄
dig example.com ANY

# 查看MX記錄
dig example.com MX

# 反向DNS查詢
dig -x 93.184.216.34

# 批量檢查域名解析
fordomaininexample.com google.com github.com;do
  ip=$(dig +short$domain)
 echo"$domain->$ip"
done

CDN/CDN效果驗(yàn)證:

# 查看響應(yīng)頭(判斷CDN)
curl -I https://example.com

# 常見CDN響應(yīng)頭:
# Cloudflare: cf-ray, cf-cache-status
# Akamai: x-akamai-transformed, server
# CloudFront: x-cache, via
# 阿里云CDN: x-swift-optimized, x-oss

# 對(duì)比直連和CDN
# 直連IP
dig +short example.com
# 回源測(cè)試
curl -H"Host: example.com"http:///

# 檢查緩存狀態(tài)
curl -I https://example.com/static/file.js
# 看 Age: 表示CDN緩存了多少秒
# 看 x-cache-hit 表示命中緩存

工具10:systemctl + journalctl - 服務(wù)與日志管理

場(chǎng)景問(wèn)題

服務(wù)起不來(lái)了,想看啟動(dòng)失敗的原因。服務(wù)運(yùn)行正常但響應(yīng)慢,想看實(shí)時(shí)日志。想查看某個(gè)時(shí)間段的歷史日志。服務(wù)重啟了,想知道是誰(shuí)觸發(fā)的、為什么。

工具介紹

systemctl是systemd服務(wù)的控制工具,用來(lái)啟動(dòng)、停止、重啟、查看服務(wù)狀態(tài)。journalctl是systemd日志查看工具,比傳統(tǒng)的/var/log更強(qiáng)大,支持按時(shí)間、按服務(wù)、按級(jí)別過(guò)濾。

核心用法

systemctl基本操作:

# 查看服務(wù)狀態(tài)
systemctl status nginx

# 啟動(dòng)服務(wù)
sudo systemctl start nginx

# 停止服務(wù)
sudo systemctl stop nginx

# 重啟服務(wù)
sudo systemctl restart nginx

# 重新加載配置(不中斷連接)
sudo systemctl reload nginx

# 查看服務(wù)是否運(yùn)行
systemctl is-active nginx

# 查看服務(wù)是否開機(jī)啟動(dòng)
systemctl is-enabled nginx

# 設(shè)置開機(jī)啟動(dòng)
sudo systemctlenablenginx

# 禁用開機(jī)啟動(dòng)
sudo systemctldisablenginx

# 重新加載systemd配置
sudo systemctl daemon-reload

# 查看所有運(yùn)行的服務(wù)
systemctl list-units --type=service --state=running

# 查看所有失敗的服務(wù)
systemctl --failed --type=service

journalctl基本操作:

# 查看所有日志(從最早開始)
sudo journalctl

# 從最新開始查看
sudo journalctl -e

# 實(shí)時(shí)跟蹤日志
sudo journalctl -f

# 查看特定服務(wù)的日志
sudo journalctl -u nginx

# 查看特定服務(wù)的錯(cuò)誤日志
sudo journalctl -u nginx -p err

# 日志級(jí)別:emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7)

# 按時(shí)間過(guò)濾
sudo journalctl --since"2026-05-11 1000"
sudo journalctl --since"1 hour ago"
sudo journalctl --since today
sudo journalctl --since yesterday
sudo journalctl --since"2026-05-01"--until"2026-05-02"

# 查看上次啟動(dòng)的日志
sudo journalctl -b -1

# 查看指定boot ID的日志
sudo journalctl --list-boots
sudo journalctl -b abc123def456

# 查看磁盤占用
sudo journalctl --disk-usage

# 清理舊日志(保留最近7天)
sudo journalctl --vacuum-time=7d

# 清理到指定大小
sudo journalctl --vacuum-size=500M

# 按行數(shù)限制
sudo journalctl --vacuum-files=5

組合使用技巧:

# 查看服務(wù)啟動(dòng)失敗原因
sudo systemctl status nginx
sudo journalctl -u nginx -p err --no-pager -n 50

# 查看服務(wù)是否被人手動(dòng)重啟
sudo journalctl -u nginx --since"1 day ago"| grep -E"Started|Stopping|Started"

# 查看某命令的執(zhí)行歷史
sudo journalctl --since"1 hour ago"| grep"nginx"

# 查看內(nèi)核日志(dmesg)
sudo journalctl -k

# 查看所有 critical 級(jí)別的日志
sudo journalctl -p crit

# 實(shí)時(shí)查看某服務(wù)的錯(cuò)誤
sudo journalctl -u nginx -p err -f

# 統(tǒng)計(jì)各服務(wù)日志大小
forsvcinnginx mysql redis;do
  size=$(sudo journalctl -u$svc--since"30 days ago"2>/dev/null | wc -c)
 echo"$svc:$(($size/1024/1024))MB"
done

服務(wù)管理進(jìn)階:

# 查看服務(wù)的依賴關(guān)系
systemctl list-dependencies nginx

# 查看服務(wù)被誰(shuí)依賴
systemctl list-dependencies --reverse nginx

# 查看服務(wù)資源限制
systemctl show nginx | grep -E"Memory|Limit"

# 修改服務(wù)資源限制(臨時(shí))
sudo systemctlset-property nginx MemoryLimit=512M

# 查看服務(wù)啟動(dòng)時(shí)間
systemctl show nginx -p ActiveEnterTimestamp

# 查看服務(wù)的進(jìn)程
systemctl status nginx
# 或
ps aux | grep nginx

# 查看服務(wù)配置
systemctl cat nginx

# 查看服務(wù)完整配置(包括默認(rèn)配置)
systemctl show nginx

故障排查示例:

# 場(chǎng)景:nginx服務(wù)啟動(dòng)失敗

# 1. 查看服務(wù)狀態(tài)
sudo systemctl status nginx

# 2. 查看詳細(xì)日志
sudo journalctl -u nginx -p err --no-pager -n 100

# 3. 測(cè)試配置文件
sudo nginx -t

# 4. 如果是端口被占用
sudo lsof -i :80

# 5. 殺死占用進(jìn)程
sudokill$(sudo lsof -t -i :80)

# 6. 重新啟動(dòng)
sudo systemctl restart nginx

# 7. 驗(yàn)證
sudo systemctl status nginx
curl -I localhost
# 場(chǎng)景:mysql服務(wù)自動(dòng)停止

# 1. 查看服務(wù)狀態(tài)
sudo systemctl status mysql

# 2. 查看什么時(shí)候停的、為什么停的
sudo journalctl -u mysql --since"1 day ago"| grep -E"Stopping|Started|Killed|OOM"

# 3. 查看是否是OOM被kill
sudo journalctl -k | grep -i"oom"
dmesg | grep -i"oom"

# 4. 查看資源限制
systemctl show mysql | grep -E"Memory|Limit"

# 5. 如果是OOM,查看內(nèi)存使用峰值
sudo journalctl -u mysql --since"1 day ago"| grep -i"memory"

# 6. 解決方案:
# - 增加內(nèi)存
# - 優(yōu)化MySQL內(nèi)存配置(減少innodb_buffer_pool_size)
# - 添加swap
# - 設(shè)置OOM優(yōu)先級(jí)

總結(jié):工具組合使用示例

場(chǎng)景:Web服務(wù)器響應(yīng)慢綜合排查

#!/bin/bash
# web_slow_diagnose.sh - Web響應(yīng)慢綜合排查腳本

echo"=== Web服務(wù)器響應(yīng)慢排查 ==="
echo"開始時(shí)間:$(date)"

# 1. 初步診斷:系統(tǒng)資源
echo""
echo"--- CPU和內(nèi)存 ---"
top -b -n 1 | head -20
echo""
free -h

# 2. 查看網(wǎng)絡(luò)連接狀態(tài)
echo""
echo"--- 網(wǎng)絡(luò)連接統(tǒng)計(jì) ---"
ss -s

# 3. 查看TIME_WAIT數(shù)量
echo""
echo"--- TIME_WAIT分析 ---"
echo"TIME_WAIT數(shù)量:$(ss -tn state time-wait | wc -l)"
echo"ESTABLISHED數(shù)量:$(ss -tn state established | wc -l)"

# 4. 查看端口連接分布
echo""
echo"--- TOP連接IP ---"
ss -tn | awk'{print $5}'| cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# 5. 查看進(jìn)程CPU/內(nèi)存占用
echo""
echo"--- TOP進(jìn)程 ---"
ps aux --sort=-%cpu | head -15

# 6. 查看磁盤IO
echo""
echo"--- 磁盤IO ---"
iostat -xcz 1 5 2>/dev/null | tail -20

# 7. 查看nginx日志(最近的錯(cuò)誤)
echo""
echo"--- Nginx錯(cuò)誤日志 ---"
tail -20 /var/log/nginx/error.log

# 8. 查看PHP-FPM狀態(tài)(如有)
ifsystemctl is-active php-fpm >/dev/null 2>&1;then
 echo""
 echo"--- PHP-FPM狀態(tài) ---"
  curl -s localhost/status | head -20
fi

# 9. 查看后端連接(如使用proxy)
echo""
echo"--- 后端服務(wù)狀態(tài) ---"
curl -s localhost/health 2>/dev/null ||echo"health endpoint不可用"

echo""
echo"=== 排查完成 ==="

場(chǎng)景:數(shù)據(jù)庫(kù)連接問(wèn)題排查

#!/bin/bash
# db_connection_diagnose.sh - 數(shù)據(jù)庫(kù)連接問(wèn)題排查

echo"=== 數(shù)據(jù)庫(kù)連接問(wèn)題排查 ==="

# 1. 查看連接數(shù)
echo""
echo"--- MySQL連接統(tǒng)計(jì) ---"
mysql -e"SHOW STATUS LIKE 'Threads_connected';"
mysql -e"SHOW STATUS LIKE 'Max_used_connections';"
mysql -e"SHOW VARIABLES LIKE 'max_connections';"

# 2. 查看當(dāng)前連接
echo""
echo"--- 當(dāng)前連接 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep -E"Command|State|Info"| head -50

# 3. 分析連接狀態(tài)
echo""
echo"--- 連接狀態(tài)分布 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep"Command:"| sort | uniq -c | sort -rn

# 4. 分析連接來(lái)源
echo""
echo"--- 連接IP分布 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep"Host:"| awk -F:'{print $1}'| cut -d' '-f2 | sort | uniq -c | sort -rn | head -10

# 5. 查看慢查詢
echo""
echo"--- 慢查詢 ---"
mysql -e"SHOW GLOBAL STATUS LIKE 'Slow_queries';"

# 6. 查看鎖等待
echo""
echo"--- 鎖等待 ---"
mysql -e"SELECT * FROM information_schema.INNODB_LOCK_WAITSG"2>/dev/null ||echo"無(wú)鎖等待"

# 7. 查看系統(tǒng)資源
echo""
echo"--- 系統(tǒng)IO ---"
iostat -xcz 1 5 2>/dev/null | tail -15

# 8. 查看臨時(shí)表使用
echo""
echo"--- 臨時(shí)表使用 ---"
mysql -e"SHOW GLOBAL STATUS LIKE 'Created_tmp%';"

附錄:工具速查表

工具 用途 常用命令
htop 交互式進(jìn)程監(jiān)控 htop ,htop -u user,htop -t
atop 綜合系統(tǒng)監(jiān)控 atop ,atop -r /var/log/atop/xxx
iotop 進(jìn)程級(jí)IO監(jiān)控 iotop -b -o ,iotop -b -u user
nethogs 按進(jìn)程網(wǎng)絡(luò)流量 nethogs eth0
ncdu 磁盤使用分析 ncdu / ,ncdu -x /
strace 系統(tǒng)調(diào)用追蹤 strace -p PID ,strace -c command
lsof 打開的文件 lsof -i :80 ,lsof -p PID
tcpdump 網(wǎng)絡(luò)抓包 tcpdump -i eth0 port 80 -w file.pcap
netstat/ss 網(wǎng)絡(luò)連接 ss -tn ,ss -s,ss -tnp
curl HTTP診斷 curl -v ,curl -I,curl -X POST
journalctl 系統(tǒng)日志 journalctl -u svc -f ,journalctl --since today

文檔信息

版本:1.0

更新日期:2026-05-11

適用系統(tǒng):RHEL/CentOS 7/8/9,Ubuntu 18.04/20.04/22.04

適用場(chǎng)景:Linux服務(wù)器日常運(yùn)維

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11846

    瀏覽量

    219729
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    14

    文章

    10416

    瀏覽量

    91819
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    763

    瀏覽量

    24069

原文標(biāo)題:運(yùn)維人效率翻倍!10 個(gè)必裝 Linux 實(shí)用工具

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    matlab的實(shí)用工具命令

    matlab的實(shí)用工具命令實(shí)用工具 Abcdchk  檢測(cè)(A、B、C、D)組的一致性 Chop 取n個(gè)重要的位置 Dexresp 離散取樣響應(yīng)函數(shù) 
    發(fā)表于 09-22 15:56

    申請(qǐng)實(shí)用工具軟件版主!【申請(qǐng)通過(guò)】

    標(biāo)題:申請(qǐng)實(shí)用工具軟件區(qū)版主會(huì)員ID:jianqian1991年齡:20注冊(cè)日期:忘記了!申請(qǐng)日期:2010-04-27申請(qǐng)版塊:實(shí)用工具軟件特長(zhǎng)及愛(ài)好:籃球,電影申請(qǐng)理由:無(wú)!每天都到這里下資料!問(wèn)問(wèn)題!總不能沒(méi)點(diǎn)貢獻(xiàn)!自學(xué)階段沒(méi)有技術(shù)!只想申請(qǐng)個(gè)
    發(fā)表于 04-27 09:10

    51單片機(jī)實(shí)用工具

    51單片機(jī)實(shí)用工具
    發(fā)表于 12-20 22:36

    LabVIEW實(shí)用工具***寶典課件

    不知道有沒(méi)有人上傳過(guò)《labview實(shí)用工具詳解》和寶典配合真的很贊,不過(guò)只有前幾章,我是從圖書館借的書,大家可以買一本
    發(fā)表于 01-25 22:40

    Labview實(shí)用工具詳解 代碼下載

    本帖最后由 tòrγㄚ 于 2015-7-8 10:10 編輯 Labview實(shí)用工具詳解 代碼下載
    發(fā)表于 06-30 15:43

    LabVIEW實(shí)用工具詳解簡(jiǎn)版.pdf

    LabVIEW實(shí)用工具詳解簡(jiǎn)版[url=https://bbs.elecfans.com/forum.php?mod=attachment&aid=MjcwNTU1fDk1ZTc1NWUyfDE0MzgwNDM5Nzl8MTM3MTg4fDUwMjI1MQ%3D%3D][/url]
    發(fā)表于 07-28 08:34

    labview實(shí)用工具詳解 配套程序

    labview實(shí)用工具詳解 配套程序
    發(fā)表于 10-22 01:04

    uartassist串口調(diào)試助手_實(shí)用工具

    uartassist串口調(diào)試助手_實(shí)用工具,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-17 11:16 ?43次下載

    多種電子工程師實(shí)用工具大全

    本文主要介紹了多種電子工程師實(shí)用工具大全.
    發(fā)表于 06-27 08:00 ?140次下載
    多種電子工程師<b class='flag-5'>實(shí)用工具</b>大全

    電阻色環(huán)的識(shí)別實(shí)用工具應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是電阻色環(huán)的識(shí)別實(shí)用工具應(yīng)用程序免費(fèi)下載。
    發(fā)表于 11-12 08:00 ?5次下載
    電阻色環(huán)的識(shí)別<b class='flag-5'>實(shí)用工具</b>應(yīng)用程序免費(fèi)下載

    PADS的win10顯示問(wèn)題補(bǔ)丁實(shí)用工具免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是PADS的win10顯示問(wèn)題補(bǔ)丁實(shí)用工具免費(fèi)下載。
    發(fā)表于 11-25 08:00 ?40次下載
    PADS的win<b class='flag-5'>10</b>顯示問(wèn)題補(bǔ)丁<b class='flag-5'>實(shí)用工具</b>免費(fèi)下載

    windows啟動(dòng)修復(fù)實(shí)用工具免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是windows啟動(dòng)修復(fù)實(shí)用工具免費(fèi)下載。
    發(fā)表于 12-10 08:00 ?1次下載
    windows啟動(dòng)修復(fù)<b class='flag-5'>實(shí)用工具</b>免費(fèi)下載

    LLC計(jì)算的實(shí)用工具應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是LLC計(jì)算的實(shí)用工具應(yīng)用程序免費(fèi)下載。
    發(fā)表于 03-31 08:00 ?93次下載
    LLC計(jì)算的<b class='flag-5'>實(shí)用工具</b>應(yīng)用程序免費(fèi)下載

    關(guān)閉Win10自動(dòng)更新的實(shí)用工具免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是關(guān)閉Win10自動(dòng)更新的實(shí)用工具免費(fèi)下載。
    發(fā)表于 11-02 08:00 ?1次下載
    關(guān)閉Win<b class='flag-5'>10</b>自動(dòng)更新的<b class='flag-5'>實(shí)用工具</b>免費(fèi)下載

    如何使用 Python 來(lái)創(chuàng)建一些強(qiáng)大的應(yīng)用和實(shí)用工具

    本文將探討如何以 Zynq UltraScale 器件上的 IP 核為目標(biāo),使用 Python 來(lái)創(chuàng)建一些強(qiáng)大的應(yīng)用和實(shí)用工具。此處提供了一個(gè)程序包,供您用于讀取設(shè)備樹和訪問(wèn) IP 核。此外還提供一個(gè)
    發(fā)表于 09-08 10:23 ?1257次閱讀
    和静县| 乌鲁木齐市| 裕民县| 莱阳市| 胶南市| 加查县| 兴和县| 定安县| 临沭县| 龙胜| 彩票| 武山县| 许昌市| 北票市| 安多县| 磴口县| 安阳市| 延长县| 绥滨县| 元氏县| 泾源县| 峡江县| 台南县| 三明市| 敦化市| 伊宁市| 石渠县| 西充县| 珠海市| 大港区| 兰州市| 囊谦县| 岳阳市| 甘孜县| 长兴县| 渭南市| 墨玉县| 偃师市| 南通市| 平果县| 楚雄市|