关注「Raymond运维」公众号,并设为「星标」,也可以扫描底部二维码加入群聊,第一时间获取最新内容,不再错过精彩内容。
Linux系统性能调优实战:CPU、内存、IO、网络全方位优化
一、概述
1.1 背景介绍
在当今高并发、大数据量的互联网环境中,Linux服务器的性能直接影响业务的稳定性和用户体验。系统性能问题往往表现为响应慢、CPU飙高、内存溢出、磁盘IO瓶颈或网络延迟等。本文将从CPU、内存、磁盘IO、网络四个维度,系统性地介绍Linux性能调优的方法论和实战技巧,帮助运维工程师快速定位和解决性能问题。
1.2 技术特点
- • 全面性:覆盖CPU、内存、IO、网络四大核心领域
- • 工具化:充分利用perf、vmstat、iostat等专业工具
1.3 适用场景
1.4 环境要求
| | |
|---|
| CentOS 7+/Ubuntu 20.04+/RHEL 8+ | 推荐CentOS 7.9或Rocky Linux 8 |
| | |
| | |
| | |
二、详细步骤
2.1 准备工作
◆ 2.1.1 系统检查
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -r
# 查看CPU信息
lscpu
# 查看内存信息
free -h
cat /proc/meminfo
# 查看磁盘信息
lsblk
df -Th
# 查看网络配置
ip addr
ss -tuln
◆ 2.1.2 安装性能分析工具
# CentOS/RHEL
sudo yum install -y sysstat perf iotop htop dstat nload iftop
# 安装BCC工具集(需要内核4.1+)
sudo yum install -y bcc-tools
# Ubuntu/Debian
sudo apt install -y sysstat linux-tools-common linux-tools-$(uname -r) \
iotop htop dstat nload iftop bpfcc-tools
◆ 2.1.3 启用性能数据采集
# 启用sysstat数据采集
sudo systemctl enable sysstat
sudo systemctl start sysstat
# 配置采集频率(每1分钟采集一次)
sudo sed -i 's/^ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
# 查看历史数据
sar -u 1 10 # CPU使用率
sar -r 1 10 # 内存使用率
sar -d 1 10 # 磁盘IO
sar -n DEV 1 10 # 网络流量
2.2 CPU性能调优
◆ 2.2.1 CPU性能分析
# 实时查看CPU使用情况
top -d 1
htop
# 查看每个CPU核心的使用率
mpstat -P ALL 1 5
# 查看进程CPU使用详情
pidstat -u 1 5
# 使用perf分析CPU热点
sudo perf top -g
sudo perf record -g -p <PID> -- sleep 30
sudo perf report
# 查看CPU中断分布
cat /proc/interrupts
# 查看软中断
cat /proc/softirqs
关键指标说明:
- •
%user:用户态CPU使用率,高表示应用程序繁忙 - •
%system:内核态CPU使用率,高可能是系统调用频繁 - •
%iowait:IO等待占比,高表示存在IO瓶颈 - •
%steal:虚拟化环境中被其他VM占用的CPU时间
◆ 2.2.2 CPU调优参数
# 查看当前CPU调度策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 设置CPU为性能模式(服务器推荐)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo"performance" | sudotee$cpu
done
# 关闭CPU节能模式(永久生效)
sudo grubby --update-kernel=ALL --args="intel_pstate=disable"
# /etc/sysctl.conf CPU相关优化
# 内核调度器优化
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
# 增加进程数限制
kernel.pid_max = 65535
kernel.threads-max = 256000
◆ 2.2.3 CPU亲和性设置
# 查看进程CPU亲和性
taskset -p <PID>
# 将进程绑定到CPU 0-3
taskset -pc 0-3 <PID>
# 启动时指定CPU亲和性
taskset -c 0-3 ./your_application
# 中断亲和性设置(将网卡中断绑定到特定CPU)
# 查看网卡中断号
cat /proc/interrupts | grep eth0
# 设置中断亲和性(绑定到CPU 0)
echo 1 | sudotee /proc/irq/<IRQ_NUM>/smp_affinity
2.3 内存性能调优
◆ 2.3.1 内存性能分析
# 查看内存使用概况
free -h
# 详细内存信息
cat /proc/meminfo
# 查看进程内存使用
ps aux --sort=-%mem | head -20
# 使用vmstat监控
vmstat 1 10
# 查看NUMA内存分布
numactl --hardware
numastat
# 查看内存碎片
cat /proc/buddyinfo
# 查看Slab缓存
sudo slabtop
cat /proc/slabinfo
vmstat关键指标:
- •
si/so:swap换入换出,非0表示内存不足
◆ 2.3.2 内存调优参数
# /etc/sysctl.conf 内存相关优化
# 控制swap使用倾向(0-100,服务器建议10-30)
vm.swappiness = 10
# 脏页回写阈值
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
# 脏页过期时间(毫秒)
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
# 内存过度提交策略(0=启发式,1=总是允许,2=禁止)
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
# 最小空闲内存(KB)
vm.min_free_kbytes = 262144
# 缓存回收压力
vm.vfs_cache_pressure = 100
# 禁用OOM Killer对特定进程的影响
# echo -17 > /proc/<PID>/oom_adj
# 应用配置
sudo sysctl -p
◆ 2.3.3 NUMA优化
# 查看NUMA拓扑
numactl --hardware
# 查看NUMA内存使用统计
numastat -m
# 进程绑定到指定NUMA节点
numactl --cpunodebind=0 --membind=0 ./your_application
# MySQL NUMA优化示例
numactl --interleave=all mysqld
# 查看进程NUMA分布
numastat -p <PID>
# 系统级NUMA配置
echo 0 | sudotee /proc/sys/vm/zone_reclaim_mode
◆ 2.3.4 大页内存配置
# 查看当前大页配置
cat /proc/meminfo | grep -i huge
# 配置大页数量(每个大页2MB)
echo 1024 | sudotee /proc/sys/vm/nr_hugepages
# 永久配置(/etc/sysctl.conf)
vm.nr_hugepages = 1024
# 挂载hugetlbfs
sudomkdir -p /mnt/hugepages
sudo mount -t hugetlbfs nodev /mnt/hugepages
# 透明大页配置(数据库场景建议关闭)
cat /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudotee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudotee /sys/kernel/mm/transparent_hugepage/defrag
# 永久禁用透明大页
# 在/etc/rc.local中添加
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2.4 磁盘IO调优
◆ 2.4.1 IO性能分析
# iostat监控磁盘IO
iostat -xz 1 10
# 查看进程IO使用
sudo iotop -o
# pidstat监控进程IO
pidstat -d 1 5
# 查看块设备信息
lsblk -d -o NAME,ROTA,SCHED,RQ-SIZE,DISC-MAX
# 查看IO调度器
cat /sys/block/sda/queue/scheduler
# blktrace跟踪IO
sudo blktrace -d /dev/sda -o - | blkparse -i -
iostat关键指标:
◆ 2.4.2 IO调度器优化
# 查看当前IO调度器
cat /sys/block/sda/queue/scheduler
# SSD推荐使用none或mq-deadline
echo"none" | sudotee /sys/block/sda/queue/scheduler
# HDD推荐使用mq-deadline
echo"mq-deadline" | sudotee /sys/block/sda/queue/scheduler
# 永久配置(GRUB)
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX="elevator=mq-deadline"
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 调整队列深度
echo 256 | sudotee /sys/block/sda/queue/nr_requests
# 调整预读大小(KB)
blockdev --setra 4096 /dev/sda
echo 4096 | sudotee /sys/block/sda/queue/read_ahead_kb
◆ 2.4.3 文件系统优化
# 查看文件系统挂载选项
mount | grep sda
# XFS优化挂载选项
# /etc/fstab
/dev/sda1 /data xfs defaults,noatime,nodiratime,nobarrier,logbufs=8 0 0
# EXT4优化挂载选项
/dev/sda1 /data ext4 defaults,noatime,nodiratime,barrier=0,data=writeback 0 0
# 调整文件描述符限制
# /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
# 系统级文件描述符
echo"fs.file-max = 6553600" >> /etc/sysctl.conf
sysctl -p
◆ 2.4.4 磁盘写入策略
# 查看磁盘写入缓存状态
sudo hdparm -W /dev/sda
# 启用写入缓存(提升性能,但掉电有风险)
sudo hdparm -W1 /dev/sda
# 关闭写入缓存(数据安全优先)
sudo hdparm -W0 /dev/sda
# SSD TRIM支持
# 检查是否支持
lsblk -D
# 手动执行TRIM
sudo fstrim -v /
# 配置定时TRIM(systemd timer)
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
2.5 网络性能调优
◆ 2.5.1 网络性能分析
# 查看网络连接状态
ss -s
ss -tuln
# 查看网络接口统计
ip -s link show eth0
# 实时流量监控
iftop -i eth0
nload eth0
# 查看TCP连接状态分布
ss -ant | awk '{print $1}' | sort | uniq -c
# 查看网络错误和丢包
netstat -i
cat /proc/net/dev
# 网络延迟测试
ping -c 10 target_host
mtr target_host
# TCP连接跟踪
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
◆ 2.5.2 网络内核参数优化
# /etc/sysctl.conf 网络优化配置
# TCP缓冲区大小
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP连接优化
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# TIME_WAIT优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 65535
# TCP keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# 连接跟踪
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
# 本地端口范围
net.ipv4.ip_local_port_range = 1024 65535
# TCP Fast Open
net.ipv4.tcp_fastopen = 3
# 启用BBR拥塞控制(内核4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 应用配置
sudo sysctl -p
◆ 2.5.3 网卡队列优化
# 查看网卡队列数
ethtool -l eth0
# 设置多队列(根据CPU核数)
sudo ethtool -L eth0 combined 8
# 查看网卡Ring Buffer
ethtool -g eth0
# 增大Ring Buffer
sudo ethtool -G eth0 rx 4096 tx 4096
# 查看网卡offload功能
ethtool -k eth0
# 启用硬件卸载
sudo ethtool -K eth0 gro on gso on tso on
# 中断合并(降低CPU中断)
sudo ethtool -C eth0 rx-usecs 100 tx-usecs 100
# RPS/RFS设置(软件多队列)
echo"ff" | sudotee /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 32768 | sudotee /proc/sys/net/core/rps_sock_flow_entries
echo 4096 | sudotee /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
2.6 cgroups资源隔离
◆ 2.6.1 cgroups v1配置
# 查看cgroups挂载
mount | grep cgroup
# 创建cgroup
sudomkdir -p /sys/fs/cgroup/cpu/myapp
sudomkdir -p /sys/fs/cgroup/memory/myapp
# CPU限制(限制为50%)
echo 50000 | sudotee /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us
echo 100000 | sudotee /sys/fs/cgroup/cpu/myapp/cpu.cfs_period_us
# 内存限制(限制为4G)
echo 4294967296 | sudotee /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
# 将进程加入cgroup
echo <PID> | sudotee /sys/fs/cgroup/cpu/myapp/cgroup.procs
echo <PID> | sudotee /sys/fs/cgroup/memory/myapp/cgroup.procs
# 查看cgroup状态
cat /sys/fs/cgroup/cpu/myapp/cpu.stat
cat /sys/fs/cgroup/memory/myapp/memory.usage_in_bytes
◆ 2.6.2 cgroups v2配置
# 检查cgroups v2是否启用
mount | grep cgroup2
# 创建cgroup
sudomkdir -p /sys/fs/cgroup/myapp
# 启用控制器
echo"+cpu +memory +io" | sudotee /sys/fs/cgroup/cgroup.subtree_control
# CPU限制(最大50%,权重100)
echo"50000 100000" | sudotee /sys/fs/cgroup/myapp/cpu.max
echo 100 | sudotee /sys/fs/cgroup/myapp/cpu.weight
# 内存限制
echo 4G | sudotee /sys/fs/cgroup/myapp/memory.max
echo 3G | sudotee /sys/fs/cgroup/myapp/memory.high
# IO限制(设备主:次号,如8:0为/dev/sda)
echo"8:0 rbps=100000000 wbps=50000000" | sudotee /sys/fs/cgroup/myapp/io.max
# 将进程加入cgroup
echo <PID> | sudotee /sys/fs/cgroup/myapp/cgroup.procs
◆ 2.6.3 使用systemd管理资源
# 创建systemd服务配置
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=always
# 资源限制
CPUQuota=200%
MemoryLimit=4G
MemoryHigh=3G
IOReadBandwidthMax=/dev/sda 100M
IOWriteBandwidthMax=/dev/sda 50M
# 安全设置
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
[Install]
WantedBy=multi-user.target
# 应用配置
sudo systemctl daemon-reload
sudo systemctl start myapp
# 查看资源使用
systemctl status myapp
systemd-cgtop
2.7 启动和验证
◆ 2.7.1 应用配置
# 加载所有sysctl配置
sudo sysctl -p /etc/sysctl.conf
# 验证配置已生效
sysctl -a | grep -E "swappiness|dirty_ratio|tcp_max_syn_backlog"
# 检查limits配置
ulimit -a
# 验证IO调度器
cat /sys/block/*/queue/scheduler
◆ 2.7.2 性能基准测试
# CPU基准测试
sysbench cpu --threads=4 --time=60 run
# 内存基准测试
sysbench memory --threads=4 --time=60 run
# 磁盘IO基准测试
# 顺序写
fio --name=seqwrite --rw=write --bs=1M --size=4G --numjobs=1 --time_based --runtime=60
# 随机读写
fio --name=randread --rw=randread --bs=4K --size=1G --numjobs=4 --time_based --runtime=60
# 网络基准测试
# 服务端
iperf3 -s
# 客户端
iperf3 -c <server_ip> -t 30 -P 4
三、示例代码和配置
3.1 完整sysctl配置
# 文件路径:/etc/sysctl.d/99-performance.conf
#############################################
# Linux 系统性能调优配置
# 适用于高并发服务器场景
#############################################
#========== 内核参数 ==========
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0
kernel.pid_max = 65535
kernel.threads-max = 256000
#========== 内存参数 ==========
vm.swappiness = 10
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.min_free_kbytes = 262144
vm.vfs_cache_pressure = 100
vm.zone_reclaim_mode = 0
#========== 文件系统 ==========
fs.file-max = 6553600
fs.nr_open = 6553600
fs.inotify.max_user_watches = 524288
#========== 网络参数 ==========
# 缓冲区
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 连接队列
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 65535
# Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# 连接跟踪
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
# 端口范围
net.ipv4.ip_local_port_range = 1024 65535
# TCP优化
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 65535
# BBR拥塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# ARP优化
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
3.2 性能监控脚本
#!/bin/bash
# 文件名:system_monitor.sh
# 功能:系统性能实时监控
LOG_DIR="/var/log/perf_monitor"
mkdir -p $LOG_DIR
# 日期格式
DATE=$(date +%Y%m%d_%H%M%S)
echo"========== 系统性能报告 $DATE =========="
# CPU信息
echo -e "\n[CPU Usage]"
mpstat -P ALL 1 1 | tail -n +4
# 内存信息
echo -e "\n[Memory Usage]"
free -h
echo""
vmstat 1 3
# 磁盘IO
echo -e "\n[Disk IO]"
iostat -xz 1 3 | tail -n +4
# 网络流量
echo -e "\n[Network Traffic]"
sar -n DEV 1 3 | grep -E "eth|ens|eno"
# TCP连接状态
echo -e "\n[TCP Connections]"
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# TOP进程
echo -e "\n[Top CPU Processes]"
ps aux --sort=-%cpu | head -10
echo -e "\n[Top Memory Processes]"
ps aux --sort=-%mem | head -10
# 保存到日志
exec > >(tee -a $LOG_DIR/perf_$DATE.log)
3.3 实际应用案例
◆ 案例一:MySQL数据库服务器优化
场景描述:MySQL服务器在高并发时出现IO等待高、响应慢的问题
优化配置:
# /etc/sysctl.d/mysql-tuning.conf
# 内存优化
vm.swappiness = 1
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# IO优化
# 使用deadline调度器
echo"mq-deadline" > /sys/block/sda/queue/scheduler
echo 256 > /sys/block/sda/queue/nr_requests
# NUMA优化启动MySQL
numactl --interleave=all mysqld
验证效果:
◆ 案例二:高并发Web服务器优化
场景描述:Nginx服务器需要支撑100万并发连接
优化配置:
# /etc/sysctl.d/nginx-tuning.conf
# 文件描述符
fs.file-max = 2097152
# TCP优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
# 缓冲区
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
# 连接跟踪(如果使用iptables)
net.netfilter.nf_conntrack_max = 2097152
# limits配置
# /etc/security/limits.conf
nginx soft nofile 1048576
nginx hard nofile 1048576
四、最佳实践和注意事项
4.1 最佳实践
◆ 4.1.1 性能优化原则
- • 先测量后优化:使用工具收集基线数据,量化优化效果
- • 逐项调整验证:每次只调整一个参数,验证效果后再进行下一项
◆ 4.1.2 资源预留
# 为系统进程预留资源
# cgroups限制应用程序最大使用80%的资源
echo 80000 > /sys/fs/cgroup/cpu/apps/cpu.cfs_quota_us
# 预留内存给系统
vm.min_free_kbytes = 262144 # 256MB
◆ 4.1.3 监控告警
# Prometheus告警规则示例
groups:
-name:system_alerts
rules:
-alert:HighCPUUsage
expr:100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m]))*100)>80
for:5m
labels:
severity:warning
annotations:
summary:"CPU使用率超过80%"
-alert:HighMemoryUsage
expr:(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)*100>85
for:5m
labels:
severity:warning
annotations:
summary:"内存使用率超过85%"
-alert:HighDiskIOWait
expr:avg(irate(node_cpu_seconds_total{mode="iowait"}[5m]))*100>20
for:5m
labels:
severity:warning
annotations:
summary:"IO等待超过20%"
4.2 注意事项
◆ 4.2.1 配置注意事项
⚠️ 警告:不当的内核参数调整可能导致系统不稳定
- • 避免将swappiness设为0(会导致OOM时无法使用swap缓冲)
- • 修改conntrack_max要同时关注内存消耗
◆ 4.2.2 常见错误
| | |
|---|
| | 调整limits.conf和fs.file-max |
| | |
| | |
| TCP: request_sock_TCP: Possible SYN flooding | | |
◆ 4.2.3 版本兼容性
- • cgroups v2:需要Linux 4.5+,完整支持需要5.2+
- • BPF工具:需要Linux 4.1+,推荐4.9+
五、故障排查和监控
5.1 故障排查
◆ 5.1.1 CPU问题排查
# 查找CPU占用高的进程
top -c -o %CPU
# 查看进程的线程CPU使用
top -H -p <PID>
# 使用perf分析热点函数
sudo perf top -p <PID>
sudo perf record -g -p <PID> -- sleep 30
sudo perf report
# 查看是否有D状态进程(不可中断睡眠)
ps aux | awk '$8=="D"'
# 分析系统调用
strace -c -p <PID>
问题:CPU sys高(内核态CPU高)
# 诊断
perf top # 查看内核函数
# 常见原因
# 1. 系统调用频繁
# 2. 锁竞争
# 3. 内存页面错误
# 解决方案
# 减少系统调用,使用批量操作
# 优化锁粒度
# 增加内存或优化内存访问模式
◆ 5.1.2 内存问题排查
# 查找内存占用高的进程
ps aux --sort=-%mem | head -20
# 查看进程内存映射
pmap -x <PID>
# 查看Slab缓存
sudo slabtop
# 检查是否有内存泄漏
# 持续监控进程内存增长
whiletrue; do ps -p <PID> -o pid,rss,vsz; sleep 60; done
# 查看OOM记录
dmesg | grep -i "out of memory"
journalctl -k | grep -i "oom"
问题:内存持续增长(疑似泄漏)
# 使用valgrind检测
valgrind --leak-check=full ./your_app
# 使用smem分析
smem -p -s rss
# 分析/proc/<PID>/smaps
cat /proc/<PID>/smaps | grep -E "^(Rss|Pss|Shared|Private)"
◆ 5.1.3 IO问题排查
# 找出IO占用高的进程
sudo iotop -o
# 查看进程IO详情
pidstat -d 1 5
# 查看磁盘使用情况
iostat -xz 1
# 查看文件系统IO
sudo fatrace
# 使用blktrace深入分析
sudo blktrace -d /dev/sda -o trace
blkparse -i trace.blktrace.0 > trace.txt
问题:iowait高
# 诊断步骤
# 1. 确认哪个磁盘繁忙
iostat -xz 1
# 2. 找出IO大户
sudo iotop -o
# 3. 分析IO模式
# 如果是大量小随机IO,考虑使用SSD
# 如果是顺序大IO,检查是否有不必要的全表扫描
# 解决方案
# - 使用SSD替代HDD
# - 调整IO调度器
# - 增加缓存
# - 优化应用IO模式
◆ 5.1.4 网络问题排查
# 查看网络连接状态
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c
# 查看丢包情况
netstat -i
cat /proc/net/dev | column -t
# 查看TCP重传
netstat -s | grep -i retrans
# 网络延迟分析
mtr <target_host>
# 抓包分析
tcpdump -i eth0 -nn -s0 -w capture.pcap
# 查看conntrack状态
conntrack -S
cat /proc/sys/net/netfilter/nf_conntrack_count
问题:大量TIME_WAIT
# 查看TIME_WAIT数量
ss -ant | grep TIME-WAIT | wc -l
# 解决方案
# /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 65535
sysctl -p
5.2 监控方案
◆ 5.2.1 监控指标
◆ 5.2.2 Prometheus + Node Exporter
# 安装Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xzf node_exporter-1.6.1.linux-amd64.tar.gz
sudomv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
# 创建systemd服务
cat > /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
5.3 备份配置
#!/bin/bash
# 系统配置备份脚本
BACKUP_DIR="/backup/sysconfig/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份sysctl配置
cp -a /etc/sysctl.conf $BACKUP_DIR/
cp -a /etc/sysctl.d/ $BACKUP_DIR/
# 备份limits配置
cp -a /etc/security/limits.conf $BACKUP_DIR/
cp -a /etc/security/limits.d/ $BACKUP_DIR/
# 备份网络配置
cp -a /etc/sysconfig/network-scripts/ $BACKUP_DIR/ 2>/dev/null
cp -a /etc/netplan/ $BACKUP_DIR/ 2>/dev/null
# 备份当前运行参数
sysctl -a > $BACKUP_DIR/sysctl_runtime.txt
ulimit -a > $BACKUP_DIR/ulimit.txt
echo"配置已备份到: $BACKUP_DIR"
六、总结
6.1 技术要点回顾
- • ✅ CPU调优:调度策略、亲和性绑定、中断均衡
- • ✅ 内存调优:swap策略、脏页参数、NUMA优化、大页内存
- • ✅ IO调优:调度器选择、预读设置、文件系统优化
- • ✅ 网络调优:缓冲区、连接参数、BBR拥塞控制
6.2 进阶学习方向
- 4. 容器性能优化:cgroups、namespace的深入应用
6.3 参考资料
- • Linux Performance - Brendan Gregg的性能分析网站
- • Red Hat Performance Tuning Guide
附录
A. 命令速查表
# CPU分析
top -c # 查看进程CPU
mpstat -P ALL 1 # 各CPU核心使用率
pidstat -u 1 # 进程CPU使用
perf top # CPU热点分析
# 内存分析
free -h # 内存概况
vmstat 1 # 内存和进程统计
pmap -x <PID> # 进程内存映射
numastat # NUMA统计
# IO分析
iostat -xz 1 # 磁盘IO统计
iotop -o # 进程IO排行
pidstat -d 1 # 进程IO统计
# 网络分析
ss -s # 连接统计摘要
ss -ant # TCP连接详情
sar -n DEV 1 # 网络流量
netstat -s # 协议统计
B. 内核参数分类
C. 术语表
| | |
|---|
| | |
| | |
| | |
| | |
| Non-Uniform Memory Access | |
| Bottleneck Bandwidth and RTT | |
为了方便大家更好的交流运维等相关技术问题,创建了微信交流群,需要加群的小伙伴们可以扫一扫下面的二维码加我为好友拉您进群(备注:加群)。

| 代码仓库 | 网址 |
| Github | https://github.com/raymond999999 |
| Gitee | https://gitee.com/raymond9 |
| 博客 | 网址 |
| https://blog.csdn.net/qq_25599925 |
| 稀土掘金 | https://juejin.cn/user/4262187909781751 |
| 知识星球 | https://wx.zsxq.com/group/15555885545422 |
| 阿里云社区 | https://developer.aliyun.com/profile/snzh3xpxaf6sg |
| 腾讯云社区 | https://cloud.tencent.com/developer/user/11823619 |
| 华为云社区 | https://developer.huaweicloud.com/usercenter/mycommunity/dynamics |
访问博客网站,查看更多优质原创内容。