当前位置: 首页 > news >正文

Linux底层-内核数据接口:/proc

目录

Cpu load

平均负载

平均负载如何参考

步骤 1:判断负载趋势

步骤 2:区分 “CPU 密集型” 还是 “I/O 密集型” 负载

步骤 3:定位具体进程

总结

Cpu stat

1. CPU 相关统计信息

2. 中断统计信息

3. 上下文切换和进程创建统计信息

4. 其他统计信息

CPU使用率

Cpu softirqs

中断

软中断

mem info

buffer和cache

net


在GNU/Linux操作系统中,/proc是一个位于内存中的伪文件系统,是一个非常特殊的虚拟文件系统,它不占用实际的磁盘空间,而是作为内核与用户空间之间的 “接口”。该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。

proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息。在Linux系统中,许多工具的数据来源正是proc目录中的内容。

例如,top命令是通过 /proc/stat中数据,进行换算得出:

该图片显示了 Linux 系统当前运行的进程和资源使用情况,其中 CPU 使用率为:用户空间 ,内核空间 ,低优先级进程 ,空闲 99.0%,等待I/O、硬件中断、软件中断和虚拟化时间。

Cpu load

/proc/loadavg 保存了系统负载的平均值,其前三列分别表示最近1分钟、5分钟及15分的平均负载。反映了当前系统的繁忙情况。

后两个表示当前正在运行的进程数/系统当前的进程总数,系统最近创建的进程的 PID。

平均负载

平均负载是衡量计算机系统整体繁忙程度的核心指标,它表示在特定时间段内,等待 CPU 处理的进程数量 + 正在 CPU 上运行的进程数量的平均值,也就是平均活跃进程数

它不仅包含正在 CPU 上运行的进程,还包含等待 CPU 调度的进程以及等待 I/O 完成的进程

平均负载是衡量 任务队列长度,反映系统 整体繁忙程度。而CPU 使用率:衡量 CPU 资源被占用的比例,仅反映 CPU 的繁忙程度。核心原则是:平均负载 ≈ CPU 核心数时,系统处于 “饱和但不拥堵” 的最佳状态

CPU使用率跟平均负载并不一定完全对应。比如:CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;I/O 密集型进程,进程等待 I/O 完成,但仍计入队列,导致平均负载高、CPU 使用率低;多进程并发,任务量与 CPU 匹配,二者均处于合理范围。

平均负载如何参考

三个不同时间间隔的平均值,其实给我们提供了,分析系统负载趋势的数据来源,让我们能更全面、更立体地理解目前的负载状况。

当平均负载异常升高时,可按以下步骤定位瓶颈:

步骤 1:判断负载趋势
  • 1 分钟 > 5 分钟 > 15 分钟:负载正在快速上升,需立即排查,如突然新增大量任务。
  • 1 分钟 < 5 分钟 < 15 分钟:负载正在逐步下降,可能是短期峰值后的恢复,可观察后续变化。
  • 三者接近:负载处于稳定状态,若数值过高则需持续关注。
步骤 2:区分 “CPU 密集型” 还是 “I/O 密集型” 负载

用 mpstat(查看 CPU 使用率)和 iostat(查看 I/O 使用率)工具:

通过stress -c 4 命令,用 stress 工具在系统上模拟 4 个 “纯计算密集型” 的进程,使得 mpstat 看到 “CPU 几乎被用户态任务占满” 的结果。

步骤 3:定位具体进程

用 pidstat 查看单个进程的 CPU/I/O 占用:

找到占用资源最高的进程后,进一步分析其业务逻辑。

总结

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。所以,在理解平均负载时,也要注意:

平均负载高有可能是 CPU 密集型进程导致的;平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙

Cpu stat

在 Linux 系统中,/proc/stat/proc虚拟文件系统下的一个文件,它记录了系统整体以及各个 CPU 核心的统计信息,包括 CPU 的使用情况、中断次数、上下文切换次数等。通过读取该文件的内容,可以获取系统运行状态的关键指标,从而对系统进行监控和性能分析。

1. CPU 相关统计信息

