Linux 内核与性能调优速查
sysctl 内核参数、CPU 与内存管理、磁盘 IO、网络栈调优、性能分析工具与瓶颈定位:Linux 系统调优速查。
sysctl 内核参数
网络、内存与句柄等常用参数调优
net.ipv4.tcp_congestion_control 拥塞控制热门
选择本机新连接使用的拥塞控制算法(默认 cubic);高延迟带一定丢包的长肥管道常改用 bbr 提升吞吐稳定性。
net.core.somaxconn 全连接队列上限热门
限制 listen 套接字 accept 队列的长度上限,实际生效值为 min(应用 backlog, somaxconn);高并发短连接服务的常见瓶颈点。
sysctl 查看与修改内核参数热门
读写运行时内核参数的入口命令:sysctl 直接对应 /proc/sys 下的文件,-w 修改立即生效但不持久,正式变更应落盘到配置文件。
vm.swappiness 换页倾向热门
控制内核把匿名页换出到 swap 的倾向(0-100,默认 60);数据库与延迟敏感服务常降低它减少换出抖动。
net.ipv4.tcp_tw_reuse TIME_WAIT 复用热门
允许把处于 TIME_WAIT 的套接字在协议安全前提下复用于新的出站连接(依赖时间戳);只对客户端方向的连接有效。
TCP Keepalive 三参数速查
空闲连接保活探测:默认约 2 小时才发首个探测包,对穿越 NAT/防火墙的长连接通常过慢,需要按链路回收时间调小。
net.ipv4.ip_local_port_range 本地端口范围
本机主动连接可用的本地端口区间,默认 32768-60999(约 2.8 万个);高并发出站(代理、网关、压测客户端)会先耗尽端口。
sysctl.d 配置持久化
把内核参数固化到 /etc/sysctl.d/*.conf,按文件名字典序合并加载;sysctl --system 重载全部配置,适合与发行版默认值分层管理。
net.ipv4.tcp_rmem 接收缓冲自动调优
三个值分别是最小/默认/上限的接收缓冲(默认 4096 131072 6291456);内核按链路 BDP 自动调节,上限决定单连接吞吐天花板。
net.ipv4.tcp_max_syn_backlog 半连接队列
控制 SYN 半连接队列(尚未完成三次握手的请求)的容量上限;队列满时新 SYN 可能被丢弃或触发 syncookies。
vm.overcommit_memory 内存超售策略
控制内核接受内存申请的宽松程度:0 启发式判断、1 总是允许、2 严格拒绝超售;影响 fork、大页与数据库行为。
net.netfilter.nf_conntrack_max 连接跟踪表上限
NAT/防火墙连接跟踪表容量上限;打满后新连接被丢弃并打印 table full 日志,是网关类主机的高频瓶颈。
vm.max_map_count 内存映射数量上限
限制单个进程可持有的内存映射区域数(默认 65530);搜索引擎、JVM、游戏服务器等大量 mmap 的应用常需要提高。
net.ipv4.tcp_syncookies SYN Cookie 防护
在半连接队列溢出时用无状态的 SYN Cookie 完成握手,避免队列耗尽导致正常新连接被拒;默认开启,代价是触发时部分 TCP 选项协商受限。
vm.dirty_ratio 脏页回写硬阈值
脏页占内存百分比达到该值(默认 20)时,写进程被迫参与同步回写,是写抖动(write stall)的常见来源。
/proc/sys 参数文件树
所有 sysctl 参数的运行时视图都在 /proc/sys 下,目录层级与点号命名严格对应,cat 读、echo 写,容器中多为命名空间隔离或只读。
net.ipv4.tcp_syn_retries 主动建连接重试
控制本机作为客户端发起连接时 SYN 的重传次数;默认 6 次累计等待约 2 分钟才放弃,内网服务常下调以快速失败。
net.core.netdev_max_backlog 收包积压队列
每个 CPU 内核收包队列的长度上限(默认 1000);小包高 PPS 场景队列打满会丢包,可在 softnet_stat 中确认。
net.ipv4.ip_forward IPv4 转发开关
控制内核是否转发非本机地址的数据包;容器网络、NAT 网关、VPN、软路由都需要开启它。
net.core.rmem_max / wmem_max 套接字缓冲上限
单个套接字接收/发送缓冲区的硬上限(默认各 212992 字节);应用 setsockopt 与自动调优都受它封顶,长肥管道场景需要提高。
net.ipv4.tcp_wmem 发送缓冲自动调优
发送侧缓冲自动调优的 最小/默认/上限(默认 4096 16384 4194304);大流量回源或推流场景可放宽上限提升突发吸收能力。
net.ipv4.conf.all.rp_filter 反向路径过滤
校验入包源地址是否可经同一接口回程;0 关闭、1 严格、2 松散(任意接口可达即可),是反地址欺骗的加固项。
fs.file-max 系统文件句柄上限
整个系统可打开的文件描述符总数上限,内核按内存规模自动计算初值;单进程限制则来自 limits。
net.ipv4.tcp_fin_timeout FIN_WAIT2 超时
控制主动关闭方在 FIN_WAIT2 状态等待对端 FIN 的超时秒数(默认 60);它不影响 TIME_WAIT 时长。
net.core.default_qdisc 默认队列规则
新网卡默认使用的队列规则(现代内核为 fq_codel);启用 BBR 时常见搭配 fq,低延迟转发场景可关注 codel 系列算法。
fs.inotify.max_user_watches 监听配额
每个用户可注册的 inotify watch 总数(默认 8192);文件同步、构建工具、监控代理耗尽后会报错。
net.ipv4.tcp_synack_retries 服务端握手重试
服务端在收到 SYN 后重传 SYN+ACK 的次数;默认 5,对端迟迟不回 ACK 时该连接最终被回收。
net.ipv4.tcp_fastopen TCP Fast Open
允许在 SYN 报文中携带数据(TFO),省去一次往返时延;取值 1 仅客户端、2 仅服务端、3 两端(按位组合)。
vm.dirty_background_ratio 后台回写阈值
脏页占内存比例达到该值(默认 10)时启动后台回写线程异步刷盘;与 dirty_ratio 一前一后控制回写节奏。
net.ipv4.tcp_mtu_probing PMTU 黑洞探测
当路径出现 ICMP 被拦截的 PMTU 黑洞时,内核可主动二分探测路径 MTU;0 关闭、1 检测到黑洞后启用、2 始终启用。
vm.panic_on_oom OOM 时是否崩溃
控制内存耗尽时内核行为:默认调起 OOM killer 杀进程,或配置为直接 panic(配合自动重启变成整机重启)。
net.ipv4.tcp_max_tw_buckets TIME_WAIT 总量
TIME_WAIT 状态套接字的总量上限,超出后内核会立即销毁并打印告警;默认 262144,属于保护性参数。
net.ipv4.tcp_slow_start_after_idle 空闲后慢启动
默认开启(1):连接空闲超过 RTO 后拥塞窗口重置并重新慢启动,长肥管道上的长连接会因此吞吐骤降。
nf_conntrack_tcp_timeout_established 跟踪超时
连接跟踪中 ESTABLISHED 表项的默认存活时间为 432000 秒(5 天),长连接多的网关会长期占用表容量。
fs.nr_open 单进程句柄硬上限
单个进程能打开的文件描述符硬上限(默认 1048576);limits 中的 nofile 不能超过它。
net.ipv4.tcp_window_scaling 窗口缩放
允许窗口大于 64KiB 的 TCP 选项(缩放因子最高 2 的 14 次方);高延迟链路的吞吐高度依赖它,关闭等于给窗口设上限。
fs.aio-max-nr 异步 IO 事件上限
系统级 Linux 原生 AIO 事件数量上限(默认 65536);数据库等使用异步 IO 的负载可能先行触顶。
net.ipv4.tcp_mem 全局 TCP 内存水位
三个页面数表示 TCP 全局内存的低水位/压力水位/上限;内核按物理内存自动计算初值,超压时限制新缓冲分配。
net.ipv4.tcp_timestamps 时间戳选项
启用 TCP 时间戳用于更精细的 RTT 测量与 PAWS 防旧报文重放;tcp_tw_reuse 的复用判定也依赖它。
net.ipv4.icmp_echo_ignore_all 禁 Ping
置 1 后本机不再响应 ICMP Echo 请求;常用于降低被扫描面,但会给外部连通性排查带来误导。
kernel.pid_max PID 编号空间
系统 PID(含线程号)编号上限:内核默认 32768,允许范围到 4194304;高密度容器/线程场景需要评估。
net.ipv4.tcp_abort_on_overflow 队列溢出行为
accept 全连接队列溢出时的两种处理:默认丢弃握手(等对端重传),或回 RST 让对端立即失败。
vm.overcommit_ratio 超售比例
严格超售模式下 CommitLimit 的构成比例(默认 50):CommitLimit = swap + 物理内存 × ratio%;仅在 overcommit_memory=2 时生效。
kernel.core_pattern 核心转储路径
定义崩溃核心文件的命名(内核默认 core,现代发行版多改为管道交给 systemd-coredump 统一管理)。
vm.vfs_cache_pressure 目录缓存回收倾向
控制内核回收 dentry/inode 缓存的倾向(默认 100):大于 100 回收更积极,小于 100 更倾向保留。
kernel.sysrq 系统请求键掩码
SysRq 功能位掩码(0 全关、1 全开、438 为常见组合);卡死救援时可通过 /proc/sysrq-trigger 触发保存、导出栈等操作。
vm.min_free_kbytes 保留空闲内存
内核启动时按内存规模计算并保留的空闲内存水位(低水位线);数值过低会引发直接回收与分配失败,过高则浪费内存。
vm.dirty_expire_centisecs 脏页老化时间
脏页超过该时间(默认 3000,即 30 秒)会被后台回写线程处理;控制数据在内存中滞留的上限时长。
kernel.panic 崩溃自动重启
panic 后等待多少秒自动重启(0 为不重启);与 panic_on_oops、hung_task_panic 组合构成无人值守的自愈链路。
net.ipv4.neigh.default.gc_thresh ARP 表阈值
邻居表回收的三个阈值(默认 128/512/1024);同网段大量主机时表满会打印 neighbor table overflow 并影响通信。
vm.dirty_writeback_centisecs 回写周期
内核回写线程的唤醒周期(默认 500,即 5 秒),决定脏页被检查与写出的节奏。
kernel.threads-max 系统任务数上限
整个系统的任务(线程)数量上限,内核按内存规模自动计算;触顶时新建线程失败。
vm.zone_reclaim_mode NUMA 本地回收
控制内存节点耗尽时是否优先在本地节点回收(而非跨节点分配):0 关闭为默认;开启后可能降低远程访问但增加回收开销。
kernel.sem SysV 信号量四元组
四个数值分别限制:每组信号量数、系统信号量总数、单次操作数、信号量组数(发行版常见 250 32000 32 128)。
kernel.printk 控制台日志级别
四元组控制日志输出行为:控制台级别、默认消息级别、控制台最低级别、启动默认级别(常见值 4 4 1 7);级别数值越小消息越重要。
tcp_available_congestion_control 算法清单
内核当前支持的拥塞控制算法(available)与允许应用切换的算法(allowed);切 bbr 前先在清单中确认。
fs.inotify.max_user_instances 实例配额
每个用户可创建的 inotify 实例数上限(默认 128);每个实例内部再受 watches 配额约束,二者需成对调整。
kernel.hung_task_timeout_secs 任务挂起告警
处于 D(不可中断睡眠)状态超过阈值的任务会被记录告警(默认 120 秒);可配置直接 panic 作为自愈手段。
kernel.dmesg_restrict 与 kptr_restrict 信息暴露控制
限制非特权用户读取内核日志(dmesg_restrict)与打印内核指针(kptr_restrict);安全加固常用组合。
net.ipv4.tcp_ecn 显式拥塞通知
ECN 协商:0 关闭、1 主动启用、2 仅在对端请求时启用(现代默认);用标记代替丢包传递拥塞信号。
vm.page-cluster swap 预读页数
swap 预读的页数按 2 的 n 次方计(默认 3 → 8 页 ≈ 32KiB);顺序换页时提升效率,随机负载下可能放大读开销。
kernel.shmmax SysV 共享内存上限
shmmax 限制单个共享内存段字节数、shmall 限制系统共享内存总页数、shmmni 限制段数量;数据库部署常需核对。
net.ipv4.udp_mem 等 UDP 缓冲参数
UDP 全局内存水位(udp_mem,按页)与单套接字最小缓冲(udp_rmem_min/udp_wmem_min,默认各 4096);UDP 无流控,缓冲不足直接丢包。
kernel.msgmax 消息队列单条上限
SysV 消息队列单条消息大小上限(常见 8192 字节);同类参数 msgmnb 限制单队列总字节、msgmni 限制队列数量。
net.core.rmem_default / wmem_default 默认缓冲
每个新套接字的默认收发缓冲(各 212992 字节);未显式 setsockopt 的应用直接继承,TCP 自动调优在此基础上工作。
kernel.randomize_va_space 地址随机化
ASLR 级别:0 关闭、1 部分随机化、2 完全随机化(默认);属于安全基线参数。
net.ipv4.tcp_autocorking 小包合并
内核在发送路径尝试合并小数据(队列中已有未发送数据时避免立即发出),默认开启;减少包数但可能略增延迟。
kernel.nmi_watchdog NMI 看门狗
基于性能计数器的硬锁检测与采样来源(常见默认开启,虚拟机多为关闭);关闭可省少量开销但失去 hard lockup 检测。
kernel.unprivileged_bpf_disabled 非特权 BPF
控制非特权用户能否加载 BPF 程序:0 允许、1 禁止、2 禁止且不可回退(现代发行版常见 2);root 不受影响。
net.core.busy_read / busy_poll 低延迟轮询
允许应用通过 SO_BUSY_POLL 在网卡队列上自旋轮询收包(默认关闭);以 CPU 换微秒级延迟收益。
net.core.optmem_max 辅助缓冲区上限
单个套接字辅助数据(cmsg 等控制信息)缓冲上限;带辅助信息的通信(特定隧道/组播场景)可能受其约束。
vm.stat_interval 统计刷新间隔
内核更新虚拟机统计信息的间隔(默认 1 秒);/proc/vmstat 等视图按该节奏刷新,影响监控读数的时效性。
CPU 与调度
负载分析、上下文切换与绑核策略
load average 负载均值解读
1/5/15 分钟负载指数平均:统计运行队列与不可中断(D 状态)任务;必须与 CPU 核数比较才有意义。
top 中 CPU 各项含义
CPU 行的 %us/%sy/%wa/%hi/%si/%st 等字段:分别对应用户态、内核态、I/O 等待、硬中断、软中断与虚拟化窃取。
lscpu 查看 CPU 拓扑
输出 CPU 架构、插槽/核/超线程数、频率、缓存与 NUMA 信息;核对物理核与逻辑核的基础命令。
vmstat:cs 列与 r/b 队列
vmstat 输出中 r(运行队列)、b(不可中断任务)、in(中断)、cs(切换)四列联读,快速判断调度压力类型。
CFS 调度器与 vruntime
完全公平调度(CFS)以 vruntime 排序选择任务:权重(由 nice 映射)影响 vruntime 增速,从而决定 CPU 分配比例。
上下文切换开销与观测
任务切换需要保存/恢复寄存器与栈并损失缓存局部性;切换量远超业务规模时通常是锁竞争或调度异常的信号。
nproc 可用处理单元数
返回进程当前可用的处理单元数量(受亲和性与 cgroup 配额影响),是设置并发 worker 数的常用基准。
pidstat -w 进程级切换分析
按进程/线程统计自愿(cswch)与非自愿(nvcswch)上下文切换,是定位「谁在疯狂切换」的直接工具。
/proc/stat 累计计数解读
内核累计统计:每核 cpuN 行的 user/nice/system/idle/iowait/irq/softirq/steal,以及 ctxt、processes 等汇总计数。
sched_rt_runtime_us 实时带宽限制
SCHED_FIFO/SCHED_RR 任务在每个 sched_rt_period_us(默认 1s)内最多可占用的 CPU 时间(默认 950000us,即 95%),防止实时任务饿死普通任务。
/proc/loadavg 字段速读
实时负载视图:三个均值 + 当前运行任务/总任务数 + 最近创建进程 PID,排查时可即时判断忙闲。
sched_min_granularity_ns 最小调度粒度
CFS 下单个任务被抢占前的最短运行时间(默认 3ms 量级),限制时间片下限,避免频繁唤醒场景的切换开销失控。
sched_latency_ns 调度周期
CFS 的目标调度周期(默认 24ms 量级):周期内每个可运行任务至少获得一次调度;任务数决定实际时间片。
EEVDF 调度器(6.6 起)
内核 6.6 起默认调度器演进为 EEVDF(最早合格虚拟截止时间),改善延迟敏感任务的选择;调参项迁移到 sched_base_slice 等。
sched_wakeup_granularity_ns 唤醒抢占粒度
唤醒的普通任务抢占当前任务所需的最小虚拟时间差(默认 1ms 量级);调小让唤醒任务更快上台,调大减少抢占抖动。
cgroup v2 cpu.max CPU 限额
cpu.max 形如 "50000 100000":每 100ms 周期最多使用 50ms CPU(约 0.5 核);是容器与 systemd 服务限核的现行接口。
隔离核:isolcpus / nohz_full / rcu_nocbs
组合内核参数把指定核从常规调度均衡、时钟滴答与 RCU 回调中隔离,供延迟敏感任务独占,需配合显式绑核使用。
sched_migration_cost_ns 迁移代价窗口
任务刚被迁移后的缓存热窗口(默认 0.5ms 量级):窗口内调度器倾向不再迁移该任务,减少跨核缓存失效。
chrt 设置调度策略与优先级
查看或设置进程调度策略:FIFO(-f)/RR(-r)/BATCH(-b)/IDLE(-i)/OTHER(-o);-p 改运行中进程,直接带命令则启动新进程。
cgroup v2 cpu.weight 相对权重
cpu.weight 是 CPU 时间的相对份额(默认 100,范围 1-10000);仅在多组竞争 CPU 时按权重分配,空闲时不设上限。
cgroup v2 cpuset 核心与节点绑定
cpuset.cpus 与 cpuset.mems 把一组任务限定在指定 CPU 与 NUMA 节点上运行,属于硬性隔离,常用于核心独占。
cpufreq 调频调速器
governor 决定 CPU 频率如何随负载变化:performance 恒高频、powersave 最低频、schedutil 由调度器驱动;低延迟场景常固定 performance。
CPU 使用率高排查流程
按层级排查:系统整体 → 具体进程 → 具体线程 → 函数级热点 → 归因(计算/系统调用/锁/GC),每步都有对应工具。
sched_nr_migrate 批量迁移任务数
单次负载均衡操作中最多尝试迁移的任务数(默认 32);大量短命任务场景影响均衡效率与单次暂停时长。
nice / renice 调整普通优先级
nice 值 -20..19(越小优先级越高);普通用户只能调大 nice,调小需要 CAP_SYS_NICE;renice 立即生效但不持久。
taskset 绑定 CPU 亲和性
用掩码或 -c 列表把进程限制在指定 CPU 上运行,减少跨核迁移与缓存失效;systemd 服务可用 CPUAffinity 持久化。
平均负载高但 CPU 空闲的排查
Linux 的平均负载把不可中断睡眠(D 状态,多为等 IO)计入;负载高而 CPU 空闲通常是磁盘或网络文件系统阻塞。
systemd 单元 CPU 资源控制
systemd 通过 CPUQuota/CPUWeight/AllowedCPUs/TasksMax 等指令在单元级限制资源;set-property 即时生效并生成 drop-in 持久化。
温度与降频排查
CPU 因温度或功耗墙降频时表现为性能下滑、频率低于标称;从 thermal zone、dmesg 与 /proc/cpuinfo 三处交叉验证。
软中断与 ksoftirqd 排查
网络与块设备的收尾工作在软中断中完成;压力高时 ksoftirqd 线程接手处理,单核 si 高往往对应中断集中或包处理风暴。
numa_balancing 自动 NUMA 均衡
内核自动把任务与内存页向访存更近的节点迁移;开启可改善通用负载的跨节点访问,确定性的内存密集负载常关闭改为手工绑定。
numactl 绑定核与内存节点
numactl --physcpubind 限定逻辑核、--membind/--preferred 控制内存节点;--localalloc 让分配尽量就近,降低跨节点延迟。
PREEMPT_DYNAMIC 抢占模型
PREEMPT_DYNAMIC 允许同一内核在启动时或运行时切换抢占模型(voluntary/full 等),在吞吐与内核态延迟间取舍。
soft lockup 排查
某 CPU 长时间不让出调度时内核报 soft lockup(dmesg 可见 BUG: soft lockup),常见于驱动或内核路径长时间占用/关抢占。
tuna 查看与调整线程/中断亲和
tuna 可列出线程与 IRQ 的当前 CPU 亲和性并批量移动,常用于把中断与工作线程固定到指定核心,减少干扰。
vmstat 的 r 列:运行队列长度
r 列是等待运行的进程数(含正在运行);持续大于逻辑核数说明 CPU 侧排队,需要结合 cs/in 列区分缺 CPU、锁竞争还是中断风暴。
cgroup v2 cpu.stat 节流诊断
cpu.stat 提供 usage_usec、nr_periods、nr_throttled、throttled_usec 等计数;nr_throttled 增长说明任务反复撞上 cpu.max 限额。
cgroup v2 pids.max 进程数限制
pids.max 限制 cgroup 内可创建的进程与线程总数,防 fork 炸弹;触顶后 fork/clone 返回 EAGAIN。
intel_pstate 驱动与 EPP
Intel 平台默认使用 intel_pstate(active 模式),governor 退化为 performance/powersave 两档,功耗与延迟平衡由 EPP 偏好控制。
turbostat 频率与 C-state 观测
turbostat 直接读取 MSR 输出每核实际频率、C-state 驻留与功耗估算,是验证调频/降频是否生效的量化工具。
用户态与内核态占比判读
us/sy 比例定位 CPU 消耗归属:用户态高是应用计算,内核态高指向系统调用、锁竞争、页错误或网络栈处理。
kworker 高占用排查
kworker 线程执行内核延迟工作(IO 完成、驱动任务等);持续高占用通常意味着存储/网络路径上有持续负载或驱动问题。
irqbalance 中断均衡服务
irqbalance 自动把硬件中断分散到各核心,减少单核软中断热点;与手动 IRQ 亲和性设置冲突时需二选一。
中断亲和性手动绑定
把网卡/块设备中断固定到指定核,降低单核 softirq 热点;/proc/interrupts 看计数分布,smp_affinity_list 写核列表。
threadirqs 中断线程化
内核参数 threadirqs 让大部分中断处理程序以内核线程运行,可对其设置调度策略与亲和性,便于控制中断抖动。
PSI CPU 压力指标
Pressure Stall Information(内核 4.20+)在 /proc/pressure 下量化任务因等 CPU/IO/内存而停顿的比例,avg10/60/300 便于看趋势。
sched_debug 调度器视图
/proc/sched_debug 展示每 CPU 运行队列、当前任务、负载与调度域,用于确认绑核、隔离与负载分布是否按预期生效。
sched/features 调度特性开关
部分调度特性通过 debugfs 的 /sys/kernel/debug/sched/features 暴露,可临时开关用于定位回归;属于调试接口非稳定 ABI。
cpuidle 空闲状态管理
空闲时 CPU 进入的 C-state 深度由 governor 与延迟容忍决定;深睡省电但唤醒慢,延迟敏感场景可用 latency 限制或调换 governor。
steal time 判读(虚拟化)
虚拟机 CPU 时间被宿主或其他租户抢占的部分记为 steal;持续偏高说明资源超卖或邻居争抢,虚机内部优化无法根治。
cyclictest 实时延迟测量
cyclictest 以高精度定时器循环唤醒并测量实际延迟,输出 Min/Avg/Max,是评估系统调度抖动的常用量化手段。
实时优先级权限(rtprio 限制)
普通用户设置实时策略需要 rtprio 资源限制(ulimit -r);权限不足时 sched_setscheduler 返回 EPERM,systemd 服务用 LimitRTPRIO 放行。
sched_rr_timeslice_ms 轮转时间片
SCHED_RR 每个时间片的长度(默认 100ms);FIFO 不轮转,RR 在片用完或更高优先级任务到来时让出。
线程级排查:ps -eLf / top -H
按线程维度观察 CPU 占用:ps 用 LWP 列、top -H 显示线程;定位热点线程后再用 perf 等工具深挖。
pidstat -t 线程级统计
sysstat 的 pidstat 可按线程输出 CPU 与上下文切换数据,适合定位多线程服务中的热点线程与切换大户。
cpupower 频率与 C-state 管理
cpupower 提供频率策略设置(frequency-set)、信息查询(frequency-info)、空闲状态统计与监视(idle-info / monitor)等能力。
mpstat 每核利用率与中断分布
sysstat 的 mpstat -P ALL 展示每逻辑核的 usr/sys/iowait/soft/steal;-I 汇总中断统计,用于发现单核热点与中断集中。
调度调参方法论
调度类调参流程:先录制参数基线,再明确目标指标(延迟/吞吐),一次只改一项,用压测对比,未达标即回退。
schedstat 调度统计
开启 CONFIG_SCHEDSTATS 后可读 /proc/schedstat 与 /proc/<pid>/schedstat,观察运行时长、排队等待与迁移计数,验证调度行为。
CPU 逻辑核上下线
通过 /sys/devices/system/cpu/cpuN/online 动态启用/关闭逻辑核,用于故障隔离、维护或演练;下线前任务会被迁走。
内存与 OOM
内存分布、缓存回收与 OOM 排查
vm.overcommit_kbytes 固定提交上限
overcommit_memory=2 时可改用固定字节数作为提交上限(非 0 时优先于 overcommit_ratio),适合需要精确控制可提交内存的机器。
vm.watermark_scale_factor 回收水位间距
决定 kswapd 提前回收的积极程度:各 zone 的 low 与 high 水位间距按内存规模乘以该系数(默认 10 即 0.1%),调大让回收更超前。
vm.compaction_proactiveness 主动碎片整理
内核主动做内存碎片整理的积极度(0-100,5.18 起默认 20);也可向 /proc/sys/vm/compact_memory 写值手动触发一次全局整理。
Transparent HugePage 全局开关
/sys/kernel/mm/transparent_hugepage/enabled 控制 THP:always 全局启用、madvise 仅对声明区间启用、never 关闭;数据库类负载常选 madvise/never。
cgroup v2 memory.max 硬上限
内存硬限额:用量触顶时先在组内回收,无法满足则触发 cgroup 级 OOM;是容器与关键服务内存隔离的主力接口。
cgroup v2 memory.min/low 保底
memory.min 为硬保底:内存短缺时该组内存不会被回收;memory.low 为软保底:仅在别无选择时才回收。用于保护关键服务的最小工作集。
set_mempolicy 与 mbind 应用级 NUMA 策略
应用可通过系统调用设置 NUMA 内存策略:MPOL_DEFAULT 默认、MPOL_BIND 绑定节点、MPOL_PREFERRED 优先、MPOL_INTERLEAVE 交错分布。
内存分配失败的分层排查
ENOMEM/EAGAIN 报错按层排查:进程地址空间限制(ulimit -v)→ cgroup 限额 → overcommit 模式 → max_map_count → 碎片/大页。
/proc/buddyinfo 碎片观测
按内存区和阶数展示空闲块数量;高阶块(order 5 以上)长期为 0 说明碎片化严重,大页与高阶分配会很吃力。
THP defrag 碎片整理策略
defrag 决定为凑 2MiB 大页是否同步整理内存:always/defer/madvise/never;always 可能造成明显延迟尖峰,defer 后台异步处理。
静态大页(HugePages)配置
通过 vm.nr_hugepages 预留固定数量的大页供应用显式使用(MAP_HUGETLB / SHM_HUGETLB),避免运行时分配 2MiB 连续内存的碎片问题。
MADV_HUGEPAGE 按需启用大页
应用对特定内存区间声明 MADV_HUGEPAGE 启用、MADV_NOHUGEPAGE 关闭 THP,在全局 always 之外获得按需控制能力。
oom_score_adj 调整 OOM 倾向
在 -1000..1000 范围调整进程被杀倾向:负值降低(保护),正值提高(可牺牲);systemd 服务可用 OOMScoreAdjust 固化。
dmesg OOM 日志解读
OOM 触发时 dmesg 会打印节点/memcg 内存概况、进程 rss 与 oom_score,最后才是 Killed process 结论行。
cgroup v2 memory.high 软限额
软限制:超过后抑制分配、强制回收,进程变慢但不直接被杀;适合“先刹车”再观察的过渡手段。
cgroup v2 memory.stat 构成分析
memory.stat 拆分内存构成:anon、file、slab、shmem 及 pgscan/pgsteal、pgmajfault 等,用于区分泄漏(anon 涨)与缓存(file 涨)。
/proc/meminfo 关键字段解读
关注 MemTotal/MemFree/MemAvailable/Buffers/Cached/Slab(SReclaimable/SUnreclaim)/Committed_AS/CommitLimit 的组合,而不是单看 MemFree。
创建并启用 swap 文件
在磁盘上创建 swap 文件并启用:fallocate 建文件(或 dd 兜底)→ chmod 600 → mkswap → swapon,写入 fstab 持久化。
zram 压缩内存交换
把一部分内存做成压缩块设备当 swap 使用:换出页压缩存放,减少真实磁盘 IO,用 CPU 换内存,适合内存紧张而 CPU 富余的场景。
kswapd 回收线程排查
kswapd0 负责后台回收;持续高 CPU 说明内存压力大或水位配置导致长期回收,应结合回收计数与 PSI 判断而非直接调参。
直接回收(allocstall)诊断
分配内存失败时内核在分配路径上同步回收,造成延迟尖峰;allocstall 计数增长即表示发生过直接回收。
slab 增长与内核泄漏排查
定位内核对象泄漏:slabtop 找持续增长缓存 → 读 /sys/kernel/slab/<cache>/ 的 objects → 必要时启用 kmemleak 扫描。
应用内存泄漏定位(smaps 差分)
对进程做 smaps_rollup 定期采样做差:anon/private 持续增长指向应用分配泄漏,file 增长多为缓存;再用 pmap 找具体增长段。
MADV_DONTNEED / MADV_FREE 主动释放
应用用 madvise 主动释放区间页:DONTNEED 立即丢弃(文件页可重读、匿名页数据丢失),FREE 延迟回收但在内存紧张前保留数据。
glibc 内存归还(arena 与 malloc_trim)
多线程 glibc 应用 RSS 偏高常与 per-thread arena 有关:可用 MALLOC_ARENA_MAX 限制 arena 数量,或调用 malloc_trim(0) 主动归还空闲堆。
vm.watermark_boost_factor 瞬时抬升水位
按比例临时抬高低水位,缓解碎片化时的分配失败;属于瞬态缓冲,不是长期给系统多留内存的手段。
vm.extfrag_threshold 碎片判定阈值
高阶分配失败时用于判断该优先碎片整理还是直接回收的阈值(默认 500);判定依赖内核的碎片指数,一般无需调整。
/proc/zoneinfo 水位与页状态
逐 zone 展示 min/low/high 水位、free 页与活跃/非活跃页统计,用于判断水线是否健康、是否长期贴着低水位运行。
khugepaged 合并线程观测
khugepaged 后台把连续 4KiB 页合并为 2MiB 大页;pages_collapsed 持续增长说明合并活跃,合并过程可能影响相关进程的延迟。
cgroup v2 memory.swap.max 限制
限制该组可使用 swap 的上限;设为 0 表示该组不使用 swap,让内存压力以更早的 OOM 暴露而非长期抖动。
cgroup v2 memory.oom.group 整组终止
设为 1 时该 cgroup 发生 OOM 会整组一起被终止,避免组内部分进程死亡留下的不一致状态,适合不可分割的工作负载。
cgroup v2 memory.events 事件计数
记录 low/high/max/oom/oom_kill 等事件累计次数;max 与 oom_kill 增长说明限额曾被打穿,high 增长说明发生过节流。
cgroup v2 memory.current 与 peak
memory.current 是当前用量(含缓存),memory.peak(5.19+)记录峰值;用峰值判断与限额的安全距离比瞬时值可靠。
内存压力 PSI(/proc/pressure/memory)
量化因内存不足导致的停顿:some 表示至少一个任务受影响,full 表示所有任务都被回收阻断;avg300 适合看长期趋势。
/proc/vmstat 内存计数速查
pgpgin/pgpgout、pswpin/pswpout、pgmajfault、pgscan_direct、allocstall、oom_kill 等累计计数是做趋势与告警的原始数据。
缺页统计(minor / major fault)
次缺页(minor)在内存中解决页表映射,主缺页(major)需要磁盘 IO;major fault 速率直接影响应用延迟。
swapoff 的风险与步骤
关闭 swap 会把已换出的页全部读回物理内存;若余量不足将触发 OOM,操作前必须核对 MemAvailable 与 Committed_AS。
zswap 前端压缩缓存
换出页先进入压缩内存池,命中则免去磁盘写;池满后按策略回写后端 swap,属于“前置换出缓存”机制。
回收效率指标 pgscan/pgsteal
pgscan 是扫描页数、pgsteal 是成功回收页数;两者比值反映回收效率,效率低说明扫描的多是不可回收或高频访问页。
手动清理页面缓存
向 /proc/sys/vm/drop_caches 写 1(页缓存)/2(dentry、inode)/3(两者)触发清理;用于测试或演示,生产需评估副作用。
smaps_rollup 进程内存汇总
/proc/<pid>/smaps_rollup 汇总 Rss/Pss/Shared/Private 等字段,读取开销远小于全量 smaps,适合定期采样做差定位增长。
numastat 跨节点访问统计
按节点统计 numa_hit/miss/foreign 等命中情况;foreign 与 miss 持续偏高说明跨节点访问多,是 NUMA 调优的信号。
tmpfs 占用内存排查
tmpfs 上的文件直接消耗内存并计入 Shmem;df 看用量、du 找文件、/proc/meminfo 的 Shmem 看总量,容器 /dev/shm 与 /tmp 是高发区。
/dev/shm 与共享内存限制
/dev/shm 是 tmpfs 挂载点,进程间共享内存常放这里;默认尺寸与容器参数相关,共享段用 ipcs 查看。
mlock 锁定内存
mlock/mlockall 把页面锁定在内存中避免换出,用于低延迟场景;受 RLIMIT_MEMLOCK 限制,服务可配 LimitMEMLOCK。
kdump 崩溃转储配置检查
内核崩溃时由 kdump 捕获 vmcore 供 crash 分析;需要预留 crashkernel 内存并启用相应服务,确认转储目标空间充足。
KSM 同页合并
Kernel Samepage Merging 扫描并合并内容相同的页,节省内存(虚拟化场景常见),代价是 CPU 扫描开销。
大页使用量核对
/proc/meminfo 的 HugePages_Total/Free/Rsvd/Surp 显示预留与使用情况;Surp 为超额分配预留计数,长期大量 Free 表示预留浪费。
oom_kill 计数与内存告警
/proc/vmstat 的 oom_kill 计数累计系统内 OOM 次数;做增量监控可在业务无感知前发现内存问题。
MemAvailable 与 free 的差异
MemAvailable 是内核基于可回收缓存与 slab 估算的可用量(free 的 available 列),比 MemFree 更能代表还能分配多少;完整空闲只是 MemFree。
swap 换入换出判读(si/so)
vmstat 的 si/so 是换入换出速率;持续非零说明内存紧张,伴随延迟升高时要考虑扩容或调整内存策略,而非只调 swappiness。
swap 设备优先级
多块 swap 用 pri 决定使用顺序:数值大的优先使用;swapon --priority 立即生效,fstab 里写 pri= 持久化。
slabtop 内核缓存观测
按占用排序展示 slab 对象缓存(dentry、inode 等),是定位内核态内存增长来源的第一站。
ps 内存列含义:VSZ 与 RSS
VSZ 是虚拟地址空间大小(可能大部分未使用),RSS 是常驻物理页(包含共享页);多进程相加大于物理内存属于共享重复计数。
pmap 进程映射明细
逐段列出进程地址空间的映射与 RSS/Dirty,定位大块匿名映射、文件映射或异常增长段。
smem 的 PSS 报表
smem 以 USS/PSS/RSS 三个口径输出进程与用户内存报表,PSS 按共享比例分摊,适合多进程共享库场景的真实占用评估。
Buffers 与 Cached 的区别
Buffers 是块设备元数据缓存,Cached 是文件内容与 tmpfs 的缓存;free 的 buff/cache 为两者合计,大部分可回收、tmpfs 部分不可。
vmtouch 页面缓存探查与预热
vmtouch 可查看文件/目录在页缓存中的覆盖率,也可预热(-t)或驱逐(-e)缓存,用于验证缓存命中和控制内存占用。
磁盘与 IO
IO 调度器、文件系统与磁盘瓶颈
块设备 IO 调度器切换
单队列与多队列调度器名称不同:none(直通,NVMe 常用)、mq-deadline(默认折中)、bfq(交互友好)、kyber。
fio 基准测试入门
fio 用参数化 job 描述负载:rw 指定读写模式、bs 块大小、iodepth 队列深度、numjobs 并发、direct=1 绕过缓存。
iostat -x 关键列解读
r/s、w/s 是每秒请求数;await 是平均完成时间(含排队);aqu-sz 是平均队列深度;%util 是设备忙碌时间比例,多列合看才准确。
fio 延迟与百分位解读
fio 报告含 IOPS、带宽与 lat/clat 分布;关注 clat percentiles 的 P99/P99.9,均值会掩盖尾延迟问题。
cgroup v2 io.max / io.weight
io.max 按设备限速(rbps/wbps/riops/wiops),io.weight 分配 IO 权重;设备用主:次号(如 8:0)标识。
iowait 高排查步骤
按顺序排查:确认 iowait 与 steal 占比 → 找 IO 进程 → 看设备指标 → 评估内存回收干扰,避免直接归因存储。
blktrace 块层跟踪
采集块设备事件流(Q/G/I/D 等阶段),blkparse 可读输出;配合 btt 分解 Q2C 延迟定位慢在排队还是设备。
/proc/diskstats 字段速览
每设备一行:读完成数、读合并、读扇区、写完成数、写扇区、在途请求、IO 时间与加权时间等,是 iostat/sar 的数据源。
预读参数 readahead
预读让顺序读提前加载数据;两种口径:blockdev --setra(512B 扇区)与 /sys/block/<dev>/queue/read_ahead_kb(KiB)。
nr_requests 队列深度
每设备允许排队的请求数上限;调大提升突发吞吐但抬高峰值延迟,NVMe 默认往往已较大。
SSD TRIM 与 fstrim 定时任务
TRIM 让 SSD 感知已删除块以维持性能:可手动 fstrim、启用挂载选项 discard,或依赖 fstrim.timer 周期性执行。
挂载选项 noatime 减少写放大
noatime 省去每次读触发的访问时间写回;relatime 是常见折中(更早或超过一天才更新),多数发行版默认已是 relatime。
dd 快速顺序读写测试
用 dd 做顺序写/读基准:of 指定目标、oflag/iflag=direct 绕缓存、conv=fsync 强制落盘;看最终 MB/s 估算吞吐。
SMART 磁盘健康检查
smartctl -H 快速健康判定,-A 看关键属性(重分配扇区、待映射扇区、介质错误、温度);属性号随厂商不同。
NVMe 设备健康与清单
nvme list 列出命名空间,nvme smart-log 读取温度、已用寿命百分比与介质错误计数,是 NVMe 设备的第一手健康数据。
inode 耗尽排查(df -i)
空间足够却无法创建文件常见于 inode 用尽;df -i 看用量,find 统计小文件密集目录。
df 卡住的挂载点排查
df 卡在某个挂载点通常是被挂起的网络文件系统(NFS/CIFS/FUSE);用 df -l 绕过网络挂载,findmnt 列出来源。
定位大目录与大文件
du 按目录汇总排序找大目录(-x 限制同一文件系统),find 按大小筛大文件;两者配合快速定位空间去向。
稀疏文件与 du/ls 差异
稀疏文件逻辑大小远大于实际占用:ls 看逻辑、du 看实际块;打包传输要用支持稀疏的工具保持体积优势。
ionice 设置 IO 调度类
ionice 调整进程 IO 类别:-c1 realtime、-c2 best-effort(-n 0-7 优先级)、-c3 idle(仅空闲时使用磁盘)。
fsync 尾延迟观测
应用 fsync/fdatasync 的耗时决定写入确认延迟;用 strace -T 看单次耗时,或在写入路径上叠加监控观察 P99。
tune2fs 查看 ext4 参数
tune2fs -l 只读查看 ext4 超级块信息(保留块比例、挂载计数、特性、日志),评估保留空间与维护状态。
iostat 间隔采样与单位
iostat 首次输出是自启动以来的均值,后续为区间值;用 -m 换可读单位、-d 只看设备、-p 显示分区。
iotop 进程级 IO 观测
按进程显示读写速率与等待占比;-o 只看有活动的进程、-P 按进程而不是线程、-b -n 用于脚本采样。
pidstat -d 进程 IO 统计
sysstat 的 pidstat -d 输出每进程读写 KB/s 与 IO 等待,适合定位“哪几个进程在打盘”。
vmstat 的 IO 列判读
bi/bo 是每秒进出块设备的块数,wa 是 CPU 等待 IO 的时间比例;bi/bo 高且 wa 高通常意味着 IO 路径是瓶颈。
sar -d 历史磁盘指标
sysstat 若启用采集,可用 sar -d 回看任意时点的磁盘 tps、读写扇区、await、util,适合事后复盘与容量趋势。
sar -b IO 总览行
tps 是每秒 IO 请求数,rtps/wtps 是读写请求速率,bread/s、bwrtn/s 是扇区吞吐;适合快速判断压力方向。
设备类型确认(rotational)
/sys/block/<dev>/queue/rotational 标记设备是否旋转(1 机械、0 SSD/虚拟);调度器与预读策略常按它选择。
hdparm 盘测速与写缓存状态
hdparm -tT 分别测缓存与磁盘读取速度、-W 查看写缓存开关;主要面向 ATA/SATA 设备。
已删除仍占空间的文件
df 显示满、du 却对不上:进程仍持有已删除文件句柄;lsof +L1 按链接数筛选,释放需要进程重新打开或重启。
filefrag 文件碎片查看
filefrag -v 列出文件 extent 数量与分布;extent 数量异常多说明碎片化,可能拖慢顺序读。
网络栈调优
队列、拥塞控制与连接数优化
监听队列溢出诊断
客户端报连接超时、服务日志出现握手失败时,用溢出计数与 ss 队列读数区分 SYN 队列满还是 accept 队列满,再决定调参数或改应用。
TIME-WAIT 堆积诊断
短连接服务出现大量 TIME-WAIT 时, 先量化数量与端口分布, 再判断是否真的影响端口可用性, 避免盲目关闭时间等待。
网卡中断亲和与队列绑定
/proc/interrupts 里每个网卡队列有独立中断号, 把中断绑定到固定核可减少迁移开销, 并可与收包应用同 NUMA 规划。
net.core.netdev_budget 软中断预算
每轮网络软中断最多处理的包数与时间预算(netdev_budget / netdev_budget_usecs);高 PPS 丢包时可评估调整。
tcp_limit_output_bytes 与排队延迟
该参数限制单个 TCP socket 在内核 qdisc 上可排队的字节数, 是权衡吞吐与本地排队延迟的重要开关。
UDP 收发错误计数定位
UDP 丢包不报错, 需要靠内核计数器区分: 缓冲不足、端口未监听还是校验错误, 再对症处理。
/proc/net/softnet_stat 丢包定位
网卡到协议栈之间的丢包会统计在 softnet_stat: 第二列增长代表 backlog 溢出, 第三列增长代表软中断预算耗尽。
net.ipv4.tcp_sack 选择性确认
SACK 让接收方通告缺口以外的已收数据,重传只补丢失段;默认开启,是高速链路丢包恢复的基础机制。
net.ipv4.tcp_notsent_lowat 发送缓冲水位
控制发送队列中未发送字节的阈值:低于阈值才通知应用可写,用于抑制缓冲区膨胀(bufferbloat)与控制内存占用。
net.netfilter.nf_conntrack_buckets 哈希桶
连接跟踪表的哈希桶数量,影响查找效率与内存;与 nf_conntrack_max(上限)是两个维度。
连接跟踪表满诊断
nf_conntrack_count 接近 nf_conntrack_max 时,新连接会被丢弃并出现 table full 日志;先治连接泄漏再谈扩容。
nf_conntrack_tcp_timeout_established
已建立连接的表项保持时间(默认 432000 秒即 5 天);调小加快回收,避免表项被长连接长期占用。
net.ipv4.ipfrag_high_thresh 分片重组内存
IP 分片重组占用的内存上限(配套 low_thresh 触发回收);隧道、VPN、大数据包路径出现分片时关注其压力。
发送缓冲写阻塞定位
应用 write/send 偶发卡住不返回, 常见原因是发送缓冲已满且对端读取慢; 用 ss -m 观察 socket 排队量与缓冲上限。
net.ipv4.tcp_dsack 重复 SACK
D-SACK 让接收方报告重复收到的数据段,发送方可据此识别伪重传与网络重复包,修正拥塞窗口判断。
net.ipv4.tcp_adv_win_scale 窗口换算
决定接收缓冲中协议开销与可用窗口的换算比例(默认 1);影响通告窗口的估算方式,属于底层微调项。
net.ipv4.tcp_moderate_rcvbuf 自动调节
接收缓冲自动调节开关(默认 1):根据连接速率动态扩缩 rcvbuf;关闭后缓冲固定为初始值,容易限制吞吐或浪费内存。
net.ipv4.tcp_rfc1337 TIME_WAIT 防护
按 RFC 1337 处理 TIME_WAIT 状态的可疑 RST,避免连接被过早终止;默认 0(关闭),高安全要求场景可启用。
net.ipv4.tcp_max_orphans 孤儿套接字上限
限制未附着到用户进程的 TCP socket 数量,防止本地资源耗尽;超出时连接会被重置并在日志中体现。
net.ipv4.tcp_retries2 重传上限
未被确认的重传次数上限(默认 15),决定连接多久被判死(分钟级);调小能更快感知断链,也可能误杀慢链路。
net.ipv4.tcp_rto_min / tcp_rto_max
RTO(重传超时)的上下限:默认下限 200ms、上限 120s;内核按 RTT 计算实际值并在区间内收缩。
net.ipv4.udp_mem 全局内存三值
UDP 全局内存水位(min/pressure/max,单位页);高吞吐 UDP 服务丢包排查时需结合 sockstat 核对缓冲使用。
net.core.rmem_default 默认接收缓冲
未显式 setsockopt 时 socket 的初始接收缓冲;与 rmem_max 是上限的关系,应用可按需覆盖。
net.core.wmem_default 默认发送缓冲
socket 初始发送缓冲;高带宽单流场景常需应用显式调大 wmem,而不是只改全局默认。
net.ipv4.icmp_ratelimit 响应限速
限制内核发送 ICMP 响应的频率(默认 1000ms 的间隔基数,配合 icmp_msgs_per_sec),用于抑制 ICMP 放大与滥用。
TCP_DEFER_ACCEPT 减少空连接唤醒
让内核在收到首个数据包后再唤醒 accept, 减少对空连接轮询与唤醒开销, 适合先连接后发数据的服务。
socket 缓冲与带宽延迟积估算
高 RTT 链路上单流吞吐受限, 往往是 socket 缓冲小于带宽延迟积; 先估算目标 BDP, 再设置收发缓冲。
net.core.netdev_budget_usecs 软中断时间预算
softirq 每轮处理收包的时间预算(微秒), 与按包数限制的 netdev_budget 配套; 突发场景 underrun 时评估提高。
nf_conntrack UDP 超时调优
UDP 会话在连接跟踪表里的存活时间由独立超时控制; 过长会堆积死条目, 过短会回收仍在通信的长会话。
arp_ignore 与 arp_announce 场景配置
多网卡与浮动 IP 场景控制 ARP 应答与宣告行为, 不当配置会造成地址漂移冲突或 VIP 不可达。
抓包文件离线分析流程
线上只负责采集, 分析放到离线: 用 tshark 统计与过滤能力定位重传、窗口与响应时间问题。
TLS 握手延迟测量
用 openssl s_client 观察握手过程与协商结果, 结合 time 命令量化握手开销。
多路径 ECMP 哈希策略
ECMP 场景下哈希字段决定流量分布: L3 哈希对单一大流稳定, 短连接多时评估 L4 哈希改善均衡。
应用侧 TCP keepalive 参数
在单个连接上开启保活并定制空闲、间隔与次数, 用于快速回收异常对端连接。
TCP_USER_TIMEOUT 控制未确认数据等待
应用级超时接口: 设置后, 已发送数据在指定毫秒内未获确认即断开连接, 用于卡死连接的快速回收。
tcp_challenge_ack_limit 挑战 ACK 限速
限制内核响应盲窗口内可疑 ACK 的挑战 ACK 数量, 降低被利用做旁路探测的风险, 属安全侧参数。
tcp_invalid_ratelimit 无效报文响应限速
限制对无效 TCP 报文回送 RST 的速率, 缓解盲重置类攻击与反射, 支持毫秒级时间窗写法。
重传与超时诊断链路
区分快速重传与 RTO 超时两类现象: 前者多为丢包/乱序快速恢复, 后者代表超时重发, 影响更大。
fq_codel 出口排队与缓冲膨胀抑制
fq_codel 是常见默认 qdisc 之一, 通过公平排队与主动管理抑制本地出口排队延迟, 适合高并发发送的服务器。
网络调优闭环方法
网络参数调优需要基线、单变量变更与回滚记录: 先量化现状, 一次只改一项并用同一测量方法复测。
MTU 与分片问题定位
小包正常、大包卡住是典型 MTU 问题: 先确认接口 MTU 与路径 MTU, 再判断是否黑洞场景。
RPS/RFS 软件收包分发
单队列网卡或中断集中导致单核软中断打满时, 可用 RPS 把收包处理分散到多核, 再用 RFS 让同一条流固定到应用所在核。
XPS 发送队列绑定
XPS 把发送队列绑定到指定 CPU, 减少跨核发送时的队列竞争, 常与 CPU 亲和及中断布局一起规划。
ethtool 流哈希与 RSS 分布
多队列网卡按四元组做 RSS 哈希分流; 检查与调整流哈希输入字段, 可排查流分布不均与单队列热点。
/proc/net/snmp 协议计数速查
协议栈各层的累计计数来源: 头部行与数值行成对出现, 用列序对位解读重传、错误等指标。
多队列网卡队列数查看与调整
队列数影响收包并行度; 用 ethtool 查看当前与上限, 高 PPS 场景评估增加 combined 队列。
ethtool -S 网卡统计解读
驱动级计数器(丢包、错误、暂停帧)都在 ethtool -S: 针对性地筛选增长项, 判断问题在硬件侧还是协议栈侧。
ethtool 环缓冲查看与调整
网卡环形缓冲过小会丢突发流量, 过大会增加排队延迟; 用 -g 查看, -G 调整且立即生效。
中断合并参数调整
中断合并决定网卡攒包再中断的频率: 提高合并有利于吞吐, 降低或关闭更利于低延迟场景。
收发 offload 开关与抓包一致性
GRO/LRO 会把收到的数据段合并成大包, 抓包时看到超大帧属于正常合并结果; 需要逐包分析时再临时关闭。
发送队列丢弃与 txqueuelen
发送侧丢弃要区分本地队列满与物理链路丢包: ip -s link 的 TX dropped 与 tc 队列统计结合看, 再评估队列长度设置。
tc -s qdisc 出口队列读数
出口排队情况要看 qdisc 统计: backlog 表示当前排队字节, dropped/overlimits/requeues 提示限速与竞争情况。
conntrack 命令查看跟踪表
conntrack-tools 提供表内容、计数与事件流: 排查 NAT、丢连接、表容量问题时按条件过滤查看。
nftables 规则速查
现代发行版默认包过滤框架; 用 nft 检查与追加规则, 规则经 nft list ruleset 统一查看。
nftables flowtable 快速转发
转发与 NAT 场景下, flowtable 让已建立连接绕过完整协议栈路径, 以软件方式加速转发。
邻居缓存 GC 与 stale 时间
邻居表(ARP/ND)条目过期后先标记 stale 再回收; 用 ip neigh 与 gc_stale_time 排查地址无法解析与缓存积压。
邻居表故障定位
同网段部分地址不通时, 先看邻居表状态: FAILED 条目说明地址解析无响应, 结合 arping 与链路检查定位。
inet_peer 缓存参数概览
内核为对端 IP 维护共享缓存(如路径 MTU 等信息); inet_peer 系列参数控制其规模与回收节奏, 常规无需调整。
SO_REUSEPORT 多进程监听分流
多个进程绑定同一端口由内核按流哈希分流, 替代单进程 accept 的锁竞争; 监听前各进程都要设置该选项。
tcp_migrate_req 请求队列迁移
开启后, 同 REUSEPORT 组内某监听队列将满时, 内核可把新请求迁移到负载较低的监听者, 缓解单进程队列溢出。
tcpdump 常用过滤表达式
抓包的价值在于精准过滤: 按地址、端口、方向与 TCP 标志组合, 把噪声挡在抓取阶段之外。
内核丢包点追踪
怀疑协议栈内部丢包时, 追踪 skb:kfree_skb 丢弃原因, 直接定位丢在哪个子系统。
ip -s link 接口错误计数
接口级收发包与错误计数在 ip -s link: errors、dropped、missed 含义不同, 要分别对照驱动与协议栈层。
iperf3 TCP 吞吐测量
端到端吞吐基线工具: 服务端常驻, 客户端发起, 多流并行与双向模式覆盖不同场景。
iperf3 UDP 丢包与抖动测量
UDP 模式输出丢包率与抖动, 适合评估实时业务的路径质量; 服务端会给出双向统�计。
mtr 逐跳丢包与延迟
持续探测路径上每一跳的丢包与延迟; 判定丢包要观察从哪一跳开始且持续到终点。
netem 延迟与丢包模拟
在测试环境用 netem 注入延迟、丢包与乱序, 验证应用在弱网下的超时与重试逻辑。
tc tbf 出口限速
用令牌桶给出口限速, 模拟带宽约束或约束单机外发速率; burst 与 latency 决定突发容忍度。
ss -ti 解读单连接 TCP 状态
单连接吞吐或延迟问题时, ss -ti 输出的 cwnd、rtt、retrans 与发送队列是最直接的证据。
ss -s 传输层总览
快速查看 socket 总量与各类状态分布, 以及 socket 缓冲内存占用, 适合作为排查第一步。
curl 计时模板量化 HTTP 各阶段
用 -w 模板把 DNS、连接、TLS、首字节与总时长拆开, 定位延迟发生在链路还是服务端。
/proc/net/sockstat 速读
按协议汇总 socket 使用量: TCP inuse/orphan/tw/alloc 与内存占用, 适合脚本化采集。
nstat 差值观测协议计数
nstat 为内核网络计数器提供名称并按差值展示, 比原始 snmp 文件更适合连续观测。
网卡驱动与固件版本核对
驱动与固件版本影响 offload 支持与稳定性; 出现异常时先记录当前版本再寻求升级路径。
ipfrag_time 分片重组超时
控制分片报文在重组队列中的保留时间; 大量游离分片占用内存时, 评估缩短保留时间。
ip_nonlocal_bind 与浮动地址
允许进程绑定未在本机配置的地址, 供 VIP 漂移场景在地址未就位时先行绑定。
tcp_orphan_retries 与连接关闭
控制已无进程持有的连接重试次数; FIN_WAIT 类状态堆积时, 结合该参数与孤儿计数分析。
IPv6 关闭的完整做法
关闭 IPv6 需同时设置 all 与 default, 否则新接口仍可能启用; 关闭前评估依赖 v6 的服务。
bonding 链路状态检查
聚合接口问题先看 /proc/net/bonding: 模式、活动从口与各成员链路状态一目了然。
ping RTT 与抖动基线
延迟问题先用 ping 建立基线: 平均值与 mdev 波动是判断网络质量的第一步。
ethtool 流控(pause)查看与调整
链路层流控用暂停帧阻止对端继续发送, 突发场景可减少丢包, 但链路两端需协商一致。
nc 连通性探测与端口检查
从指定主机验证目标端口可达性: 服务端本地看监听, 客户端侧看路径与防火墙。
dig 解析耗时与解析器对比
解析延迟影响新建连接时间; 用 dig 的 Query time 对比不同解析器的响应表现。
跟踪表状态分布统计
按状态统计连接跟踪条目, 快速发现 SYN_RECV 堆积、大量 UNREPLIED 或关闭态残留。
listen() backlog 与应用层队列
应用 listen 的 backlog 决定内核为该监听 socket 保留的处理队列长度, 最终生效值受 somaxconn 约束。
SO_REUSEADDR 快速重启绑定
服务重启时避免因 TIME_WAIT 地址占用导致 bind 失败; 服务器监听 socket 常规设置项。
SO_LINGER 与主动 RST 关闭
SO_LINGER 控制 close 时未发送数据的行为: 超时归零可立即以 RST 关闭, 常规关闭则尽力发送。
TCP_MAXSEG 限制单段大小
按连接限制 TCP 最大段长, 隧道或特殊链路场景可避免超出路径能力, 常规环境保持默认。
TCP_QUICKACK 立即确认模式
对延迟敏感的请求响应型连接, 可开启立即确认减少等待; 默认延迟确认是为批量吞吐设计。
SO_RCVLOWAT 读唤醒阈值
控制 socket 可读事件的触发阈值: 提高后减少小报文唤醒次数, 适合批量读取且追求 CPU 效率的场景。
TCP_NODELAY 与交互延迟
小请求响应型连接可开启 TCP_NODELAY, 避免发送端攒包等待与延迟确认叠加造成额外往返。
按连接选择拥塞控制
在 socket 级选择拥塞控制算法, 相比全局切换影响面更小; 先用系统列表确认算法可用。
SO_BINDTODEVICE 绑定出口设备
把 socket 绑定到指定网络接口, 多网卡环境用于固定出口路径, 常与策略路由配合排查走向。
网络命名空间排查方法
容器网络问题先在对应 netns 内查看: 监听、地址、路由与宿主看到的可能完全不同。
veth 虚拟网卡对定位
veth 成对出现: 通过 iflink 找到对端口, 结合两侧统计判断丢包发生在容器侧还是宿主侧。
NAT 映射异常排查
NAT 相关丢连接看跟踪条目的双向字段与 UNREPLIED 标记, 结合后端服务与回程路由定位。
SYN_RECV 堆积诊断
半连接堆积常见于 SYN 队列满或来源伪造: 用状态计数与内核计数器交叉确认。
iptables 后端与规则来源核对
同一台机器可能存在 nft 与 legacy 两套后端: 先确认当前 iptables 命令的实际后端, 再看规则全貌。
性能分析工具
perf、sar、iostat 与火焰图思路
perf stat 总览用法
perf stat 给出执行窗口内的硬件与软件计数总览, 是判断 CPU 效率与瓶颈方向的入口命令。
perf stat 事件选择
通过 -e 选择硬件、缓存与软件事件: 缓存未命中与分支预测失败常用来锁定执行效率问题。
perf stat 间隔输出
用 -I 让计数按固定毫秒间隔输出, 把性能波动与时间线上的事件对齐。
perf stat 的观测目标
perf 支持按进程、线程、CPU 与系统范围选择观测对象: 定位问题前先明确观测边界。
perf record 与 report 采样工作流
采样记录后用 report 聚合热点: 这是 perf 的核心工作流, 频率与调用栈是质量关键。
perf top 实时热点
实时查看系统或进程内热点函数, 适合快速浏览当前 CPU 消耗分布。
perf 调用栈采集方式
-g 搭配 fp 或 dwarf 采集调用链, 决定火焰图与归因的可用深度。
perf annotate 下钻到指令/代码行
对热点函数做指令级注释, 观察具体指令的采样占比, 定位到代码行。
perf script 导出与管道处理
把采样数据导出为可读事件流, 供自定义统计或生成火焰图输入格式。
perf sched 调度延迟分析
记录调度事件并汇总等待与调度延迟, 定位运行队列竞争与唤醒延迟问题。
perf lock 锁竞争分析
采集内核锁事件并汇总竞争与等待耗时, 用于定位并发度提升后的瓶颈转向。
perf mem 内存访问采样
对访存进行采样, 区分加载/存储来源与层级, 支持内存带宽与缓存侧问题定位。
perf c2c 伪共享与缓存行竞争
通过缓存一致性事件定位伪共享: 多核之间对同一缓存行的竞争会在报告中显现。
perf trace 系统调用追踪
以低开销方式观测系统调用路径与耗时, 快速浏览进程与内核的交互。
perf list 事件检索
perf list 列出硬件、软件、缓存与 tracepoint 事件, 是写 -e 参数前的核对步骤。
perf probe 动态探针
在函数或代码行上动态添加 kprobe/uprobe, 用 perf record 采集命中次数或参数。
perf 符号与调试信息处理
热点显示为地址或 unknown 时, 需要核对符号来源: 调试信息、build-id 与内核符号路径。
perf report 排序与过滤
通过排序维度与过滤条件把报告聚焦到可行动的信息: 按进程、库或符号聚合。
perf diff 比较两次采样
对比两次 perf.data 的差异, 用于验证优化效果或定位版本间热点漂移。
perf + FlameGraph 火焰图流程
把 perf 采样导出后经 collapse 生成火焰图: 宽度代表采样占比, 层级代表调用栈, 用于整体归因。
BCC profile 生成 On-CPU 火焰图
profile 工具按栈采样并直接输出折叠格式, 省去 perf 导出步骤。
Off-CPU 火焰图定位等待
on-cpu 火焰图看不到阻塞; offcputime 按栈统计离开 CPU 的等待时间, 专治锁与 IO 等待。
bpftrace 入门与单行程序
bpftrace 用一行表达式描述内核事件统计, 适合临时观测: 运行到 Ctrl-C 后输出聚合结果。
bpftrace 常用一行速查
汇总高频单行: 按进程计数、按参数聚合与错误过滤, 覆盖日常快速观测。
bpftrace 直方图统计延迟
用 kprobe/kretprobe 配对测函数耗时, hist() 直接输出对数分布直方图。
bpftrace 追踪点浏览与使用
先列后查字段再写程序: tracepoint 稳定且带结构化参数, 是首选的观测点类型。
bpftrace 探针参数与返回值
kprobe 可用 argN 读取参数, kretprobe 用 retval 读取返回值; 用于没有追踪点的内核函数。
bpftrace 用户态探针
对应用二进制函数插桩, 观测用户态调用频率与返回耗时, 无需重启应用。
bpftrace On-CPU 采样
profile 探针按频率对运行中的 CPU 采样, 快速得到按栈的 CPU 占比。
BCC 工具集总览
BCC 提供一组开箱即用的 eBPF 工具, 覆盖进程、文件系统、块层、网络与调度观测。
execsnoop 短命进程追踪
捕获新进程的启动记录, 用于发现脚本拉起、定时任务与异常重试等难观测行为。
biolatency 块层延迟分布
按直方图统计块设备 IO 完成延迟, 判断存储侧延迟形态: 长尾还是整体抬高。
biosnoop 逐 IO 明细追踪
逐条显示块 IO 的进程、读写、扇区与延迟, 用于点名慢 IO 的来源进程。
ext4slower 慢文件操作追踪
只打印超过阈值的文件操作及其耗时, 定位偶发慢调用与涉及文件的进程。
runqlat 运行队列延迟分布
直方图展示任务可运行到实际获得 CPU 的等待, 直接反映调度侧压力。
offcputime 阻塞时间归因
按调用栈累计离开 CPU 的时间, 与 on-cpu 采样互补, 用于定位锁等待与 IO 阻塞。
tcpretrans TCP 重传追踪
实时打印发生重传的连接与地址, 把网络重传落到具体对端与状态。