Linux服务器的性能监控是系统运维的核心任务之一。随着业务规模的增长和架构复杂度的提升,传统的监控工具已难以满足精细化诊断的需求。本文将从经典监控工具出发,逐步深入到eBPF这一革命性的可观测性技术,为服务器性能分析提供完整的知识体系和实践指南。
一、传统性能监控工具回顾
Linux提供了丰富的性能监控工具,每个工具都有其特定的应用场景。以下是几种最常用的传统监控命令及其使用方法。
1. CPU监控:top与htop
top是最常用的实时进程监控工具,但它提供的信息远不止表面看到的那些:
# 查看CPU负载和进程概览
top
# 按内存使用排序
top -o %MEM
# 查看指定进程
top -p 1234,5678
# 批处理模式输出(适合脚本)
top -b -n 1 > top_snapshot.txt
# 更精细的CPU信息
mpstat -P ALL 1 5 # 每秒采样,共5次,显示所有CPU核心
理解top输出的关键指标:
- load average:1/5/15分钟的平均负载,理想情况下不超过CPU核心数
- %us:用户态CPU使用率
- %sy:内核态CPU使用率
- %wa:I/O等待时间,持续偏高说明磁盘性能瓶颈
- %si:软中断时间,网络密集型场景需重点关注
2. 内存监控:free与vmstat
# 查看内存使用情况(人类可读格式)
free -h
# 详细虚拟内存统计
vmstat 1 5
# 查看进程内存映射
pmap -x 1234 | tail -1
# 查看系统内存压力
cat /proc/pressure/memory
Linux内存管理的一个重要概念是buffer/cache。内核会利用空闲内存缓存磁盘数据,当应用程序需要内存时,这些缓存可以被快速回收。因此,available列比free列更能反映实际可用内存。
3. 磁盘I/O监控:iostat与iotop
# 安装sysstat包
yum install -y sysstat # CentOS/RHEL
apt install -y sysstat # Ubuntu/Debian
# 查看磁盘I/O统计
iostat -xdm 1 5
# 查看进程级I/O
iotop -oP
# 查看特定磁盘的详细统计
iostat -x sda 1
重点关注以下指标:
- %util:磁盘利用率,持续超过80%需扩容
- await:平均I/O等待时间(毫秒),SSD正常值<2ms
- svctm:平均服务时间
- r/s, w/s:每秒读写次数
二、/proc文件系统:性能数据的宝库
/proc是Linux内核暴露性能数据的虚拟文件系统,几乎所有性能工具的底层数据源都来自这里。
# CPU使用统计(user, nice, system, idle, iowait, irq, softirq, steal)
cat /proc/stat | head -2
# 内存使用详情
cat /proc/meminfo | head -10
# 网络连接统计
cat /proc/net/tcp | wc -l
# 磁盘I/O统计
cat /proc/diskstats | grep sda
# 软中断统计
cat /proc/softirqs
# 进程详细信息
cat /proc/1234/status
cat /proc/1234/io
cat /proc/1234/sched
通过编写脚本解析/proc数据,可以实现自定义的性能监控:
#!/bin/bash
# 简单的CPU使用率计算脚本
PREV_TOTAL=0
PREV_IDLE=0
while true; do
# 读取/proc/stat第一行
CPU_LINE=$(head -1 /proc/stat)
CPU_ARRAY=($CPU_LINE)
IDLE=${CPU_ARRAY[4]}
TOTAL=0
for VALUE in "${CPU_ARRAY[@]:1}"; do
TOTAL=$((TOTAL + VALUE))
done
# 计算差值
DIFF_IDLE=$((IDLE - PREV_IDLE))
DIFF_TOTAL=$((TOTAL - PREV_TOTAL))
DIFF_USAGE=$(( (DIFF_TOTAL - DIFF_IDLE) * 100 / DIFF_TOTAL ))
echo "CPU Usage: ${DIFF_USAGE}%"
PREV_TOTAL=$TOTAL
PREV_IDLE=$IDLE
sleep 1
done
三、网络性能监控
网络是服务器性能的另一个关键维度。以下是网络监控的核心工具:
# 网络接口流量统计
sar -n DEV 1 5
# TCP连接状态统计
ss -s
# 查看各状态TCP连接数量
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# 抓包分析
tcpdump -i eth0 -nn port 80 -c 100
# 网络延迟测试
mtr --report --report-cycles 10 8.8.8.8
# 查看网络队列
ethtool -S eth0 | grep -i drop
# 查看网络中断分布
cat /proc/interrupts | grep eth0
四、eBPF:下一代可观测性技术
eBPF(Extended Berkeley Packet Filter)是近年来Linux内核最重要的革新之一。它允许在内核中安全地运行沙盒程序,无需修改内核源码或加载内核模块,就能实现前所未有的可观测性。
1. eBPF的核心优势
- 零侵入:无需修改应用代码或重启服务
- 内核级精度:直接在内核中采集数据,开销极低
- 安全可靠:经过验证器检查,不会导致内核崩溃
- 实时分析:可以实时追踪函数调用和事件
2. bpftrace:快速上手eBPF追踪
# 安装bpftrace
apt install -y bpftrace # Ubuntu
yum install -y bpftrace # CentOS
# 追踪所有进程的open系统调用
bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
printf("%s -> %s\n", comm, str(args->filename));
}'
# 统计各进程的read调用次数
bpftrace -e 'tracepoint:syscalls:sys_enter_read {
@[comm] = count();
}'
# 追踪函数执行时间(以 vfs_read 为例)
bpftrace -e 'kprobe:vfs_read {
@start[tid] = nsecs;
}
kretprobe:vfs_read /@start[tid]/ {
$dur = (nsecs - @start[tid]) / 1000;
printf("vfs_read took %d us (pid=%d, comm=%s)\n",
$dur, pid, comm);
delete(@start[tid]);
}'
# 追踪TCP连接建立
bpftrace -e 'tracepoint:sock:inet_sock_set_state {
printf("%-6d %-12s %s -> %s\n", pid, comm,
str(args->sport), str(args->dport));
}'
3. BCC工具集:现成的eBPF性能分析工具
# 安装BCC
apt install -y bpfcc-tools # Ubuntu
# 追踪磁盘I/O延迟
biolatency-bpfcc
# 按进程显示磁盘I/O
biotop-bpfcc 5 10
# 追踪函数调用延迟
funclatency-bpfcc vfs_read
# 分析系统调用开销
syscount-bpfcc
# 追踪TCP重传
tcpretranss-bpfcc
# 内存分配追踪
memleak-bpfcc -p 1234
五、综合性能调优实践
将以上工具组合使用,可以形成完整的性能诊断流程:
- 定位瓶颈:使用
top/vmstat/iostat快速判断瓶颈在CPU、内存还是I/O - 深入分析:使用eBPF工具精确定位到具体的函数或系统调用
- 验证调优:修改配置后使用相同工具对比前后数据
# 系统级调优参数示例
# 调整文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 调整TCP参数
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.core.netdev_max_backlog=65535
# 调整虚拟内存参数
sysctl -w vm.swappiness=10
sysctl -w vm.dirty_ratio=15
sysctl -w vm.dirty_background_ratio=5
# 磁盘I/O调度器(SSD推荐none/mq-deadline)
echo none > /sys/block/sda/queue/scheduler
总结
从传统的top、iostat到革命性的eBPF技术,Linux性能监控工具栈已经发展得非常成熟。传统工具适合快速概览和日常巡检,而eBPF则为深度性能诊断提供了前所未有的能力。在实际工作中,建议建立分层监控体系:基础层使用传统工具进行日常监控,深度层使用eBPF进行问题诊断,并配合Prometheus+Grafana实现长期趋势分析和告警。掌握这些工具和技术,将极大提升服务器运维的效率和精准度。