1.伪文件系统(Pseudo Filesystem)
伪文件系统是一种虚拟的文件系统,它并不依赖于物理存储设备,而是存在于内存中,通过文件和目录的形式,为用户和应用程序提供访问系统内核数据、硬件设备或进程信息的接口。这些文件系统不占用外存空间,仅在内存中存在。
1.常见的伪文件系统
-
/proc 文件系统(procfs):
-
用于提供内核和进程的运行时信息,例如系统内存、进程状态、CPU信息等。
-
每个运行的进程在
/proc
下都有一个以进程ID命名的目录,包含该进程的各种信息。 -
用户可以通过读取或写入
/proc
中的文件来获取或修改内核参数。
-
-
/sys 文件系统(sysfs):
-
用于将内核中的设备和驱动程序信息以文件的形式导出到用户空间。
-
它提供了一种将硬件设备和驱动程序关联起来的方法,便于设备管理和调试。
-
-
管道文件系统(pipefs):
-
用于实现进程间的通信,数据存储在内存中的FIFO缓冲区中。
-
管道文件没有文件名,仅在同源进程间可见。
-
-
临时文件系统(tmpfs):
-
用于存储临时文件和目录,数据存储在内存中。
-
常用于存储系统运行时的临时数据,如
/dev/shm
、/run
等。
-
2./proc
的结构
/proc
文件系统以文件的形式组织和呈现系统信息,使得用户可以通过标准的文件操作命令(如 cat
、ls
等)来查看和修改这些信息。
/proc
文件系统由两部分组成:进程目录 和 系统信息文件。
1. 进程目录
/proc
下的每个数字目录(如 /proc/1
、/proc/2
等)都对应于一个正在运行的进程,目录名即为进程的 PID(进程ID)。这些目录中包含了与该进程相关的各种信息文件,例如:
-
/proc/[pid]/stat
:包含进程的状态信息,如进程ID、父进程ID、进程状态(运行、睡眠、僵尸等)、CPU使用时间等。 -
/proc/[pid]/status
:以更易读的格式显示进程的状态信息,包括进程名称、优先级、内存使用情况等。 -
/proc/[pid]/cmdline
:显示进程启动时的命令行参数。 -
/proc/[pid]/environ
:显示进程的环境变量。 -
/proc/[pid]/maps
:显示进程的内存映射信息,包括代码段、数据段、堆栈等。 -
/proc/[pid]/fd/
:包含该进程打开的所有文件描述符的符号链接。 -
/proc/[pid]/exe
:一个符号链接,指向该进程的可执行文件路径。
2. 系统信息文件
除了进程目录,/proc
还包含许多以文件形式呈现的系统信息。这些文件提供了关于系统硬件、内核参数、资源使用情况等的详细信息,例如:
-
/proc/version
:显示内核版本信息。 -
/proc/meminfo
:显示系统的内存使用情况,包括总内存、空闲内存、缓存和缓冲区大小等。 -
/proc/cpuinfo
:显示CPU的详细信息,如型号、核心数、主频等。 -
/proc/stat
:显示系统整体的统计信息,包括CPU使用情况、中断次数、上下文切换次数等。 -
/proc/uptime
:显示系统自启动以来的运行时间。 -
/proc/loadavg
:显示系统的平均负载情况,包括1分钟、5分钟和15分钟的平均负载。 -
/proc/filesystems
:显示系统支持的文件系统类型。 -
/proc/mounts
:显示当前挂载的文件系统及其挂载点。 -
/proc/net/
:包含网络相关的文件,如/proc/net/dev
(网络设备统计信息)、/proc/net/tcp
(TCP连接信息)等。 -
/proc/sys/
:包含可动态调整的内核参数,用户可以通过修改这些文件中的内容来调整内核行为。
3./proc
的用途
-
系统监控:通过查看
/proc
中的文件,用户可以实时了解系统的运行状态,如CPU使用率、内存占用情况、进程状态等。 -
故障排查:当系统出现异常时,
/proc
提供的详细信息可以帮助管理员快速定位问题。 -
性能优化:通过调整
/proc/sys/
中的内核参数,用户可以优化系统性能。 -
开发调试:程序员可以利用
/proc
中的进程信息来调试程序,例如查看进程的内存映射、文件描述符等。
4.top
top命令是通过 /proc/stat中数据,进行换算得出。
1. 系统信息区域
%Cpu(s): 1.0 us, 0.8 sy, 0.0 ni, 98.0 id, 0.2 wa, 0.0 hi, 0.1 si, 0.0 st
这行信息显示了 CPU 的使用情况,各个字段的含义如下:
-
us
(User):用户态(User Mode)的 CPU 使用率,表示 CPU 在用户态运行程序所占用的时间比例。这里为 1.0%。 -
sy
(System):内核态(Kernel Mode)的 CPU 使用率,表示 CPU 在内核态运行系统调用或内核任务所占用的时间比例。这里为 0.8%。 -
ni
(Nice):调整过优先级(Nice)的进程占用的 CPU 时间比例。这里为 0.0%,表示没有进程通过 nice 值调整优先级来占用 CPU。 -
id
(Idle):CPU 空闲时间的比例。这里为 98.0%,表示 CPU 大部分时间处于空闲状态。 -
wa
(I/O Wait):CPU 等待 I/O 操作完成的时间比例。这里为 0.2%,表示 CPU 等待磁盘或其他 I/O 设备的时间较少。 -
hi
(Hardware Interrupts):硬件中断占用的 CPU 时间比例。这里为 0.0%,表示硬件中断对 CPU 的占用非常低。 -
si
(Software Interrupts):软件中断占用的 CPU 时间比例。这里为 0.1%,表示软件中断对 CPU 的占用也很低。 -
st
(Steal Time):虚拟化环境中,虚拟机被其他虚拟机占用 CPU 时间的比例。这里为 0.0%,表示没有明显的 CPU 被抢占的情况。
2. 进程列表区域
在系统信息下方,top
显示了系统中各个进程的详细信息,包括:
-
PID:进程ID。
-
USER:进程所属的用户。
-
PR:进程的优先级。
-
NI:进程的nice值(优先级调整值)。
-
VIRT:进程占用的虚拟内存总量。
-
RES:进程占用的物理内存总量。
-
SHR:进程占用的共享内存总量。
-
S:进程状态(如运行、睡眠、僵尸等)。
-
%CPU:进程占用的 CPU 使用率。
-
%MEM:进程占用的物理内存使用率。
-
TIME+:进程占用的 CPU 时间。
-
COMMAND:进程的命令行名称。
2.系统性能
1.CPU平均负载
1.CPU平均负载(CPU Load Average)
反映了系统CPU的繁忙程度,指在单位时间内,系统中处于可运行状态(running)和不可中断状态(uninterruptible sleep)的平均进程数。这包括了正在使用CPU的进程和那些已经准备好但正在等待CPU时间的进程,以及那些正在等待I/O操作完成而不能被中断的进程。
使用uptime/top查看
它由三个值组成,分别表示过去1分钟、5分钟和15分钟内的平均负载。这些值越高,说明系统越繁忙。
2.平均负载和CPU使用率
虽然平均负载和CPU使用率都反映了系统的繁忙程度,但它们之间并没有直接的数学关系。CPU使用率表示CPU时间被使用的比例,而平均负载则表示在特定时间段内系统中活跃的进程数。
-
CPU使用率:表示CPU时间被使用的比例,包括用户态(user)和内核态(system)的CPU时间。
-
平均负载:表示在特定时间段内系统中活跃的进程数,包括正在运行和等待运行的进程。
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
3.如何解读CPU平均负载
-
理想值:对于单核CPU系统,理想值是1.0。这意味着CPU在大部分时间里都在高效运行,没有过度负载,也没有闲置。
-
多核CPU系统:对于多核CPU系统,理想值是CPU核心数。例如,对于一个4核CPU系统,理想值是4.0。如果平均负载低于4.0,说明CPU没有充分利用;如果高于4.0,说明系统可能过载。
-
1分钟平均负载:表示系统的即时负载情况。如果这个值很高,说明系统当前可能面临较大的压力。
-
5分钟和15分钟平均负载:这两个值提供了更长时间段内的负载情况,有助于判断系统是否持续过载。
-
数值基本相等:说明负载很平稳
2./proc/stat
向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息
-
第一列:
user
,表示用户态的 CPU 时间(单位:jiffies,时钟滴答)。 -
第二列:
nice
,表示 nice 值调整的用户态 CPU 时间。 -
第三列:
system
,表示内核态的 CPU 时间。 -
第四列:
idle
,表示 CPU 空闲时间。 -
第五列:
iowait
,表示 CPU 等待 I/O 操作完成的时间。 -
第六列:
irq
,表示处理硬件中断的时间。 -
第七列:
softirq
,表示处理软件中断的时间。 -
第八列:
steal
,表示虚拟化环境中,虚拟机被其他虚拟机抢占的时间。 -
第九列:
guest
,表示运行虚拟机的时间。 -
第十列:
guest_nice
,表示运行虚拟机且被 nice 调整的时间。
3. /proc/softirqs
1.什么是中断
中断是计算机系统中的一种机制,用于通知中央处理器(CPU)发生了需要立即处理的事件。中断可以由硬件设备(如键盘、鼠标、磁盘驱动器等)或软件(如操作系统、运行中的程序)产生。当一个中断发生时,它会打断当前正在执行的程序,让CPU转而处理一个称为中断服务例程(Interrupt Service Routine,ISR)的特殊程序。处理完中断后,CPU通常会返回到被打断的程序继续执行。
1.中断的类型
-
硬件中断:
-
由外部硬件设备触发,例如:
-
用户输入(键盘、鼠标操作)。
-
硬件故障(如硬盘故障)。
-
定时器到期(用于实现时间相关的功能,如计时)。
-
I/O操作完成(如磁盘读写操作完成)。
-
-
-
软件中断:
-
由软件触发,通常用于执行特定的系统调用或请求操作系统服务,例如:
-
进程间通信(IPC)。
-
系统调用(如请求读写文件)。
-
异常处理(如除零错误、非法内存访问)。
-
-
2.中断的作用
-
异步事件处理:
-
中断允许系统异步处理外部事件,提高了系统的响应能力。
-
-
多任务处理:
-
在多任务操作系统中,中断机制可以用于任务切换,实现多任务并发执行。
-
-
实时处理:
-
实时操作系统(RTOS)依赖中断来实现对实时事件的快速响应。
-
-
硬件抽象:
-
中断提供了一种硬件抽象,使得软件可以通过统一的接口与不同的硬件设备交互
-
2. 顶半部(上半部,Top Half)和下半部(Bottom Half)
在Linux系统中,中断处理被分为两个主要部分:顶半部(上半部,Top Half)和下半部(Bottom Half)。这种设计是为了解决中断处理程序执行时间过长和中断丢失的问题,同时确保关键任务能够迅速得到响应。
顶半部的主要任务是快速处理中断,并暂时关闭中断请求。它主要处理与硬件紧密相关或时间敏感的事情,比如对硬件的读取寄存器中的中断状态并清除中断标志。当一个中断发生时,顶半部会进行相应的硬件操作,并将中断例程的下半部挂到该设备的下半部执行队列中。由于顶半部的执行速度很快,它可以服务更多的中断请求。
下半部用于延迟处理顶半部未完成的工作。与顶半部不同,下半部是可以被中断的,这意味着它可以在执行过程中被新的中断打断。下半部几乎执行了中断处理程序的所有任务,但它并不是非常紧急的,通常比较耗时。因此,它的执行时机由系统自行安排,并不在中断服务上下文中执行。
Linux中实现下半部目前使用下面三种方法:
-
软中断(softirq)
-
tasklet
-
工作队列(work queue)。
3.什么是软中断
软中断是 Linux 内核中的一种机制,用于处理一些需要延迟执行的任务,例如网络数据包处理、定时器事件等。这些任务通常在硬件中断处理程序之外运行,以避免长时间占用硬件中断上下文。它与硬件中断(HardIRQ)不同,硬件中断是由外部硬件设备触发的,而软中断是由内核自身触发的。
4.软中断的类型
Linux 内核定义了多种软中断类型,每种类型对应一种特定的任务。常见的软中断类型包括:
-
HI
(High-priority):高优先级软中断。 -
TIMER
(Timer):定时器软中断,用于处理定时器事件。 -
NET_TX
(Network Transmit):网络数据发送软中断,用于处理网络数据包的发送。 -
NET_RX
(Network Receive):网络数据接收软中断,用于处理网络数据包的接收。 -
BLOCK
(Block I/O):块设备(如磁盘)相关软中断。 -
IRQ_POLL
(IRQ Poll):用于轮询中断处理。 -
TASKLET
(Tasklet):任务队列软中断,用于处理一些延迟执行的任务。 -
SCHED
(Scheduler):内核调度软中断,用于处理进程调度相关任务。 -
HRTIMER
(High-Resolution Timer):高精度定时器软中断。 -
RCU
(Read-Copy-Update):读-拷贝-更新软中断,用于处理内核中的 RCU 机制。
4./proc/meminfo
/proc/meminfo
提供了关于系统内存使用情况的详细信息。包括物理内存、交换空间(Swap)以及各种内存区域的使用情况。
交换空间(Swap Space)是 Linux 系统中的一种内存管理技术,它允许操作系统将部分内存页(memory pages)移动到磁盘上,以便为更重要的进程腾出物理内存(RAM)。交换空间在磁盘上分配,可以是专门的交换分区(swap partition)或者交换文件(swap file)
free是一个在类 U nix 系统中常用的命令行工具,用于显示系统中空闲和已使用的物理内存(RAM)、交换空间(Swap)以及共享内存(Shared Memory)的总量。这个命令提供了一种快速查看系统内存使用情况的方法。
共享内存(Shared Memory)是进程间通信(IPC,Inter-Process Communication)的一种方式,它允许两个或多个进程共享一个给定的内存区域。通过共享内存,进程可以直接读写内存中的数据,而不需要进行数据的复制,这使得进程间的数据交换非常快速和高效。
-
MemTotal:系统总的物理内存大小(单位:KB)。
-
MemFree:当前未被使用的物理内存大小(单位:KB)。
-
MemAvailable:可供新进程分配的物理内存大小(单位:KB),这个值考虑了操作系统可能会使用的内存。
-
Buffers(磁盘数据缓存):缓冲区是内存中的一部分,用于临时存储从磁盘读取的数据或即将写入磁盘的数据。它的主要作用是减少磁盘 I/O 操作的次数,提高数据传输的效率。
-
Cached(文件数据缓存):缓存是内存中用于存储文件系统数据的区域,它通常用于存储从磁盘读取的文件内容。缓存的目的是加快文件访问速度
-
SwapCached:被交换到交换空间但仍然在物理内存中的内存量(单位:KB)。
-
Active:最近被访问过的内存,包括文件系统缓存和页面缓存(单位:KB)。
-
Inactive:不常被访问的内存,这部分内存可以被回收利用(单位:KB)。
-
Active(anon):最近被访问过的匿名映射内存(单位:KB)。
-
Inactive(anon):不常被访问的匿名映射内存(单位:KB)。
-
Active(file):最近被访问过的文件映射内存(单位:KB)。
-
Inactive(file):不常被访问的文件映射内存(单位:KB)。
-
Unevictable:不能被回收的内存(单位:KB)。
-
Mlocked:被锁定的内存,这部分内存不能被交换到磁盘(单位:KB)。
-
SwapTotal:系统总的交换空间大小(单位:KB)。
-
SwapFree:当前未被使用的交换空间大小(单位:KB)。
-
Dirty:等待被写入磁盘的内存量(单位:KB)。
-
Writeback:正在被写入磁盘的内存量(单位:KB)。
-
AnonPages:匿名页面的内存量(单位:KB)。
-
Mapped:被文件映射到内存的页面量(单位:KB)。
-
Shmem:共享内存的大小(单位:KB)。
5./proc/net/dev
读取或更改网络适配器及统计信息
-
Interface:网络接口的名称,例如
lo
(本地回环接口)、eth0
(以太网接口)等。 -
Receive:接收数据的统计信息。
-
bytes
:接收的总字节数。 -
packets
:接收的总数据包数。 -
errs
:接收过程中发生的错误数。 -
drop
:接收过程中丢弃的数据包数。 -
fifo
:接收过程中发生的 FIFO(先进先出)溢出数。 -
frame
:接收过程中发生的帧错误数。 -
compressed
:接收过程中压缩的数据包数。 -
multicast
:接收的组播数据包数。
-
6.IO
在 Linux 系统中,I/O(输入/输出)操作的性能和状态可以通过多种工具和文件来查看。以下是一些常用的查看 I/O 的方法:
1. 通过 /proc
文件系统查看
Linux 的 /proc
文件系统是一个虚拟文件系统,提供了系统运行时的动态信息。以下是一些与 I/O 相关的文件:
-
/proc/diskstats
:显示磁盘 I/O 的统计信息。-
格式示例:
8 0 sda 123 456 789 1011 1213 1415 1617 1819 2021 2223 2324
-
字段含义:
-
8
和0
:主设备号和次设备号。 -
sda
:设备名称。 -
123
:读请求数。 -
456
:合并的读请求数。 -
789
:读扇区数。 -
1011
:读操作花费的时间(毫秒)。 -
1213
:写请求数。 -
1415
:合并的写请求数。 -
1617
:写扇区数。 -
1819
:写操作花费的时间(毫秒)。 -
2021
:当前正在处理的 I/O 请求。 -
2223
:当前正在处理的 I/O 请求花费的时间。 -
2324
:I/O 请求队列的总时间。
-
-
-
/proc/[pid]/io
:显示特定进程的 I/O 统计信息。-
示例内容
rchar: 123456 wchar: 789012 syscr: 345 syscw: 456 read_bytes: 789012 write_bytes: 123456 cancelled_write_bytes: 0
-
字段含义:
-
rchar
:从文件中读取的字节数。 -
wchar
:写入文件的字节数。 -
syscr
:发起的读操作次数。 -
syscw
:发起的写操作次数。 -
read_bytes
:实际读取的字节数。 -
write_bytes
:实际写入的字节数。 -
cancelled_write_bytes
:取消的写操作字节数。
-
-
2. 使用命令行工具
Linux 提供了许多命令行工具来查看 I/O 活动和性能:
-
iostat
:显示 CPU 和 I/O 设备的使用情况。-
示例命令:
iostat -x 1
-
选项:
-
-x
:显示扩展的 I/O 统计信息。 -
1
:每秒刷新一次。
-
-
输出示例:
复制
Linux 5.10.0-14-amd64 (localhost) 03/24/2025 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.23 0.00 0.45 0.12 0.00 98.18 Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 2.34 12.34 56.78 123456 789012
-
-
vmstat
:显示虚拟内存、进程、I/O、中断和 CPU 活动。-
示例命令:
bash复制
vmstat 1
-
选项:
-
1
:每秒刷新一次。
-
-
输出示例:
复制
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 123456 7890 12345 0 0 0 0 0 0 1 0 99 0
-
-
iotop
:实时显示每个进程的 I/O 使用情况。-
示例命令:
bash复制
iotop
-
输出示例:
复制
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1234 be/4 user1 0.00 B/s 0.00 B/s 0.00 % 0.00 % process1 5678 be/4 user2 0.00 B/s 0.00 B/s 0.00 % 0.00 % process2
-
-
hdparm --fibmap <file>
:查看文件的磁盘块分配情况。-
示例命令:
bash复制
hdparm --fibmap file.txt
-
输出示例:
复制
file.txt: physical block: 12345, 67890
-
3. 通过系统日志查看
某些 I/O 错误或事件可能会记录在系统日志中,例如 /var/log/syslog
或 /var/log/messages
。可以使用 grep
等工具来搜索相关的日志条目。
4. 通过监控工具
一些高级监控工具可以提供更详细的 I/O 性能分析,例如:
-
nmon
:提供系统性能的实时监控。 -
collectl
:轻量级的性能监控工具,可以记录和分析系统性能数据。 -
atop
:提供系统负载和资源使用情况的实时监控。
3.系统性能测试
1.stress
stress
是一个用于在 Linux 系统中进行压力测试的命令行工具,它可以模拟 CPU、内存、磁盘 I/O 等负载,帮助测试系统的性能和稳定性
-
-c
或--cpu N
:创建 N 个进程,模拟 CPU 负载。 -
-i
或--io N
:创建 N 个进程,模拟 I/O 负载。 -
-m
或--vm N
:创建 N 个进程,模拟内存分配和释放。 -
--vm-bytes B
:指定每个进程分配的内存大小,默认为 256M。 -
-d
或--hdd N
:创建 N 个进程,模拟磁盘写操作。 -
--hdd-bytes B
:指定磁盘写操作的文件大小,默认为 1GB。 -
-t
或--timeout N
:设置压力测试的持续时间(秒)。 -
-v
或--verbose
:详细输出。 -
-q
或--quiet
:静默输出