• Linux之proc详解


    1. /proc目录
       Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
       用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi目录不存在。   

        除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

    2. 子文件或子文件夹
    /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关

    /proc/cmdline 启动时传递给kernel的参数信息

    /proc/cpuinfo cpu的信息

    /proc/crypto 内核使用的所有已安装的加密密码及细节

    /proc/devices 已经加载的设备并分类

    /proc/dma 已注册使用的ISA DMA频道列表

    /proc/execdomains Linux内核当前支持的execution domains

    /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动

    /proc/filesystems 内核当前支持的文件系统类型

    /proc/interrupts x86架构中的每个IRQ中断数

    /proc/iomem 每个物理设备当前在系统内存中的映射

    /proc/ioports 一个设备的输入输出所使用的注册端口范围

    /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb

    /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理

    /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关

    /proc/locks 内核锁住的文件列表

    /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)

    /proc/meminfo RAM使用的相关信息

    /proc/misc 其他的主要设备(设备号为10)上注册的驱动

    /proc/modules 所有加载到内核的模块列表

    /proc/mounts 系统中使用的所有挂载

    /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)

    /proc/partitions 分区中的块分配信息

    /proc/pci 系统中的PCI设备列表

    /proc/slabinfo 系统中所有活动的 slab 缓存信息

    /proc/stat 所有的CPU活动信息

    /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的

    /proc/uptime 系统已经运行了多久

    /proc/swaps 交换空间的使用情况

    /proc/version Linux内核版本和gcc版本

    /proc/bus 系统总线(Bus)信息,例如pci/usb等

    /proc/driver 驱动信息

    /proc/fs 文件系统信息

    /proc/ide ide设备信息

    /proc/irq 中断请求设备信息

    /proc/net 网卡设备信息

    /proc/scsi scsi设备信息

    /proc/tty tty设备信息

    /proc/net/dev 显示网络适配器及统计信息

    /proc/vmstat 虚拟内存统计信息

    /proc/vmcore 内核panic时的内存映像

    /proc/diskstats 取得磁盘信息

    /proc/schedstat kernel调度器的统计信息

    /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用


    以下是/proc目录中进程N的信息:

    /proc/N pid为N的进程信息

    /proc/N/cmdline 进程启动命令

    /proc/N/cwd 链接到进程当前工作目录

    /proc/N/environ 进程环境变量列表

    /proc/N/exe 链接到进程的执行命令文件

    /proc/N/fd 包含进程相关的所有的文件描述符

    /proc/N/maps 与进程相关的内存映射信息

    /proc/N/mem 指代进程持有的内存,不可读

    /proc/N/root 链接到进程的根目录

    /proc/N/stat 进程的状态

    /proc/N/statm 进程使用的内存的状态

    /proc/N/status 进程状态信息,比stat/statm更具可读性

    /proc/self 链接到当前正在运行的进程

    3、/proc/stat/

        包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
    [work@builder ~]$ cat /proc/stat
    cpu 432661 13295 86656 422145968 171474 233 5346
    cpu0 123075 2462 23494 105543694 16586 0 4615
    cpu1 111917 4124 23858 105503820 69697 123 371
    cpu2 103164 3554 21530 105521167 64032 106 334
    cpu3 94504 3153 17772 105577285 21158 4 24
    intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    ctxt 19067887
    btime 1139187531
    processes 270014
    procs_running 1
    procs_blocked 0

    CPU 以及CPU0、CPU1、CPU2、CPU3每行:(CPU时间=user+system+nice+idle+iowait+irq+softirq)
    user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
    nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
    system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
    idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
    iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
    irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
    softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

    intr 这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
    ctxt 给出了自系统启动以来CPU发生的上下文交换的次数。
    btime 给出了从系统启动到现在为止的时间,单位为秒。
    processes (total_forks) 自系统启动以来所创建的任务的个数目。
    procs_running 当前运行队列的任务的数目。
    procs_blocked 当前被阻塞的任务的数目。

    4、/proc/partitions
    major minor #blocks name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq

    3 0 19535040 hda 12524 31127 344371 344360 12941 25534 308434 1097290 -1 15800720 28214662
    3 1 7172991 hda1 13 71 168 140 0 0 0 0 0 140 140
    3 2 1 hda2 0 0 0 0 0 0 0 0 0 0 0
    3 5 5116671 hda5 100 477 665 620 1 1 2 30 0 610 650
    3 6 265041 hda6 518 92 4616 2770 257 3375 29056 143880 0 46520 146650
    3 7 6980211 hda7 11889 30475 338890 340740 12683 22158 279376 953380 0 509350 1294120

    major: 主设备号。3代表hda。
    minor: 次设备号。7代表No.7分区。
    #blocks: 设备总块数(1024 bytes/block)。19535040*1024 => 20003880960(bytes) ~2G
    name: 设备名称。如hda7。
    rio: 完成的读I/O设备总次数。指真正向I/O设备发起并完成的读操作数目,也就是那些放到I/O队列中的读请求。注意很多进程发起的读操作(read())很可能会和其他的操作进行merge,不一定每个read()调用都引起一个I/O请求。
    rmerge: 进行了merge的读操作数目。
    rsect: 读扇区总数 (512 bytes/sector)
    ruse: 从进入读队列到读操作完成的时间累积 (毫秒)。上面的例子显示从开机开始,读hda7操作共用了约340秒。
    wio: 完成的写I/O设备总次数。
    wmerge: 进行了merge的写操作数目。
    wsect: 写扇区总数
    wuse: 从进入写队列到写操作完成的时间累积 (毫秒)
    running: 已进入I/O请求队列,等待进行设备操作的请求总数。上面的例子显示hda7上的请求队列长度为0。
    use: 扣除重叠等待时间的净等待时间 (毫秒)。一般比(ruse+wuse) 要小。比如5个读请求同时等待了1毫秒,那么ruse值为5ms, 而use值为1ms。use也可以理解为I/O队列处于不为空状态的总时间。hda7的I/O队列非空时间为509秒,约合8分半钟。
    aveq: 在队列中总的等待时间累积(毫秒)(约等于ruse+wuse)

    5、/proc/loadavg
        该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。
    [root@localhost ~]# cat /proc/loadavg
    4.61 4.36 4.15 9/84 5662

    lavg_1 (4.61) 1-分钟平均负载
    lavg_5 (4.36) 5-分钟平均负载
    lavg_15(4.15) 15-分钟平均负载
    nr_running (9) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
    nr_threads (84) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
    last_pid(5662) 最大的pid值,包括轻量级进程,即线程。
    假设当前有两个CPU,则每个CPU的当前任务数为4.61/2=2.31

    6、/proc/*/stat
        包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
    [root@localhost ~]# cat /proc/6873/stat
    6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0

    pid=6873 进程(包括轻量级进程,即线程)号
    comm=a.out 应用程序或命令的名字
    task_state=R 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
    ppid=6723 父进程ID
    pgid=6873 线程组号
    sid=6723 c该任务所在的会话组ID
    tty_nr=34819(pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
    tty_pgrp=6873 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
    task->flags=8388608 进程标志位,查看该任务的特性
    min_flt=77 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
    cmin_flt=0 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
    maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
    cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
    utime=1587 该任务在用户态运行的时间,单位为jiffies
    stime=1 该任务在核心态运行的时间,单位为jiffies
    cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
    cstime=0 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
    priority=25 任务的动态优先级
    nice=0 任务的静态优先级
    num_threads=3 该任务所在的线程组里线程的个数
    it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
    start_time=5882654 该任务启动的时间,单位为jiffies
    vsize=1409024(page) 该任务的虚拟地址空间大小
    rss=56(page) 该任务当前驻留物理地址空间的大小
    rlim=4294967295(bytes) 该任务能驻留物理地址空间的最大值
    start_code=134512640 该任务在虚拟地址空间的代码段的起始地址
    end_code=134513720 该任务在虚拟地址空间的代码段的结束地址
    start_stack=3215579040 该任务在虚拟地址空间的栈的结束地址
    kstkesp=0 esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
    kstkeip=2097798 指向将要执行的指令的指针, EIP(32 位指令指针)的当前值.
    pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
    block_sig=0 阻塞信号的位图
    sigign=0 忽略的信号的位图
    sigcatch=082985 被俘获的信号的位图
    wchan=0 如果该进程是睡眠状态,该值给出调度的调用点
    nswap 被swapped的页数,当前没用
    cnswap 所有子进程被swapped的页数的和,当前没用
    exit_signal=17 该进程结束时,向父进程所发送的信号
    task_cpu(task)=0 运行在哪个CPU上
    task_rt_priority=0 实时进程的相对优先级别
    task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程

    7、/proc/*/statm
        包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
    [root@localhost ~]# cat /proc/self/statm
    654 57 44 0 0 334 0

    CPU以及CPU0...的每行:
    Size (pages) 任务虚拟地址空间的大小 VmSize/4
    Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4
    Shared(pages) 共享页数 0
    Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4
    Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4
    Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
    dt(pages) 0

  • 相关阅读:
    校验文件数字签名的合法性(VerifyPE)
    windbg help
    VIM的常用操作
    使用Jsonp解决跨域数据访问问题
    Linux下不同文件编码的转换
    Segoe Font 介绍
    关于框架的一些思考
    Linux下Aptana Plugin For Eclipse的破解
    增强网站易用性的10个设计技巧
    Firebug中的console tab使用总结
  • 原文地址:https://www.cnblogs.com/defias/p/3428330.html
Copyright © 2020-2023  润新知