Linux proc/pid记录了什么

由于自己Linux系统知识基础比较薄弱,准备比较全面学习,准备从/proc这个目录开始。实际上这个目录也基本上记录所有系统运行时和内核的一些信息,所以如果想对linux系统有一个比较全面的了解,从/proc入手应该是个不错的选择。准备将自己学习的过程记录下来,分享给同样需要的朋友,也便于以后查阅。今天准备介绍一下/proc/pid这个目录到底是做什么用的,它到底记录了哪些信息。

cd /proc/之后,你会发现很多的目录和文件,今天首先来介绍的就是那些以数字命名的目录--它们就是linux中的进程号,每当你创建一个进程时,里面就会动态更新多出一个名称为pid的目录,然后你ls -l /proc/pid会发现如下信息:

dr-xr-xr-x  2 user group 0 Sep 19 16:17 attr

-r--------  1 user group 0 Sep 19 16:17 auxv
-r--r--r--  1 user group 0 Sep 19 16:17 cgroup
--w-------  1 user group 0 Sep 19 16:17 clear_refs
-r--r--r--  1 user group 0 Sep 18 14:18 cmdline
-rw-r--r--  1 user group 0 Sep 19 16:17 coredump_filter
-r--r--r--  1 user group 0 Sep 19 16:17 cpuset
lrwxrwxrwx  1 user group 0 Sep 19 16:17 cwd -> /home/user/zbs/mysql/node-2
-r--------  1 user group 0 Sep 19 16:17 environ
lrwxrwxrwx  1 user group 0 Sep 19 16:17 exe -> /home/user/zbs/xtradb-5.1.47_group/libexec/mysqld
dr-x------  2 user group 0 Sep 18 14:38 fd
dr-x------  2 user group 0 Sep 19 16:17 fdinfo
-r--------  1 user group 0 Sep 19 16:17 io
-r--------  1 user group 0 Sep 19 16:17 limits
-rw-r--r--  1 user group 0 Sep 19 16:17 loginuid
-r--r--r--  1 user group 0 Sep 19 16:17 maps
-rw-------  1 user group 0 Sep 19 16:17 mem
-r--r--r--  1 user group 0 Sep 19 16:17 mountinfo
-r--r--r--  1 user group 0 Sep 19 16:17 mounts
-r--------  1 user group 0 Sep 19 16:17 mountstats
dr-xr-xr-x 10 user group 0 Sep 19 16:17 net
-r--r--r--  1 user group 0 Sep 19 16:17 numa_maps
-rw-r--r--  1 user group 0 Sep 19 16:17 oom_adj
-r--r--r--  1 user group 0 Sep 19 16:17 oom_score
-r--r--r--  1 user group 0 Sep 19 16:17 pagemap
-r--r--r--  1 user group 0 Sep 19 16:17 personality
lrwxrwxrwx  1 user group 0 Sep 19 16:17 root -> /
-rw-r--r--  1 user group 0 Sep 19 16:17 sched
-r--r--r--  1 user group 0 Sep 19 16:17 sessionid
-r--r--r--  1 user group 0 Sep 19 16:17 smaps
-r--r--r--  1 user group 0 Sep 19 16:17 stack
-r--r--r--  1 user group 0 Sep 18 14:18 stat
-r--r--r--  1 user group 0 Sep 18 14:18 statm
-r--r--r--  1 user group 0 Sep 18 14:18 status
-r--r--r--  1 user group 0 Sep 19 16:17 syscall


dr-xr-xr-x 20 user group 0 Sep 19 16:17 task

下面我们挑常用的来解释(用红色标注出)

cmdline:这个主要是当前这个进程被运行时的command line,里面包括了运行时指定的一些参数,比如如果是mysqld的话就包括basedir==,datadir==,port=,socket=等等信息,你可以自己尝试一下。

cwd:current working directory,当前的工作目录

environ:这是个比较有用的文件,里面记录了当前进程的一些环境变量,比如一台机器上对同一个系统起多个实例(当然是不同端口、不同数据目录),而你想知道哪个进程对应的是在哪个数据目录起来的(可能是因为你想kill-9其中一个实例,因为你怕弄错,所以的确定哪个进程是对应哪个数据目录),那么此时你该怎么办呢?两者方法:1.strings /proc/pid/environ | grep PWD 2.tr \\0 \\n < /proc/pid/envrion | grep PWD 即可。当然里面还有很多的信息,你可以自己尝试。

exe:这个就是气这个进程的执行文件

