第一部分:Linux 基础与系统原理
从 Linux 内核到容器运行时的完整技术栈解析
目录
第1章:Linux 进程、线程与调度机制
1.1 调度的本质:CPU 是稀缺资源
在任何系统中,CPU 是最核心的竞争资源。调度器(Scheduler)就是负责决定:
"在任意时刻,哪个任务(线程)能使用 CPU?"
Linux 内核的调度目标:
| 目标 | 说明 | 实现机制 |
|---|---|---|
| 公平性(Fairness) | 每个任务都有机会运行 | CFS 红黑树调度 |
| 效率(Efficiency) | CPU 不闲着 | 多核并行调度 |
| 实时性(Responsiveness) | 响应交互任务 | 优先级调度 |
| 可伸缩性(Scalability) | 支持多核、NUMA 架构 | 每 CPU 运行队列 |
1.2 进程与线程的核心区别
| 概念 | 进程 (Process) | 线程 (Thread) |
|---|---|---|
| 定义 | 操作系统分配资源的最小单位 | 操作系统调度执行的最小单位 |
| 地址空间 | 独立 | 共享(同一进程下线程共享堆) |
| 通信方式 | 管道、消息队列、共享内存 | 共享变量、锁、信号量 |
| 切换代价 | 高(涉及页表、上下文) | 低(共享内核对象) |
| 调度粒度 | 进程级 | 线程级 |
关键理解:Linux 中的线程,本质上仍是"轻量进程"(LWP)。系统通过 task_struct 统一表示进程/线程,只是 clone() 参数不同。
1.3 Linux 调度器(CFS)原理
1.3.1 运行队列 (Run Queue)
每个 CPU 核心维护一个 runqueue,内部是红黑树(rbtree)。
struct cfs_rq {
struct rb_root tasks_timeline; // 红黑树
struct sched_entity *curr; // 当前运行任务
u64 min_vruntime; // 最小虚拟运行时间
};
每个任务有一个 虚拟运行时间 vruntime,越小表示"更少被执行过"。
1.3.2 CFS 调度算法
核心思想:所有任务都共享 CPU 时间,尽可能公平分配。
工作流程:
- 计算每个进程的 vruntime
- 选择最小的 vruntime 任务执行
- 每执行一段时间(调度周期),更新 vruntime
- 若任务阻塞/退出/完成,红黑树重新平衡
权重(Nice 值):
| Nice 值 | 权重 | 占比 | 说明 |
|---|---|---|---|
| -20 | 88761 | 最多 | 最高优先级 |
| 0 | 1024 | 默认 | 普通优先级 |
| +19 | 15 | 最少 | 最低优先级 |
1.4 GMP 调度与 Linux 调度器的映射关系
Go 的 GMP 模型本质上是用户态协程调度,与 Linux CFS 的内核调度层叠关系:
| 层级 | 实体 | 调度对象 | 说明 |
|---|---|---|---|
| 用户态 | goroutine (G) | Go runtime 层 | 协程调度 |
| 中间层 | M(线程) | 映射到 OS 线程 | 系统线程 |
| 内核态 | CPU + CFS | 调度系统线程(M) | 内核调度 |
理解关键:
- Linux 调度的是线程 (M)
- Go runtime 调度的是 goroutine (G)
- G 被分配到 M,M 绑定到 P(调度器),最终落到 CPU
这就是为什么:
GOMAXPROCS≈ 同时运行的 M 数量- 若设置过大,会导致上下文切换频繁
- 若设置过小,CPU 利用率不高
1.5 NUMA(Non-Uniform Memory Access)影响
多 CPU 系统(尤其物理多路)会形成多个 NUMA 节点:
NUMA Node 0 NUMA Node 1
├── CPU 0-7 ├── CPU 8-15
├── Memory 32GB ├── Memory 32GB
└── PCIe 设备 └── PCIe 设备
性能影响:
- 本地 NUMA 节点访问:延迟 ~100ns
- 远程 NUMA 节点访问:延迟 ~300ns(3倍差异)
1.6 CPU 调度与容器化的影响
容器(cgroup)改变了调度粒度:
| 层级 | 控制器 | 功能 | 文件路径 |
|---|---|---|---|
| CPU 限制 | cpu.cfs_quota_us | 限制 CPU 时间配额 | /sys/fs/cgroup/cpu/ |
| CPU 周期 | cpu.cfs_period_us | 时间周期 | /sys/fs/cgroup/cpu/ |
| CPU 绑定 | cpuset.cpus | 绑定核 | /sys/fs/cgroup/cpuset/ |
| CPU 权重 | cpu.shares | 调整优先级 | /sys/fs/cgroup/cpu/ |
1.7 实战实验:进程调度分析
实验1:查看当前系统调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 查看进程线程分布
ps -eLo pid,tid,psr,comm | head -20
# 查看 CPU 使用情况
top -H -p $(pgrep -f "stress-ng")
实验2:CPU 亲和性绑定
# 安装压测工具
sudo apt-get install stress-ng
# 启动 CPU 密集型任务
stress-ng --cpu 4 --timeout 60s &
# 绑定到特定 CPU
taskset -c 1,2 stress-ng --cpu 2 --timeout 30s &
# 查看绑定效果
ps -eo pid,psr,comm | grep stress-ng
实验3:Go GMP 调度可视化
创建 gmp_demo.go:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// 设置 GOMAXPROCS
runtime.GOMAXPROCS(4)
// 启动多个 goroutine
for i := 0; i < 10; i++ {
go func(id int) {
for {
fmt.Printf("Goroutine %d on M\n", id)
time.Sleep(100 * time.Millisecond)
}
}(i)
}
// 查看调度信息
go func() {
for {
fmt.Printf("NumGoroutine: %d\n", runtime.NumGoroutine())
time.Sleep(1 * time.Second)
}
}()
time.Sleep(10 * time.Second)
}
运行并分析:
# 编译运行
go build gmp_demo.go
GODEBUG=schedtrace=1000 ./gmp_demo
# 查看调度跟踪
GODEBUG=schedtrace=1000,scheddetail=1 ./gmp_demo
实验4:NUMA 拓扑分析
# 查看 NUMA 拓扑
numactl --hardware
# 查看进程 NUMA 绑定
numactl --show
# 绑定进程到特定 NUMA 节点
numactl --cpunodebind=0 --membind=0 ./myapp
1.8 性能优化要点
| 场景 | 问题 | 解决方案 |
|---|---|---|
| 多线程 CPU 抢占 | 上下文切换多 | 降低 GOMAXPROCS 或使用协程池 |
| 容器内 CPU 限制 | 不同容器争抢 | 使用 cgroup 限制 / QoS |
| NUMA 延迟高 | 内存跨节点访问 | 启用 NUMA-aware scheduling |
| Go Runtime 与内核调度冲突 | CPU 负载不均 | 打开 GODEBUG=schedtrace=1000 调度日志分析 |
第2章:Linux 内存管理与容器隔离
2.1 内存的本质:虚拟化与分层
Linux 的内存管理体系不是"物理分配"的,而是一个虚拟层 → 页缓存层 → 物理层的多层架构。
用户空间
│
├── 虚拟内存(Virtual Memory)
│ └── 每个进程独立的虚拟地址空间(4GB 或 128TB)
│
├── 页缓存(Page Cache)
│ └── 文件系统层缓冲区,提高 IO 性能
│
└── 物理内存(Physical Memory)
└── 实际的 DRAM + SWAP
关键点:每个进程看到的内存(虚拟内存)并不等于真实物理内存。内核通过**页表(Page Table)**将虚拟页映射到物理页。
2.2 虚拟内存与页表机制
2.2.1 虚拟内存结构(64位系统)
+-------------------+
| 用户空间 (0x0000_0000_0000_0000 - 0x0000_7fff_ffff_ffff)
+-------------------+
| 内核空间 (0xffff_8000_0000_0000 - 0xffff_ffff_ffff_ffff)
+-------------------+
- 每个进程都拥有自己的虚拟地址空间
- 内核空间是共享的
- 页大小通常为 4KB(HugePages 可以是 2MB 或 1GB)
2.2.2 页表转换(MMU + TLB)
虚拟地址 → 页表(多级映射) → 物理页帧 → DRAM
CPU 中的 MMU(Memory Management Unit)负责转换,TLB 缓存最近使用的页表项,加速访问。
2.3 页缓存与缓存回收机制
Linux 通过 Page Cache 缓存文件数据,极大提高读写性能。
| 缓存类型 | 说明 | 查看命令 |
|---|---|---|
| Page Cache | 文件内容缓存(read/write) | cat /proc/meminfo | grep Cached |
| Dentry Cache | 目录项缓存 | cat /proc/meminfo | grep Dentry |
| Inode Cache | 文件元数据缓存 | cat /proc/meminfo | grep Inode |
缓存回收机制:
Active File Pages ↔ Inactive File Pages ↔ Free Pages
2.4 Swap 与 OOM 杀手机制
2.4.1 Swap 交换区
当物理内存不足时,系统会将冷页(不常用)写入磁盘 Swap 分区。
- 优点:防止 OOM
- 缺点:速度极慢(磁盘IO远慢于内存)
参数调优:
# 查看当前 swappiness
cat /proc/sys/vm/swappiness
# 调整 swappiness(0-100,值越大越倾向使用 swap)
sudo sysctl vm.swappiness=10
# 永久设置
echo 'vm.swappiness=10' >> /etc/sysctl.conf
2.4.2 OOM Killer
当物理 + swap 全部耗尽时,内核会执行 "OOM 杀手"。
执行逻辑:
- 扫描所有进程
- 根据 OOM Score 选出"最不重要"的进程
- 杀掉它释放内存
查看 OOM 历史:
# 查看 OOM 日志
dmesg | grep -i kill
# 查看进程 OOM 分数
cat /proc/PID/oom_score
cat /proc/PID/oom_score_adj
2.5 Cgroups 内存隔离机制(容器核心)
容器中的"内存限制",本质是 cgroup 控制。
2.5.1 Cgroup 内存控制文件
| 文件 | 功能 | 示例 |
|---|---|---|
| memory.limit_in_bytes | 限制最大内存使用量 | echo 512M > memory.limit_in_bytes |
| memory.usage_in_bytes | 当前使用量 | cat memory.usage_in_bytes |
| memory.stat | 内存统计信息 | cat memory.stat |
| memory.oom_control | 是否触发 OOM | cat memory.oom_control |
2.5.2 实战:创建内存限制容器
# 创建 cgroup
sudo mkdir /sys/fs/cgroup/memory/myapp
# 设置内存限制为 100MB
echo 104857600 > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
# 启用 OOM 控制
echo 1 > /sys/fs/cgroup/memory/myapp/memory.oom_control
# 运行程序并加入 cgroup
echo $$ > /sys/fs/cgroup/memory/myapp/cgroup.procs
# 测试内存限制
python3 -c "
import time
data = []
while True:
data.append('x' * 1024 * 1024) # 每次分配 1MB
print(f'Allocated: {len(data)}MB')
time.sleep(1)
"
2.6 Kubernetes 内存限制与 QoS
在 K8s 中,容器的内存限制最终落到 cgroup 层。
| 类型 | 定义 | 行为 | 示例 |
|---|---|---|---|
| requests.memory | 保证分配量 | 调度依据 | requests: {memory: "256Mi"} |
| limits.memory | 上限 | 超出将被杀掉 | limits: {memory: "512Mi"} |
QoS 分类:
| 类别 | 条件 | OOM 优先级 | 示例 |
|---|---|---|---|
| Guaranteed | requests = limits | 最不容易被杀 | requests: {memory: "512Mi"}, limits: {memory: "512Mi"} |
| Burstable | requests < limits | 中等 | requests: {memory: "256Mi"}, limits: {memory: "512Mi"} |
| BestEffort | 未设置 requests | 最容易被杀 | 无 requests/limits |
2.7 实战实验:内存管理与 OOM 分析
实验1:内存使用监控
# 查看系统内存使用
free -h
cat /proc/meminfo
# 查看进程内存使用
ps aux --sort=-%mem | head -10
# 查看容器内存使用(Docker)
docker stats
# 查看容器内存使用(K8s)
kubectl top pod
实验2:OOM 触发与分析
创建 oom_test.py:
#!/usr/bin/env python3
import time
import os
def trigger_oom():
"""触发 OOM 的测试程序"""
print(f"PID: {os.getpid()}")
print("开始分配内存...")
data = []
try:
while True:
# 每次分配 100MB
chunk = 'x' * (100 * 1024 * 1024)
data.append(chunk)
print(f"已分配: {len(data) * 100}MB")
time.sleep(1)
except MemoryError:
print("内存不足,程序被终止")
except Exception as e:
print(f"其他错误: {e}")
if __name__ == "__main__":
trigger_oom()
运行实验:
# 设置内存限制
ulimit -v 500000 # 限制虚拟内存为 500MB
# 运行 OOM 测试
python3 oom_test.py
# 查看 OOM 日志
dmesg | tail -20
实验3:内存泄漏模拟与定位
创建 memory_leak.go:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// 启用 pprof
go func() {
for {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("Alloc = %d KB, Sys = %d KB, NumGC = %d\n",
m.Alloc/1024, m.Sys/1024, m.NumGC)
time.Sleep(5 * time.Second)
}
}()
// 模拟内存泄漏
for i := 0; i < 1000; i++ {
data := make([]byte, 1024*1024) // 1MB
_ = data
time.Sleep(100 * time.Millisecond)
}
time.Sleep(30 * time.Second)
}
运行并分析:
# 编译运行
go build memory_leak.go
./memory_leak &
# 使用 pprof 分析
go tool pprof http://localhost:6060/debug/pprof/heap
# 生成内存使用图
go tool pprof -png http://localhost:6060/debug/pprof/heap > heap.png
实验4:cgroup v2 内存限制
# 创建 cgroup v2 目录
sudo mkdir -p /sys/fs/cgroup/myapp
# 设置内存限制
echo 200M > /sys/fs/cgroup/myapp/memory.max
# 设置内存软限制
echo 150M > /sys/fs/cgroup/myapp/memory.high
# 将当前 shell 加入 cgroup
echo $$ > /sys/fs/cgroup/myapp/cgroup.procs
# 运行内存测试
python3 -c "
import time
data = []
for i in range(300):
data.append('x' * 1024 * 1024)
print(f'Allocated: {i+1}MB')
time.Sleep(0.1)
"
2.8 性能优化与排障总结
| 场景 | 原因 | 解决方案 | 命令 |
|---|---|---|---|
| 容器频繁 OOM | limit 太低 | 调整 limits 或启用 swap | kubectl describe pod |
| 系统 swap 过高 | swappiness 太大 | 调小到 10 以下 | sysctl vm.swappiness=10 |
| 内存碎片多 | Page Cache 占用 | 定期 drop_caches | echo 3 > /proc/sys/vm/drop_caches |
| 内核杀错进程 | OOMScore 调整 | oom_score_adj 设为负值 | echo -1000 > /proc/PID/oom_score_adj |
| 容器假死 | 内存压缩 + I/O 拥塞 | 禁止 swap,使用内存预留 | memory.swappiness=0 |
第3章:Linux 网络栈原理与容器网络
3.1 Linux 网络栈总览
从一个数据包发出到到达另一台机器,Linux 内核网络栈经历以下路径:
用户空间 → Socket → 内核网络栈 → 驱动 → 网卡 → 物理链路
↓
(远端)
物理链路 → 网卡 → 内核网络栈 → Socket → 用户空间
在容器环境下,只是多了一层虚拟抽象:
容器A eth0 → vethA ↔ vethB → bridge(docker0/cni0) → eth0 → 外网
3.2 Namespace:隔离的核心机制
Linux 的 Namespace 提供了资源隔离机制。网络隔离靠的是 Network Namespace (netns)。
| 类型 | 功能 | 查看命令 |
|---|---|---|
| pid | 进程号隔离 | ls /proc/*/ns/pid |
| mnt | 文件系统挂载隔离 | ls /proc/*/ns/mnt |
| uts | 主机名隔离 | hostname |
| ipc | 进程间通信隔离 | ls /proc/*/ns/ipc |
| net | 网络设备/路由表隔离 | ip netns list |
| user | 用户 UID/GID 隔离 | ls /proc/*/ns/user |
3.3 veth pair:虚拟以太网线缆
veth 就是"一根虚拟网线的两头",当一端发包,另一端一定能收到。
容器 A (eth0) <--> vethA ↔ vethB <--> 宿主机 bridge (docker0)
特点:
- 一端在容器 netns,另一端在 host
- 一端关闭,另一端自动关闭
- 内核层面通过 ring buffer 通信,无需物理 IO
3.4 Bridge:虚拟交换机(docker0 / cni0)
Bridge 是 Linux 实现的虚拟交换机,负责容器互联。
当你运行:
docker run -it busybox
系统自动创建:
- 容器内:eth0
- 宿主机:vethXYZ(与容器 eth0 绑定)
- 桥接设备:docker0 / cni0
- 分配虚拟 IP,如 172.17.0.2
数据流动:
容器 eth0 → veth → docker0 → eth0(宿主机)→ 外网
3.5 iptables 与 NAT 转发机制
iptables 是 Linux 的防火墙 + NAT 转发引擎。Kubernetes 的 kube-proxy 就是基于它实现的。
iptables 五链模型:
PREROUTING → INPUT → FORWARD → OUTPUT → POSTROUTING
| 链 | 作用 | 示例 |
|---|---|---|
| PREROUTING | 数据包进入系统前处理(DNAT) | 目标地址转换 |
| INPUT | 进入本机的数据包 | 本地进程接收 |
| FORWARD | 转发经过的数据包 | 路由器功能 |
| OUTPUT | 本地产生的数据包 | 本地进程发送 |
| POSTROUTING | 出口 NAT(SNAT) | 源地址转换 |
3.6 conntrack:连接跟踪系统
conntrack 是 iptables 背后的连接追踪模块。它记录所有经过的 TCP/UDP 流状态,用于 NAT、负载均衡。
查看连接表:
# 查看连接数量
conntrack -L | wc -l
# 查看连接统计
conntrack -S
# 查看特定连接
conntrack -L -p tcp --dport 80
常见性能问题:
- 表容量限制(nf_conntrack_max)
- 超时连接未清理
- 高并发时内存占用大
调优:
# 增加连接表大小
sudo sysctl -w net.netfilter.nf_conntrack_max=262144
# 调整超时时间
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=7200
3.7 实战实验:容器网络构建
实验1:手动创建容器网络
#!/bin/bash
# 创建完整的容器网络环境
# 1. 创建 netns
sudo ip netns add ns1
sudo ip netns add ns2
# 2. 创建网桥
sudo ip link add br0 type bridge
sudo ip addr add 10.10.0.1/24 dev br0
sudo ip link set br0 up
# 3. 创建 veth pair 1
sudo ip link add veth1 type veth peer name veth1-br
sudo ip link set veth1 netns ns1
sudo ip link set veth1-br master br0
sudo ip link set veth1-br up
# 4. 配置 ns1 网络
sudo ip netns exec ns1 ip addr add 10.10.0.2/24 dev veth1
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns1 ip route add default via 10.10.0.1
# 5. 创建 veth pair 2
sudo ip link add veth2 type veth peer name veth2-br
sudo ip link set veth2 netns ns2
sudo ip link set veth2-br master br0
sudo ip link set veth2-br up
# 6. 配置 ns2 网络
sudo ip netns exec ns2 ip addr add 10.10.0.3/24 dev veth2
sudo ip netns exec ns2 ip link set veth2 up
sudo ip netns exec ns2 ip route add default via 10.10.0.1
# 7. 测试连通性
echo "测试 ns1 到 ns2 的连通性:"
sudo ip netns exec ns1 ping -c 3 10.10.0.3
# 8. 清理(可选)
# sudo ip netns del ns1
# sudo ip netns del ns2
# sudo ip link del br0
实验2:iptables NAT 规则实战
# 1. 查看当前 NAT 规则
sudo iptables -t nat -L -n -v
# 2. 创建 DNAT 规则(端口转发)
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.10.0.2:80
# 3. 创建 SNAT 规则(源地址转换)
sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -j MASQUERADE
# 4. 查看规则
sudo iptables -t nat -L -n -v
# 5. 测试规则
curl -I http://localhost:8080
# 6. 清理规则
sudo iptables -t nat -D PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.10.0.2:80
sudo iptables -t nat -D POSTROUTING -s 10.10.0.0/24 -j MASQUERADE
实验3:网络性能测试
# 1. 安装测试工具
sudo apt-get install iperf3
# 2. 在 ns1 启动服务端
sudo ip netns exec ns1 iperf3 -s &
# 3. 在 ns2 启动客户端
sudo ip netns exec ns2 iperf3 -c 10.10.0.2 -t 30
# 4. 测试延迟
sudo ip netns exec ns1 ping -c 100 10.10.0.3 | tail -1
# 5. 查看网络统计
sudo ip netns exec ns1 ss -s
sudo ip netns exec ns2 ss -s
实验4:conntrack 连接跟踪分析
# 1. 查看连接跟踪状态
sudo conntrack -S
# 2. 建立连接并观察
sudo ip netns exec ns1 nc -l 8080 &
sudo ip netns exec ns2 nc 10.10.0.2 8080 &
# 3. 查看连接表
sudo conntrack -L | grep 10.10.0
# 4. 查看连接详细信息
sudo conntrack -L -p tcp --dport 8080
# 5. 清理连接
sudo conntrack -D -p tcp --dport 8080
3.8 网络性能优化与排查
3.8.1 性能瓶颈常见原因
| 层 | 症状 | 解决思路 | 工具 |
|---|---|---|---|
| veth/bridge | 延迟高 | 改用 macvlan/ipvlan | ping, iperf3 |
| conntrack | 丢包 | 调大 nf_conntrack_max | conntrack -S |
| MTU | 包被丢弃 | 统一 MTU (1450 for VXLAN) | ip link show |
| 多核调度 | 单核满载 | 启用 RPS/RFS | cat /proc/interrupts |
| eBPF | service 转发慢 | 启用 Cilium eBPF 模式 | cilium status |
3.8.2 内核调优建议
# TCP 参数优化
sudo sysctl -w net.core.somaxconn=4096
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=10
sudo sysctl -w net.core.netdev_max_backlog=4096
# 连接跟踪优化
sudo sysctl -w net.netfilter.nf_conntrack_max=524288
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=7200
# 网络缓冲区优化
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216
3.8.3 工具链
| 工具 | 用途 | 示例 |
|---|---|---|
ss -s, ss -tnp | Socket 状态 | ss -s |
tcpdump, wireshark | 抓包分析 | tcpdump -i any port 80 |
ethtool, ifconfig | 网卡性能 | ethtool -S eth0 |
conntrack-tools | 连接跟踪 | conntrack -L |
nstat, sar -n | 内核网络指标 | nstat -z |
iperf3 | 带宽测试 | iperf3 -c server |
实验环境搭建
环境要求
- Ubuntu 20.04+ 或 CentOS 8+
- 至少 4GB 内存
- 至少 2 个 CPU 核心
- 网络连接
快速安装脚本
#!/bin/bash
# Linux 基础实验环境安装脚本
set -e
echo "开始安装 Linux 基础实验环境..."
# 更新系统
sudo apt-get update
# 安装基础工具
sudo apt-get install -y \
stress-ng \
htop \
iotop \
iperf3 \
tcpdump \
wireshark \
conntrack \
iproute2 \
bridge-utils \
cgroup-tools \
golang-go \
python3 \
python3-pip
# 安装 Go 工具
go install github.com/google/pprof@latest
# 创建实验目录
mkdir -p ~/linux-experiments
cd ~/linux-experiments
# 下载实验脚本
cat > run_experiments.sh << 'EOF'
#!/bin/bash
echo "Linux 基础实验环境已准备就绪!"
echo "可用的实验:"
echo "1. 进程调度实验"
echo "2. 内存管理实验"
echo "3. 网络栈实验"
echo "4. 容器网络实验"
EOF
chmod +x run_experiments.sh
echo "安装完成!运行 ~/linux-experiments/run_experiments.sh 开始实验"
命令速查表
进程与调度
| 命令 | 功能 | 示例 |
|---|---|---|
ps -eLo pid,tid,psr,comm | 查看线程调度 | ps -eLo pid,tid,psr,comm | head -10 |
taskset -c 1,2 ./app | 绑定 CPU 核心 | taskset -c 0-3 stress-ng --cpu 4 |
numactl --hardware | 查看 NUMA 拓扑 | numactl --hardware |
perf top | 性能分析 | perf top -p $(pgrep myapp) |
htop | 系统监控 | htop |
内存管理
| 命令 | 功能 | 示例 |
|---|---|---|
free -h | 查看内存使用 | free -h |
cat /proc/meminfo | 详细内存信息 | cat /proc/meminfo |
cat /proc/PID/status | 进程内存状态 | cat /proc/$$/status |
dmesg | grep -i oom | 查看 OOM 日志 | dmesg | grep -i oom |
echo 3 > /proc/sys/vm/drop_caches | 清理页缓存 | sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' |
网络管理
| 命令 | 功能 | 示例 |
|---|---|---|
ip netns list | 查看网络命名空间 | ip netns list |
ip link show | 查看网络接口 | ip link show |
brctl show | 查看网桥 | brctl show |
iptables -t nat -L -n | 查看 NAT 规则 | sudo iptables -t nat -L -n |
conntrack -L | 查看连接跟踪 | sudo conntrack -L |
ss -tnp | 查看 Socket 状态 | ss -tnp |
tcpdump -i any | 抓包分析 | sudo tcpdump -i any port 80 |
系统监控
| 命令 | 功能 | 示例 |
|---|---|---|
top | 系统监控 | top |
iostat -x 1 | I/O 监控 | iostat -x 1 |
vmstat 1 | 虚拟内存统计 | vmstat 1 |
sar -n DEV 1 | 网络统计 | sar -n DEV 1 |
perf stat | 性能统计 | perf stat ./myapp |