Linux

proc 文件系统完整详解

·12 分钟阅读·4670 字
📋 目录

proc 文件系统完整详解

核心概念 /proc 是 Linux 虚拟内存文件系统,实时从内核内存动态生成,提供进程、内存、CPU、网络等系统信息。

1. 基础概念

1.1. 本质

/proc 是 Linux 虚拟内存文件系统,不占用磁盘空间,全部数据实时从内核内存动态生成,关机自动消失,开机自动挂载。
挂载命令(系统默认开机挂载):

mount -t proc none /proc

1.2. 核心作用

提供内核、进程、硬件、网络、调度、内存、中断、系统参数的实时读写接口,是 Linux 排查、调优、监控的底层数据源。
分为两大块:

  1. 数字目录 /proc/[PID]/:每个运行进程专属目录;
  2. 全局文件/目录(无数字):整机内核全局信息、系统可调参数。

1.3. 读写区分

  • 只读文件:查看状态(内存、中断、进程栈);
  • 可写文件:内核动态调优参数(/proc/sys/*,写入数值即时生效)。

2. 进程目录:/proc/[PID] 详解(每个进程一套)

PID=1 是 systemd/pause 容器一号进程,特殊处理孤儿进程回收。
/proc/1234/ 举例,核心文件说明:

2.1. 进程基础信息

  • /proc/PID/cmdline:进程启动完整命令,参数用\0分隔
cat /proc/1234/cmdline | tr '\0' ' '
  • /proc/PID/status 最全进程状态(高频排查)
Name:进程名
State:进程状态 R/S/D/Z/T
VmRSS:实际占用物理内存
VmSize:虚拟内存总量
Threads:线程数量
PPid:父进程PID
Uid/Gid:运行用户ID
  • /proc/PID/stat 原始进程统计(程序解析用,可读性差)
  • /proc/PID/comm 简短进程名(程序二进制文件名)

2.2. 内存相关

  • /proc/PID/maps:进程虚拟内存分段(库、堆、栈、共享库地址)
  • /proc/PID/smaps:比maps详细,每段内存RSS/PSS/交换占用,排查内存泄漏神器
  • /proc/PID/io:进程磁盘读写字节(read_bytes/write_bytes),定位IO高占用进程

2.3. 文件句柄与套接字

  • /proc/PID/fd/:目录,存放进程所有打开文件句柄

  • 普通文件、日志、管道、socket套接字全部映射;

  • ls -l /proc/1234/fd 查看打开了哪些文件、连接;

  • /proc/PID/fdinfo/:每个fd详细信息(偏移量、读写模式)

2.4. 线程、内核栈、调度

  • /proc/PID/task/:子目录,存放该进程所有线程(每个线程一个数字子目录)
    ps -T -p PID 底层就是读取该目录;
  • /proc/PID/stack内核调用栈,排查D不可中断睡眠、死锁核心文件;
  • /proc/PID/sched:进程调度信息、运行时长、优先级;
  • /proc/PID/limits:进程资源软硬限制(ulimit底层数据源)
    nofile最大文件句柄、nproc最大进程数、core文件大小。

2.5. 安全、权限、内存操作

  • /proc/PID/mem:进程虚拟内存原始二进制,调试器gdb读取内存;
  • /proc/PID/coredump_filter:控制core dump捕获哪些内存段;
  • /proc/PID/attr/:SELinux安全上下文。

2.6. 容器特有:/proc/PID/ns/ 命名空间

6个子文件对应Linux六大Namespace:

  • net:网络命名空间
  • pid:进程树隔离
  • mnt:挂载隔离
  • user:用户ID映射
  • ipc:进程通信隔离
  • uts:主机名域名隔离
    不同PID软链接相同inode代表共享命名空间(K8s Pod pause容器共享网络底层原理)。

3. 全局核心文件(整机系统信息,无PID数字)

3.1. 硬件、CPU、内存基础

  • /proc/cpuinfo:CPU型号、核心、主频、缓存、超线程
  • /proc/meminfo 内存完整指标(free/available/buff/cache/Dirty脏页)
cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Dirty"
  • /proc/uptime:系统开机总秒数 + 空闲CPU总秒数
  • /proc/loadavg:1/5/15分钟负载、运行进程数、最近PID(uptime/top底层来源)

3.2. 中断、软中断、调度

  • /proc/interrupts:硬件IRQ中断,分CPU统计次数,网卡/磁盘中断排查核心
  • /proc/softirqs:软中断统计 NET_RX/NET_TX 网络软中断重点
  • /proc/stat:整机CPU全局统计(user/system/idle/iowait/irq/si),top/mpstat数据源

3.3. 磁盘、块设备IO

  • /proc/diskstats:所有磁盘分区读写IO次数、扇区、耗时,iostat底层数据源
  • /proc/partitions:磁盘分区大小、设备号
  • /proc/mounts:当前所有挂载点(等同于mount命令输出)

3.4. 网络、连接跟踪

  • /proc/net/dev:网卡收发字节、包、丢包、错误计数(sar -n DEV读取)
  • /proc/net/tcp / tcp6:所有TCP连接五元组、状态、队列长度(ss工具底层)
  • /proc/net/udp / udp6:UDP套接字
  • /proc/net/nf_conntrack:内核连接跟踪表,排查conntrack表满丢包
  • /proc/net/arp:ARP缓存表

3.5. 系统版本、内核、模块

  • /proc/version:内核版本、编译时间、gcc版本
  • /proc/modules:已加载内核模块(lsmod底层读取)
  • /proc/sys/fs/file-max:整机最大全局文件句柄数

4. 可动态调优目录:/proc/sys/(重中之重,内核参数)

写入文件即时修改内核运行参数,重启失效;永久生效写入/etc/sysctl.confsysctl -p加载。
分四大子目录:

4.1. /proc/sys/vm 内存子系统(数据库、Redis必调)

  • /proc/sys/vm/swappiness:0~100,数值越小越少使用swap,推荐0/10
  • /proc/sys/vm/dirty_background_ratio:后台异步刷脏页阈值
  • /proc/sys/vm/dirty_ratio:脏页占内存上限,超过阻塞业务写
  • /proc/sys/vm/drop_caches:写入1/2/3释放缓存
echo 3 > /proc/sys/vm/drop_caches
  • /proc/sys/vm/overcommit_memory:内存分配策略,数据库推荐1

4.2. /proc/sys/net 网络子系统(高并发服务调优)

  • /proc/sys/net/ipv4/ip_local_port_range:客户端临时端口范围
  • /proc/sys/net/ipv4/tcp_tw_reuse:TIME_WAIT端口复用
  • /proc/sys/net/ipv4/tcp_syncookies:防SYN洪水
  • /proc/sys/net/core/somaxconn:监听全连接队列上限
  • /proc/sys/net/netfilter/nf_conntrack_max:连接跟踪表最大容量

4.3. /proc/sys/fs 文件系统

  • /proc/sys/fs/file-max:整机全局最大打开文件句柄
  • /proc/sys/fs/nr_open:进程句柄上限硬限制

4.4. /proc/sys/kernel 内核全局

  • /proc/sys/kernel/pid_max:系统最大PID编号
  • /proc/sys/kernel/threads-max:系统最大线程总数
  • /proc/sys/kernel/printk:控制台日志打印级别

5. 特殊关键目录/文件补充

  1. /proc/kmsg:内核实时日志流,dmesg读取来源
  2. /proc/sched_debug:CPU调度队列、进程运行明细,排查CPU调度卡顿
  3. /proc/vmstat:内存页分配、回收、swap出入明细,内存泄漏底层指标
  4. /proc/irq/:每个硬件IRQ专属目录,可修改smp_affinity中断CPU亲和
  5. /proc/cgroups:本机所有cgroup层级(容器资源限制底层)

6. 生产高频排查使用场景

  1. 定位IO高占用进程
    遍历所有PID的/proc/PID/io对比write_bytes;
  2. D进程死锁阻塞排查
    cat /proc/PID/stack 查看内核阻塞调用栈;
  3. 内存泄漏定位
    对比/proc/PID/smaps各段PSS内存持续增长;
  4. 连接数、套接字泄露
    ls /proc/PID/fd | wc -l 统计进程句柄;
  5. 网卡软中断单核打满
    /proc/interrupts + /proc/softirqs 查看中断分布;
  6. 内核参数临时调优
    直接echo写入/proc/sys/net/vm对应文件;
  7. 容器命名空间共享校验
    对比/proc/PID/ns/net inode编号,相同即共享网络栈。

7. 重要注意事项

  1. 全部文件是虚拟动态生成,不可vim编辑(vim会截断文件),修改内核参数只用echo xxx > 文件
  2. /proc/sys 修改仅当前运行生效,服务器重启丢失,持久化需sysctl.conf;
  3. 读取大文件(如nf_conntrack、maps)消耗CPU,线上不要频繁循环抓取;
  4. 普通用户无权限读取部分PID目录(其他用户进程、内核敏感文件);
  5. 容器内/props是隔离视图,宿主机/proc能看到所有容器PID。

8. 面试核心速记总结

  1. /proc 虚拟内存文件系统,无磁盘存储,内核实时生成数据;
  2. /proc/[PID] 进程专属目录:cmdline、status、fd、stack、ns命名空间是高频重点;
  3. 全局文件:cpuinfo/meminfo/interrupts/softirqs/net/tcp 用于硬件、网络、中断排查;
  4. /proc/sys 可读写内核动态参数,vm内存、net网络两大调优核心;
  5. 底层支撑工具:top/htop/iostat/ss/mpstat/uptime全部读取/proc数据;
  6. 容器底层依托/proc/[PID]/ns六大命名空间实现资源隔离;
  7. 调试利器:stack查看D进程、smaps排查内存泄漏、fd查看文件句柄泄露。

关联文档