fd:进程打开的文件描述符,我记得以前有人使用mysql遇到过two many openfiles的错误,这个就是打开太多的文件导致的,当然你如果只修改mysql里面的参数可能不会起作用,因为可能os上设置了一个比较小的数,所以要两者都调大。

fdinfo:跟上面一个一样,只不过只有文件描述符的值,没有表示这个文件描述符是对应打开的哪个文件。在/proc很多时候都是这样维护的:可能两个文件里面要表示的信息是一样的,但是有一个一般是以人能容易读懂的格式给出。

limits:这个跟fd有一点关联,因为这个里面限制了进程对系统资源的使用额度,比如前面说的你可以打开多少文件,具体的设定你可以修改这个文件/etc/securiry/limits.conf,里面也对每一项说得很清楚,只要会点E文,理解应该没问题

oom_adj/oom_score:这两个与linux的OOM机制有关的文件(关于OOM请看这里),oom_adj相当于一个因子,它值越大,在OOM时更容易被系统kill掉,但最终决定是否被kill的是oom_score,其实计算这个oom_score时,就是根据oom_adj来的,oom_adj更大,计算出来的oom_score就更大,也能容易在OOM时被系统kill掉。当然如果是很重要的服务现场,为了避免出现这种情况设置oom_adj=0就行,表示永远不会因为OOM被kill。

stat/status:这两者要表示的信息都是一样的,进程的基本状态,但是后一个是以人容易读懂的格式给出,怎么分析前者stat的内容-->见这里。

这里顺便提一个问题?我们遇到过通过查看stat里面的CPU time spent in user code(第14个值)这个值是0,不知道是什么原因导致的,有谁知道请留个言告诉一下


当然你会发现我还有很多的项没介绍?最主要的原因是有些我也不懂,其次,对于新手了解这些最常用的应该暂时足够了,等以后自己对它了解了再慢慢更新上来。当然如果你了解那些我没提到的目录、文件,欢迎大家留言互相交流~


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-09/70975.htm