文件开头部分记录了系统中所有 CPU(包括每个 CPU 核心)的使用情况

  • user:用户态进程占用 CPU 的时间,即普通应用程序在用户空间执行所花费的 CPU 时间。
  • nice:低优先级用户态进程占用 CPU 的时间。这些进程是通过nice命令降低优先级的用户进程。
  • system:内核态进程占用 CPU 的时间,即操作系统内核在执行系统调用、处理内核函数等操作时所花费的 CPU 时间。
  • idle:CPU 处于空闲状态的时间,即没有任何进程在使用 CPU 的时间。
  • iowait:CPU 等待 I/O 操作完成所花费的时间。当系统中有大量 I/O 操作(如磁盘读写)时,这个值可能会升高。
  • irq:CPU 处理硬件中断所花费的时间。硬件中断是由外部设备(如网卡、硬盘等)触发的,用于通知 CPU 有事件发生。
  • softirq:CPU 处理软件中断所花费的时间。软件中断是由内核自身产生的,用于处理一些延迟处理的任务。
  • steal:在多虚拟机环境下,当前虚拟机的 CPU 时间被其他虚拟机占用的时间。
  • guest:运行虚拟 CPU(如通过 KVM 等虚拟化技术创建的虚拟机)所花费的时间。
  • guest_nice:运行低优先级虚拟 CPU 所花费的时间。
2. 中断统计信息

intr 总计 中断号1:次数 中断号2:次数...

这些中断号对应着不同的硬件设备或系统事件,通过分析中断次数的变化,可以了解硬件设备的工作情况,比如网卡的中断次数增加可能表示网络流量增大。

3. 上下文切换和进程创建统计信息
  • 上下文切换次数:文件中有一行类似ctxt 上下文切换总次数,它记录了系统启动以来发生的上下文切换总次数。上下文切换是指 CPU 从一个进程切换到另一个进程执行时所进行的一系列操作,频繁的上下文切换可能会影响系统性能。
  • 进程创建次数processes 进程创建总次数记录了系统启动以来创建的进程总数,通过观察这个数值的变化,可以了解系统中进程的创建频率。
4. 其他统计信息

文件中还可能包含btime,表示系统启动的时间(从 1970 年 1 月 1 日 00:00:00 到系统启动时的秒数)等信息。

CPU使用率

事实上,为了计算 CPU 使用率,性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率。

Cpu softirqs

/proc/softirqs 记录了系统中软件中断(softirq)的统计信息。软件中断是由内核自身触发的一种机制,用于处理一些可以被延迟执行的任务,以提高系统的整体性能和响应效率。

/proc/interrupts 用于记录系统硬件中断(Hardware Interrupt)的相关信息。硬件中断是外部设备向 CPU 发送的信号,用于通知 CPU 有需要立即处理的事件发生。

  • 第一列:表示不同类型的软件中断:
    • HI:高优先级软件中断,用于处理那些需要尽快执行的任务。
    • TIMER:定时器相关的软件中断,负责处理系统定时器到期事件。
    • NET_TX:网络传输相关的软件中断,用于处理网络数据包的发送。
    • NET_RX:网络接收相关的软件中断,用于处理接收到的网络数据包。
    • BLOCK:块设备相关的软件中断,例如磁盘 I/O 操作完成后的通知处理。
    • TASKLET:任务队列相关的软件中断,是一种轻量级的延迟执行机制。
    • SCHED:调度相关的软件中断,用于处理进程调度相关的事件。
    • HRTIMER:高精度定时器相关的软件中断。
    • RCU:读 - 复制更新(Read - Copy Update)机制相关的软件中断,用于实现并发控制。
  • 后续列:对应不同 CPU 核心上该类型软件中断发生的次数。
中断

中断是一种异步的事件处理机制,可以提高系统的并发处理能力。通过中断实现异步,异步中的时间是否完成,何时完成。

由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。如果中断本身要做的事情不多,那么处理起来也不会有太大问题;但如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。

特别是,中断处理程序在响应中断时,还会临时关闭别的中断。这就会导致上一次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失。

软中断

事实上,为了解决中断处理程序执行过长和中断丢失的问题,Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:

上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。下半部用来延迟异步处理上半部未完成的工作,通常以内核线程的方式运行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU编号”。

所以,这两个阶段也可以这样理解:上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

  1. 顶半部(Top Half): 顶半部是中断处理的第一个阶段,也是最紧急的阶段。当发生中断时,CPU会立即跳转到中断服务程序的顶半部,执行与中断处理直接相关的任务。这些任务通常包括一些紧急的、需要立即处理的工作,如中断处理程序的初始化、保存中断现场、执行时间敏感的任务等。在顶半部处理期间,中断是被禁止的,以确保这些任务能够尽快地完成,同时避免竞态条件。

  2. 底半部(Bottom Half): 底半部是中断处理的第二个阶段,它在顶半部之后执行。底半部处理通常是一些相对较慢的、不那么紧急的任务,如延迟敏感的处理、资源释放、通知其他进程等。由于底半部处理不需要立即完成,因此它们通常会在顶半部处理结束后、允许中断的情况下执行。底半部处理的执行可能会延迟,因此它们不应该包含对实时性要求较高的任务。

