1. 基礎工具
-
top
/htop
top # 實時查看CPU、內存、進程
htop # 增強版(支持鼠標操作)
關鍵指標:%CPU
(CPU占用)、%MEM
(內存占用)、LOAD AVERAGE
(系統負載)。
vmstat
vmstat 1 # 每秒輸出一次系統狀態
關鍵列:
-
r
:等待CPU的進程數(> CPU核數表示過載)。 -
si
/so
:Swap交換頻率(頻繁交換說明內存不足)。
iostat
iostat -xz 1 # 查看磁盤I/O
關鍵指標:%util
(磁盤利用率 >80% 表示瓶頸)、await
(I/O等待時間)。
netstat
/ ss
netstat -ant | grep ESTABLISHED | wc -l # 查看TCP連接數
ss -s # 統計套接字信息
2. 高級工具
sar
(系統活動報告)
sar -u 1 3 # 查看CPU使用率(每秒1次,共3次)
sar -r # 查看內存使用歷史
dstat
dstat -cmsn # 綜合監控CPU、內存、網絡、磁盤
三、子系統優化策
1. CPU優化
-
調整進程優先級
nice -n 19 ./script.sh # 啟動低優先級進程
renice 19 -p PID # 修改運行中進程的優先級
綁定CPU核心(減少上下文切換)
taskset -c 0,1 ./program # 綁定到CPU0和CPU1
內核參數調整
# 修改/etc/sysctl.conf
kernel.sched_child_runs_first = 1 # 子進程優先調度
2. 內存優化
調整Swap使用策略
# 修改/etc/sysctl.conf
vm.swappiness = 10 # 降低Swap使用傾向(0-100,默認60)
vm.vfs_cache_pressure = 50 # 減少inode緩存回收頻率
禁用透明大頁(THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
3. 磁盤I/O優化
選擇合適I/O調度器
# 查看當前調度器
cat /sys/block/sda/queue/scheduler
# 臨時修改為deadline調度器(適用于SSD)
echo deadline > /sys/block/sda/queue/scheduler
文件系統優化(ext4)
# 掛載參數:noatime(不記錄訪問時間), data=writeback
UUID=xxx / ext4 defaults,noatime,data=writeback 0 1
4. 網絡優化
TCP參數調優
# 修改/etc/sysctl.conf
net.core.somaxconn = 4096 # 提高連接隊列長度
net.ipv4.tcp_fin_timeout = 30 # 縮短TIME_WAIT超時
net.ipv4.tcp_tw_reuse = 1 # 允許重用TIME_WAIT連接
sysctl -p # 應用配置
限制連接數
# 使用iptables限制單IP連接數
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
四、資源限制優化
1. ulimit
修改用戶級限制
# 編輯/etc/security/limits.conf
* soft nofile 65535 # 文件描述符軟限制
* hard nofile 65535 # 硬限制
2. cgroups(控制組)
限制進程資源
# 創建cgroup(需安裝cgroup-tools)
cgcreate -g cpu,memory:/my_group
# 限制CPU使用為50%
cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 my_group
# 限制內存為1GB
cgset -r memory.limit_in_bytes=1G my_group
# 將進程加入cgroup
cgexec -g cpu,memory:my_group ./program
五、安全與注意事項
-
備份配置文件:修改前備份
/etc/sysctl.conf
、/etc/security/limits.conf
。 -
灰度測試:先在測試環境驗證參數調整效果。
-
避免過度優化:如無明確瓶頸,優先使用默認配置。
六、綜合案例
問題描述
Nginx服務器在高并發時出現 Too many open files
錯誤,TCP連接數超過默認限制。
優化配置
-
修改文件描述符限制
# 編輯 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
nginx soft nofile 65535 # 針對Nginx用戶單獨設置
調整Nginx配置
# /etc/nginx/nginx.conf
worker_rlimit_nofile 65535; # 與limits.conf一致
events {worker_connections 4096; # 每個Worker進程連接數
}
內核TCP參數優化
# 編輯 /etc/sysctl.conf
net.core.somaxconn = 65535 # 最大連接隊列
net.ipv4.tcp_max_syn_backlog = 65535 # SYN隊列長度
net.ipv4.tcp_tw_reuse = 1 # 重用TIME_WAIT連接
net.ipv4.tcp_fin_timeout = 30 # 縮短FIN超時
sysctl -p # 生效配置
驗證方法
ss -lnt | grep 'LISTEN' # 查看監聽隊列長度
cat /proc/$(pidof nginx)/limits | grep 'open files' # 確認Nginx進程限制
案例2:Java應用內存溢出導致系統崩潰
問題描述
Tomcat服務頻繁觸發OOM(Out of Memory),且系統Swap使用率過高
優化配置
-
限制JVM堆內存
# 修改Tomcat啟動腳本 catalina.sh
export JAVA_OPTS="-Xms2G -Xmx2G -XX:MaxMetaspaceSize=512M"
調整系統Swap策
# 編輯 /etc/sysctl.conf
vm.swappiness = 10 # 降低Swap使用傾向
vm.overcommit_memory = 1 # 允許超量分配內存(謹慎使用)
使用cgroups限制內存
# 創建內存限制組
cgcreate -g memory:/tomcat
cgset -r memory.limit_in_bytes=4G /tomcat
cgset -r memory.memsw.limit_in_bytes=6G /tomcat # 物理內存+Swap總限制
# 啟動Tomcat
cgexec -g memory:tomcat /opt/tomcat/bin/startup.sh
驗證方法
free -h # 查看內存和Swap使用
ps aux | grep tomcat # 確認cgroup限制生效
cat /sys/fs/cgroup/memory/tomcat/memory.usage_in_bytes # 查看內存占用
案例3:磁盤I/O延遲導致數據庫性能下降
問題描述
MySQL讀寫緩慢,iostat
顯示磁盤 %util
持續高于90%。
優化配置
切換I/O調度器
# 臨時切換為deadline調度器(SSD推薦)
echo deadline > /sys/block/sda/queue/scheduler
# 永久生效(GRUB配置)
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"
update-grub # Debian/Ubuntu
grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/RHEL
調整文件系統掛載參數
# 編輯 /etc/fstab
UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
MySQL配置優化
# /etc/my.cnf
innodb_flush_method = O_DIRECT # 繞過內核緩存
innodb_io_capacity = 2000 # SSD建議值
innodb_buffer_pool_size = 8G # 分配足夠緩沖池
驗證方法
cat /sys/block/sda/queue/scheduler # 確認調度器
iostat -xm 1 # 觀察%util和await變化
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%'; # 查看緩沖池命中率
案例4:CPU競爭導致多線程應用性能
問題描述
Python多進程數據處理程序運行緩慢,top
顯示CPU在多個核心間頻繁切換。
綁定進程到特定CPU核心
# 使用taskset綁定到CPU0-3
taskset -c 0-3 python3 data_processing.py
調整進程優先級
nice -n -20 python3 high_priority_task.py # 最高優先級(需root)
renice -n 19 -p 1234 # 將運行中的PID=1234進程設為低優先級
禁用CPU節能模式
# 安裝cpufrequtils(Debian/Ubuntu)
apt install cpufrequtils
# 設置為性能模式
cpufreq-set -g performance -c 0 # 對每個CPU核心執行
驗證方法
mpstat -P ALL 1 # 查看各核心利用率
cpufreq-info # 確認當前CPU頻率策略
案例5:網絡丟包導致視頻流傳輸卡頓
問題描述
視頻流服務器在傳輸大流量UDP數據時出現丟包,sar -n UDP 1
顯示 idgm/s
(輸入數據報)超過網卡處理能力。
優化配置
-
增大Socket緩沖區
# 編輯 /etc/sysctl.conf
net.core.rmem_max = 67108864 # 接收緩沖區最大值(64MB)
net.core.wmem_max = 67108864 # 發送緩沖區最大值
net.core.netdev_max_backlog = 500000 # 網卡隊列長度
2.多隊列網卡優化
# 啟用RSS(Receive Side Scaling)
ethtool -L eth0 combined 8 # 設置8個隊列(需網卡支持)
# 綁定IRQ到不同CPU核心
vi /etc/rc.local
/usr/bin/irqbalance --powerthresh=50 # 啟用IRQ平衡
應用層優化(FFmpeg示例)
ffmpeg -i input -c copy -f mpegts udp://target:1234?buffer_size=4194304 # 增大發送緩沖區
驗證方法
ethtool -S eth0 | grep rx_dropped # 查看丟包統計
sar -n UDP 1 # 監控UDP報文狀態
cat /proc/interrupts | grep eth0 # 確認IRQ分布
總結:優化配置原則
精準定位瓶頸:
-
使用
perf top
分析CPU熱點。 -
通過
dmesg
檢查內核OOM或I/O錯誤日志。
層級化調整:
層級 | 工具/方法 |
---|---|
應用層 | 代碼優化、連接池配置 |
運行時 | JVM參數、Golang GC策略 |
操作系統 | sysctl、cgroups、ulimit |
硬件/驅動 | 升級SSD、調整RAID級別 |
自動化監控:
# 使用Prometheus + Grafana監控模板
- node_exporter 采集系統指標
- alertmanager 配置CPU/內存閾值告警