<think>好的,我现在要回答用户关于Linux中/proc/PID/maps和smaps文件信息来源的问题。用户之前已经询问过pmap的原理,现在他们想更深入了解这两个文件的数据来源。我需要确保回答准确且详细,同时结构清晰,符合之前设定的系统级指令。 首先,我应该回忆一下/proc文件系统的基础知识。/proc是一个虚拟文件系统,提供内核和进程信息的接口。每个进程的目录下都有maps和smaps文件,里面包含内存映射的详细信息。用户想知道这些信息具体从哪里来,也就是内核中的哪个部分负责生成这些数据。 接下来,我需要分步骤解析这两个文件的来源。对于maps文件,它主要显示进程的虚拟内存区域(VMA),这些信息由内核的内存管理子系统维护。每当进程分配内存(如mmap或malloc)时,内核会创建或更新VMA结构。当用户读取/proc/PID/maps时,内核会遍历该进程的VMA链表,并将每个VMA的信息格式化输出。 然后是smaps文件,它比maps更详细,包含RSS、PSS、Swap等统计信息。这些数据来源于内核在管理内存时对每个VMA的跟踪。例如,RSS是通过统计每个VMA实际占用的物理页数计算而来,而PSS则是考虑共享内存后的分摊值。内核在生成smaps时需要收集每个VMA的这些统计信息,可能涉及遍历页表或相关结构来汇总数据。 我需要确保解释清楚每个指标(如RSS、PSS)是如何在内核中计算的,以及它们反映的具体内容。同时,要提到权限和映射文件的来源,比如设备号和inode来自文件系统的元数据,而映射文件名则来自对应的文件路径。 可能还需要比较maps和smaps的区别,强调smaps提供了更详细的内存使用统计,而maps主要展示内存区域的布局。此外,用户可能想知道为什么需要这两个不同的文件,或者它们各自的应用场景,比如性能分析或内存泄漏检测时使用smaps更合适。 最后,总结两者的数据来源都是内核内存管理子系统,并强调这些信息的动态生成特性,即每次读取/proc文件时实时获取当前状态,而不是静态存储的数据。这有助于用户理解其实时性和准确性。 在组织内容时,需要遵循用户之前设定的格式,使用分点说明,可能使用加粗标题,插入适当的代码块示例,以及LaTeX公式(如统计公式)。同时,确保语言简洁,技术细节准确,避免错误或模糊的描述。 可能还需要检查是否有遗漏的部分,例如权限标志的具体含义,或者设备号如何对应到存储设备,但这些可能超出用户当前问题的范围。不过,如果用户之前的问题涉及pmap的解析,适当提及这些细节可以增强回答的完整性。 总结来说,回答需要涵盖: 1. /proc文件系统的作用 2. maps文件的数据来源(VMA结构) 3. smaps文件的数据来源(更详细的内存统计) 4. 内核如何生成这些信息 5. 关键字段的解释和计算方式 6. 示例和实际应用 确保每个部分逻辑清晰,逐步深入,帮助用户从原理上理解这两个文件的信息来源。</think>--- ### **1. /proc 文件系统的基础** Linux 的 `/proc` 是一个**虚拟文件系统**,不占用磁盘空间,而是实时反映内核和进程的运行状态。进程目录 `/proc/<PID>/` 中的 `maps` 和 `smaps` 文件,本质是内核内存管理子系统动态生成的数据接口,用于暴露进程的**虚拟内存布局**和**详细内存统计信息**。 --- ### **2. /proc/PID/maps 的数据来源** #### **核心:内核的虚拟内存区域(VMA)** - **VMA(Virtual Memory Area)** 由内核内存管理模块(如 `mm_struct`)维护,记录进程的每一段虚拟内存区域的属性,例如: - 地址范围 (`vm_start`, `vm_end`) - 权限(读/写/执行、私有/共享) - 关联的文件或设备(如代码段映射到可执行文件) - **生成过程** 当用户读取 `/proc/<PID>/maps` 时,内核遍历进程的 VMA 链表,将每个 VMA 格式化为文本行。例如: ```plaintext 55a1b1c00000-55a1b1c01000 r--p 00000000 08:01 123456 /usr/bin/bash ``` - **权限标志**:来自 `vm_flags`(如 `VM_READ | VM_WRITE` 对应 `rw-`)。 - **映射文件**:若 VMA 关联到文件,则显示路径;匿名映射则标记为 `anon`。 --- ### **3. /proc/PID/smaps 的数据来源** #### **核心:VMA 的扩展统计** `smaps` 在 `maps` 的基础上,进一步统计每个 VMA 的物理内存使用细节,数据来源于内核的**页表管理**和**内存计数器**: - **RSS(Resident Set Size)** 统计 VMA 实际占用的物理页数量(通过遍历页表或 `get_mm_counter(mm, MM_FILEPAGES)` 等函数)。 - **PSS(Proportional Set Size)** 对共享内存按进程数分摊计算: $$ \text{PSS} = \frac{\text{共享物理页大小}}{\text{共享此页的进程数}} $$ - **Swap** 统计被换出到磁盘的页面数量(通过 `get_swap_pages()` 等机制)。 --- ### **4. 关键字段的内核实现** | 字段 | 来源 | |---------------|----------------------------------------------------------------------| | **地址范围** | 从 VMA 的 `vm_start` 和 `vm_end` 直接读取 | | **设备号** | 关联文件的设备号(取自 `struct inode` 中的 `i_sb->s_dev`) | | **Inode** | 关联文件的 inode 编号(来自 `vma->vm_file->f_inode->i_ino`) | | **映射文件** | 文件路径通过 `d_path()` 从 `vma->vm_file` 解析得到 | | **Swap** | 通过 `shmem_swap_usage()` 或 `page_swapcount()` 统计换出页 | --- ### **5. 动态生成的特性** - **实时性**:每次读取 `/proc/PID/{maps,smaps}` 时,内核**实时生成内容**,反映进程内存的当前状态。 - **无持久化存储**:数据不保存在磁盘中,仅通过内存计算临时生成。 --- ### **6. 示例对比** #### **maps 文件片段** ```plaintext 00400000-0040a000 r-xp 00000000 08:01 787449 /bin/ls ``` - 简单展示内存区域布局和基础属性。 #### **smaps 文件片段** ```plaintext 00400000-0040a000 r-xp 00000000 08:01 787449 /bin/ls Size: 40 kB Rss: 32 kB Pss: 10 kB Shared_Clean: 32 kB Swap: 0 kB ``` - 补充详细统计,帮助分析实际内存占用。 --- ### **总结** $$ \begin{aligned} \text{/proc/PID/maps} & = \text{内核VMA的格式化输出} \\ \text{/proc/PID/smaps} & = \text{VMA + 物理页统计与共享计算} \end{aligned} $$ 二者数据均直接来自内核内存管理模块,是诊断内存泄漏、分析进程内存行为的核心工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值