分成顶半部和底半部两个阶段的中断处理机制有助于提高系统的响应速度和并发能力。它允许系统尽快地响应紧急事件,并在需要时延迟执行较长时间的处理。这种机制也有助于避免由于长时间中断而导致的系统不响应或性能下降的问题。

mem info

/proc/meminfo实时记录了系统内存(物理内存和交换空间)的详细使用状态和统计信息,是分析系统内存占用、监控内存资源的重要依据,常由free命令使用。

  • MemTotal: 系统总物理内存容量(单位通常为 KB),即硬件实际安装的 RAM 总量,已扣除内核启动预留空间和内核自身占用内存。
  • MemFree: 完全未被使用的物理内存,为 lowFree(低端内存空闲量)与 highFree(高端内存空闲量)的总和,数值低不代表内存不足。
  • MemAvailable: 不启用交换空间时可分配给新应用的最大内存量,计算逻辑为 MemFree + Active (file) + Inactive (file) - (watermark + min (watermark, (Active (file)+Inactive (file))/2)),是实际可用内存的核心参考指标。
  • Buffers: 内核为块设备(如硬盘、SSD)分配的缓存页,用于存储待写入 / 刚读取的原始数据及文件系统元数据(如 superblock、inode 等),减少磁盘 I/O。
  • Cached: 内核为普通文件内容分配的缓存页,包含程序代码、数据文件等,进程再次访问可直接读取,内存紧张时可被内核回收。
  • SwapCached: 交换缓存中待换出但未写入磁盘的匿名内存页容量,Swap 中已有备份,再次换出可直接复用。
  • SwapTotal: 硬盘中用于虚拟内存的交换空间总容量,物理内存不足时存放不常用内存页。
  • SwapFree: 当前剩余未使用的交换空间容量,快速减少说明物理内存接近饱和。
  • Dirty: 已被进程修改但尚未同步到磁盘的内存页容量,数值过大可能导致数据同步积压。
  • Writeback: 正在被同步写入磁盘的内存页容量,反映实时磁盘 I/O 写入进度。
  • AnonPages: 未映射到任何文件的匿名内存页总容量,含进程堆 / 栈、动态申请内存等。
  • Mapped: 设备与文件的内存映射容量,包括程序代码、库文件、设备驱动等映射大小。
  • Slab: 内核管理小对象分配的内存池总容量,存储进程描述符、inode 等内核数据结构。
  • SReclaimable: Slab 中可回收的内存容量,内存紧张时内核可释放未活跃的内核数据结构内存。
  • SUnreclaim: Slab 中不可回收的内存容量,即内核正在使用的核心数据结构占用的内存,无法释放。
  • PageTables: 存储内存页表的内存容量,进程数量多、映射复杂时数值更大,用于管理虚拟与物理内存映射。
  • NFS_Unstable: 通过 NFS 协议共享的不稳定页表容量,即已修改但未被 NFS 服务器确认写入成功的数据。
  • VmallocTotal: 内核虚拟内存区(vmalloc area)的总容量,用于分配不连续物理内存,适配内核模块、驱动等场景。
  • VmallocUsed: 已使用的虚拟内存区容量,反映内核对不连续物理内存的占用情况。
  • VmallocChunk: 虚拟内存区中可用的最大连续内存块容量,决定内核能否分配大尺寸连续虚拟内存。
  • Active: 包含 active anon 和 active file,指最近被频繁访问的内存页,内核倾向于保留,避免频繁换出 / 回收。
  • Inactive: 包含 inactive anon 和 inactive file,指最近访问频次低的内存页,内存紧张时优先回收或换出。
  • Active (anon): 活跃的匿名内存页容量,多为进程正在使用的堆 / 栈等无文件关联的内存。
  • Inactive (anon): 不活跃的匿名内存页容量,内存不足时易被换出到 Swap。
  • Active (file): 活跃的文件关联内存页容量,多为近期频繁读取的程序代码、数据文件等。
  • Inactive (file): 不活跃的文件关联内存页容量,内存紧张时可直接回收,需用时重新从磁盘读取。

available 不仅包含未使用内存,还包括了可回收的缓存,所以一般会比未使用内存更大。不过,并不是所有缓存都可以回收,因为有些缓存可能正在使用中。

buffer和cache

Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。

Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

Buffer 是对磁盘数据的可读可写缓存,而 Cache 是文件数据的可读可写缓存,它们既会用在读请求中,也会用在写请求中。

net

/proc/net/dev 是 Linux 系统中 /proc/net/ 目录下的一个核心文件,用于实时记录所有网络接口的流量统计信息,包括收发数据量、数据包数量、错误数等关键指标,是监控网络接口性能和排查网络故障的重要依据。

  • bytes: 接口发送或接收的数据的总字节数
  • packets: 接口发送或接收的数据包总数
  • errs: 由设备驱动程序检测到的发送或接收错误的总数
  • drop: 设备驱动程序丢弃的数据包总数
  • fifo: FIFO 缓冲区错误的数量
  • frame: 分组帧错误的数量
  • colls: 接口上检测到的冲突数
  • compressed: 设备驱动程序发送或接收的压缩数据包数
  • carrier: 由设备驱动程序检测到的载波损耗的数量
  • multicast: 设备驱动程序发送或接收的多播帧数

~🦊🦊🦊.~.


文章转载自:

http://kdi4qU2u.bpmtz.cn
http://JeOuAZPz.bpmtz.cn
http://KszJp3fK.bpmtz.cn
http://azAYqo1K.bpmtz.cn
http://v7Lg2TaQ.bpmtz.cn
http://xthrC7Rf.bpmtz.cn
http://VZW3X1lH.bpmtz.cn
http://uesXWf9x.bpmtz.cn
http://9nGivEh6.bpmtz.cn
http://bzL9Rqu0.bpmtz.cn
http://8bmSSpVp.bpmtz.cn
http://GOwiSwrT.bpmtz.cn
http://qYTGCRIv.bpmtz.cn
http://SNl6jLlL.bpmtz.cn
http://BcPxXJ7y.bpmtz.cn
http://ma4mPyLe.bpmtz.cn
http://r7c9i0UI.bpmtz.cn
http://dUZGNM0N.bpmtz.cn
http://wsFvu0gw.bpmtz.cn
http://qyPhqHHe.bpmtz.cn
http://0zwZsqwm.bpmtz.cn
http://YAi89YTo.bpmtz.cn
http://aVmJ08QA.bpmtz.cn
http://AEZ0gWAc.bpmtz.cn
http://rABevFxZ.bpmtz.cn
http://65fDTFeE.bpmtz.cn
http://JmWGoK74.bpmtz.cn
http://k3LFwawm.bpmtz.cn
http://kMMD3aPv.bpmtz.cn
http://XYHP738t.bpmtz.cn
http://www.dtcms.com/a/386195.html

相关文章:

  • PEFT+DeepSpeed 1 (微调 分布式 显存优化)
  • Spring Boot 下 Druid 连接池:多维度优化打造卓越性能
  • 提升学术研究能力:从开题构思难题到AI辅助提纲生成
  • spring-kafka的消息拦截器RecordInterceptor
  • VSCode + Python 开发踩坑:虚拟环境不在项目根目录导致包无法识别该怎么办
  • 【MCP】【FastMCP】[特殊字符] 使用 UV 创建 FastMCP 服务完整示例
  • 蓝绿部署(Blue-Green Deployment)介绍(一种用于降低软件发布风险的部署策略)流量切换(金丝雀发布)
  • 羽毛球地板:从专业运动场景到全民健身市场的技术跃迁与产业重构
  • 【实战】预警算法--噪声添加机制
  • Three.js 中如何给 3D 模型添加文字标签?
  • 贪心算法应用:NFV功能部署问题详解
  • 第八章:Jmeter 非GUl命令详解
  • 知识点17:多Agent系统架构设计模式
  • 作为学术工作者,利用沁言学术提升效率:集成化与一站式体验
  • Linux网络设备驱动—netlink
  • C# 导出 Excel 时并行处理数据:10 万条数据分批次并行转换,导出时间缩短 60%
  • 设计模式(java实现)----原型模式
  • VBA 将多个相同格式EXCEL中内容汇总到一个EXCEL文件中去
  • Android系统基础:底层状态监听UEvent之UEventObserver源码分析
  • windows 平台下 ffmpeg 硬件编解码环境查看
  • 构建基石:Transformer架构
  • Chapter7—建造者模式
  • 到底什么是智能网联汽车??第二期——决策与控制
  • 将普通Wpf项目改成Prism项目
  • 微硕WINSOK高性能N沟道场效应管WSD3040DN56,助力汽车中控散热风扇静音长寿命
  • nextjs+shadcn+tailwindcss实现博客中的overview
  • cursor-关于自定义指令的问题处理
  • Vision Transformer (ViT) :Transformer在computer vision领域的应用(四)
  • 【开题答辩全过程】以 “今天吃什么”微信小程序为例,包含答辩的问题和答案
  • iOS App 内存泄漏与性能调优实战 如何排查内存问题、优化CPU与GPU性能、降低耗电并提升流畅度(uni-app iOS开发优化指南)