proc文件系统入门
2009-11-22 12:45:15 阿炯

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。在Linux 2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。

procfs 是进程文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/PID中存储的则是系统当前正在运行的进程的相关信息,其中PID为正在运行的进程号(因此在某进程结束后其相关目录则会消失)。

大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但相当文件的内容信息却不怎么具有可读性;不过可以使用一些命令如ps、free、lspci或top查看。

以下操作系统支持 procfs:
BSD、Solaris
Linux(将此概念扩展到了非进程相关数据)
IBM AIX (其实现基于Linux以提高兼容性)

在 FreeBSD 中 procfs 已被放弃,转而使用sysctl接口来获取进程相关信息,默认安装的 base 系统不依赖 procfs,FreeBSD 原生 ports 也不再依赖 procfs。macOS则完全弃用了procfs,只支持sysctl接口。为了提供Linux用户空间程序二进制兼容性,FreeBSD内核也提供有类似 Linux /proc/ 的linprocfs。

它的目录结构如下:

目录名称 目录内容
apm 高级电源管理信息
cmdline 内核命令行
Cpuinfo 关于Cpu信息
Devices 可以用到的设备(块设备/字符设备)
Dma 使用的DMA通道
Filesystems 支持的文件系统
Interrupts 中断的使用
Ioports I/O端口的使用
Kcore 内核核心印象
Kmsg 内核消息
Ksyms 内核符号表
Loadavg 负载均衡
Locks 内核锁
Meminfo 内存信息
Misc 杂项
Modules 加载模块列表
Mounts 加载的文件系统
Partitions 系统识别的分区表
Rtc 实时时钟
Slabinfo Slab池信息
Stat 全面统计状态表
Swaps 对换空间的利用情况
Version 内核版本
Uptime 系统正常运行时间

并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。另外在/proc下还有三个很重要的目录:net,scsi和sys。sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。如果系统不支持scsi,则scsi 目录不存在。 除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。Proc文件系统的名字就是由之而起。进程目录的结构如下:
目录名称 目录内容
Cmdline 命令行参数
Environ 环境变量值
Fd 一个包含所有文件描述符的目录
Mem 进程的内存被利用情况
Stat 进程状态
Status 进程当前状态,以可读的方式显示出来
Cwd 当前工作目录的链接
Exe 指向该进程的执行命令文件
Maps 内存映象
Statm 进程内存状态信息
Root 链接此进程的root目录

用户如果要查看系统信息,可以用cat命令。例如:
# cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC Mouse
13: 1 XT-PIC fpu PS/2
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0

用户还可以实现修改内核参数。在/proc文件系统中有一个有趣的目录:/proc/sys。它不仅提供了内核信息,而且可以通过它修改内核参数,来优化你的系统。但是你必须很小心,因为可能会造成系统崩溃。最好是先找一台无关紧要的机子,调试成功后再应用到你的系统上。要改变内核的参数,只要用vi编辑或echo参数重定向到文件中即可。下面有一个例子:
# cat /proc/sys/fs/file-max
4096
# echo 8192 > /proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
8192

如果你优化了参数,则可以把它们写成添加到文件rc.local中,使它在系统启动时自动完成修改。

Linux对/proc实现进行了扩展。每个正在运行的进程对应于/proc下的一个目录,目录名就是进程的PID,每个目录包含:
/proc/PID/cmdline 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息。

/proc/PID/cwd 当前工作目录的符号链接。

/proc/PID/environ 影响进程的环境变量的名字和值,当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示。

/proc/PID/exe 最初的可执行文件的符号链接, 如果它还存在的话,指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/PID/exe可以启动当前进程的一个拷贝。

/proc/PID/fd 目录,包含每个打开的文件描述符的符号链接,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接。

/proc/PID/fdinfo 目录,包含每个打开的文件描述符的位置和标记。

/proc/PID/maps 文本文件包含内存映射文件与块的信息,当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表。

/proc/PID/mem 二进制镜像(image)表示进程的虚拟内存, 只能通过ptrace化进程访问,当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取。

/proc/PID/root 该进程所能看到的根路径的符号链接。在Unix和Linux系统上如果没有僞chroot,那么进程的根路径是/,通常采用chroot命令使每个进程运行于独立的根目录。

/proc/PID/status 包含了进程的基本信息,包括运行状态、内存使用。

/proc/PID/stat 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用。

/proc/PID/statm 当前进程占用内存的状态信息,通常以“页面”(page)表示。

/proc/PID/task 目录包含了硬链接到该进程启动的任何任务,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容(内核2.6版本以后支持此功能)

(用户可以获得PID使用工具如pgrep, pidof或ps)

Linux 2.6把/proc下大量的非进程相关的系统信息移动到一个专门的伪文件系统,称为 sysfs(该文件系统是挂载到 /sys 上面):
电源管理系统(如果有的话)对应的目录/proc/acpi或/proc/apm。

/proc/buddyinfo, 信息关于伙伴内存分配器用于处理内存碎片。

/proc/bus, 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息。

/proc/fb, 可利用的帧缓冲的设备列表文件,包含帧缓冲设备的设备号和相关驱动信息。

/proc/cmdline, 传递给内核的启动选项,在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递。

/proc/cpuinfo, 包含CPU信息, 诸如厂商(vendor),型号 (family, model,model names), 速度, 缓存大小, 逻辑核数 , 物理核数, CPU flags,以及BogoMips。对于多核CPU,/proc/cpuinfo的逻辑核数"siblings"与物理核数"cpu cores"分别表示:
    "siblings" = (HT per CPU package) * (# of cores per CPU package)
    "cpu cores" = (# of cores per CPU package)

CPU package是指单独封装的一颗CPU。这可以区分超线程与双核,例如每颗CPU超线程数量为siblings / CPU cores,如果二者的值相等,则CPU不支持超线程。

/proc/crypto, 可利用的加密模块(密码算法及每个算法的详细信息)列表。

/proc/devices, 字符设备与块设备列表,按照设备ID排序,但给出了/dev名字的主要部分。

/proc/diskstats, 给出了每一块逻辑磁盘设备的一些信息,包含主设备号和设备组(与主设备号对应的设备类型)名,记录了每块磁盘设备的磁盘I/O统计信息(内核2.5.69以后的版本支持此功能)。

/proc/filesystems, 当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型。

/proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 设备的一些与中断、内存访问有关的信息;X86或X86_64体系架构系统上每个IRQ相关的中断号列表,多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号。

/proc/kmsg, 用于跟踪读取内核消息,保存了由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件。

/proc/meminfo, 包含内核管理内存的一些汇总信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值。

/proc/modules, 是/proc最重要的文件之一,当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看:其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量。

/proc/mounts, 包含了当前安装设备及安装点的符号链接,在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;其中第一列表示挂载的设备,第二列表示在当前目录树中的挂载点,第三点表示当前文件系统的类型,第四列表示挂载属性(ro或者rw),第五列和第六列用来匹配/etc/mtab文件中的转储(dump)属性。

/proc/net/, 该目录包含了当前网络栈的信息,特别是/proc/net/nf_conntrack列出了存在的网络连接(对跟踪路由特别有用,因为iptables转发被用于重定向网络连接)。

/proc/partitions, 一个设备号、尺寸与/dev名的列表,内核用于辨别已存在的硬盘分区,块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目。

/proc/scsi, 给出任何通过SCSI或RAID控制器挂接的设备的信息。

/proc/self (即/proc/PID/其中进程ID是当前进程的) 为当前进程的符号链接。

/proc/slabinfo, Linux内核频繁使用的对象的统计信息,在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息。

/proc/swaps, 活动交换分区的信息,如尺寸、优先级等,当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大。

/proc/sys,动态可配置的内核选项. 其下的目录对应与内核区域,包含了可读与可写的虚拟文件(virtual file)。

/proc/sysvipc, 包括共享内存与进程间通信 (IPC)信息。

/proc/tty, 包含当前终端信息; /proc/tty/driver是可利用的tty类型列表,其中的每一个是该类型的可用设备列表。

/proc/uptime, 内核启动后经过的秒数与idle模式的秒数,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒。

/proc/version, 包含Linux内核版本,发布号(distribution number), 编译内核的gcc版本,其他相关的版本。

/proc/iomem 每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息。

/proc/ioports 当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;第一列表示注册的I/O端口范围,其后表示相关的设备。

/proc/kallsyms 模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出(内核2.5.71以后的版本支持此功能),通常这个文件中的信息量相当大。

/proc/kcore 系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此通常由GBD通常调试工具使用,但不能使用常规文件查看指令打开此文件。

/proc/loadavg 保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID。

/proc/locks 保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问。

/proc/mdstat 保存了使用软RAID相关的多块磁盘的当前状态信息。

/proc/pci 内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替。

/proc/stat 实时追踪自系统上次启动以来的多种统计信息,信息量较大,其中:
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数;
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目。

/proc/vmstat 当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好。

/proc/zoneinfo 内存区域(zone)的详细信息列表,信息量较大。


/proc/sys目录

与/proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo  DATA > /path_of_your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。

abi/execution domains & personalities
debug/<empty>
dev/device specific information (eg dev/cdrom/info)
fs/specific filesystemsfilehandle, inode, dentry and quota tuningbinfmt_misc <Documentation/admin-guide/binfmt-misc.rst>
kernel/global kernel info / tuningmiscellaneous stuff
net/networking stuff, for documentation look in:<Documentation/networking/>
proc/<empty>
sunrpc/SUN Remote Procedure Call (NFS)
vm/memory management tuningbuffer and cache management
user/Per user per user namespace limits


1、/proc/sys/debug

子目录,此目录通常是一空目录。

2、/proc/sys/dev

子目录,为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev/cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能)目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。

3、/proc/sys/kernel/

1)/proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到ctrl+alt+delete按键组合时如何反应。这两个值分别是:
0表示捕获ctrl+alt+delete,并将其送至 init 程序;这将允许系统可以安全地关闭和重启,就好象输入shutdown命令一样。
1表示不捕获ctrl+alt+delete,将执行非正常的关闭,就好象直接关闭电源一样。

缺省设置:0
建议设置:1,防止意外按下ctrl+alt+delete导致系统非正常重启。

2)proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。

缺省设置:8192

3)/proc/sys/kernel/msgmnb
该文件指定一个消息队列的最大长度(bytes)。

缺省设置:16384

4)/proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。

缺省设置:16

5)/proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。
0秒表示在发生内核严重错误时将禁止自动重新引导。

缺省设置:0

6)proc/sys/kernel/shmall
该文件表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。

缺省设置:2097152

7)/proc/sys/kernel/shmmax
该文件表示内核所允许的最大共享内存段的大小(bytes)。

缺省设置:33554432
建议设置:物理内存 * 50%

实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。
可以通过设置shmmax,然后执行ipcs -l来验证。

8)/proc/sys/kernel/shmmni
该文件表示用于整个系统的共享内存段的最大数目(个)。

缺省设置:4096

9)/proc/sys/kernel/threads-max
该文件表示内核所能使用的线程的最大数目。

缺省设置:2048

10) /proc/sys/kernel/sem
该文件用于控制内核信号量,信号量是System VIPC用于进程间通讯的方法。建议设置:250 32000 100 128
第一列,表示每个信号集中的最大信号量数目。
第二列,表示系统范围内的最大信号量总数目。
第三列,表示每个信号发生时的最大系统操作数目。
第四列,表示系统范围内的最大信号集总数目。
所以,(第一列)*(第四列)=(第二列)

以上设置,可以通过执行ipcs -l来验证。

4、/proc/sys/vm/

1)/proc/sys/vm/block_dump
该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作。

缺省设置:0,禁用Block Debug模式

2)/proc/sys/vm/dirty_background_ratio
该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘。

缺省设置:10

3)/proc/sys/vm/dirty_expire_centisecs
该文件表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。

缺省设置:3000(1/100秒)

4)/proc/sys/vm/dirty_ratio
该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时进程自行把脏数据写回磁盘。

缺省设置:40

5)/proc/sys/vm/dirty_writeback_centisecs
该文件表示pdflush进程周期性间隔多久把脏数据写回磁盘。

缺省设置:500(1/100秒)

6)/proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。

缺省设置:100

7)/proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。

缺省设置:724(512M物理内存)

8)/proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。

缺省设置:2(只读)
9)/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。

缺省设置:0

10) /proc/sys/vm/overcommit_ratio
该文件表示,如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。
系统可分配内存=交换空间+物理内存*overcommit_ratio/100

缺省设置:50(%)

11) /proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。

缺省设置:3(2的3次方,8页)

12) /proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。

缺省设置:60

13) legacy_va_layout
该文件表示是否使用最新的32位共享内存mmap()系统调用,Linux支持的共享内存分配方式包括mmap(),Posix,System VIPC。
0使用最新32位mmap()系统调用。
1用2.4内核提供的系统调用。

缺省设置:0

14) nr_hugepages
该文件表示系统保留的hugetlb页数。

15) hugetlb_shm_group
该文件表示允许使用hugetlb页创建System VIPC共享内存段的系统组ID。


5、/proc/sys/fs/

1)/proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开
文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。

缺省设置:4096
建议设置:65536

2)/proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。

6、/proc/sys/net/core/

该目录下的配置文件主要用来控制内核和网络层之间的交互行为。

1) /proc/sys/net/core/message_burst
写新的警告消息所需的时间(以 1/10 秒为单位);在这个时间内系统接收到的其它警告消息会被丢弃。这用于防止某些企图用消息“淹没”系统的人所使用的拒绝服务(Denial of Service)攻击。

缺省设置:50(5秒)

2) /proc/sys/net/core/message_cost
该文件表示写每个警告消息相关的成本值。该值越大,越有可能忽略警告消息。

缺省设置:5

3) /proc/sys/net/core/netdev_max_backlog
该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

缺省设置:300

4) /proc/sys/net/core/optmem_max
该文件表示每个套接字所允许的最大缓冲区的大小。

缺省设置:10240

5) /proc/sys/net/core/rmem_default
该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。

缺省设置:110592

6) /proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。

缺省设置:131071

7) /proc/sys/net/core/wmem_default
该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

缺省设置:110592

8) /proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。

缺省设置:131071


7、/proc/sys/net/ipv4/

1)/proc/sys/net/ipv4/ip_forward
该文件表示是否打开IP转发。
0禁止
1转发

缺省设置:0

2)/proc/sys/net/ipv4/ip_default_ttl
该文件表示一个数据报的生存周期(Time To Live),即最多经过多少路由器。

缺省设置:64
增加该值会降低系统性能。

3)/proc/sys/net/ipv4/ip_no_pmtu_disc
该文件表示在全局范围内关闭路径MTU探测功能。

缺省设置:0

4)/proc/sys/net/ipv4/route/min_pmtu
该文件表示最小路径MTU的大小。

缺省设置:552

5)/proc/sys/net/ipv4/route/mtu_expires
该文件表示PMTU信息缓存多长时间(秒)。

缺省设置:600(秒)

6)/proc/sys/net/ipv4/route/min_adv_mss
该文件表示最小的MSS(Maximum Segment Size)大小,取决于第一跳的路由器MTU。

缺省设置:256(bytes)

IP Fragmentation

1)/proc/sys/net/ipv4/ipfrag_low_thresh/proc/sys/net/ipv4/ipfrag_low_thresh
两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最低内存分配值。

缺省设置:
196608(ipfrag_low_thresh)
262144(ipfrag_high_thresh)

2)/proc/sys/net/ipv4/ipfrag_time
该文件表示一个IP分段在内存中保留多少秒。

缺省设置:30(秒)

INET Peer Storage

1)/proc/sys/net/ipv4/inet_peer_threshold
INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多,存活期越低,GC 间隔越短。

缺省设置:65664

2)/proc/sys/net/ipv4/inet_peer_minttl
条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。

缺省设置:120

3)/proc/sys/net/ipv4/inet_peer_maxttl
条目的最大存活期。在此期限到达之后,如果缓冲池没有耗尽压力的话(例如:缓冲池中的条目数目非常少),不使用的条目将会超时。该值以 jiffies为单位测量。

缺省设置:600
4)/proc/sys/net/ipv4/inet_peer_gc_mintime
废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。该值以 jiffies为单位测量。

5)/proc/sys/net/ipv4/inet_peer_gc_maxtime
废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。该值以 jiffies为单位测量。

缺省设置:120

TCP Variables

1)/proc/sys/net/ipv4/tcp_syn_retries
该文件表示本机向外发起TCP SYN连接超时重传的次数,不应该高于255;该值仅仅针对外出的连接,对于进来的连接由tcp_retries1控制。

缺省设置:5

2)/proc/sys/net/ipv4/tcp_keepalive_probes
该文件表示丢弃TCP连接前,进行最大TCP保持连接侦测的次数。保持连接仅在SO_KEEPALIVE套接字选项被打开时才被发送。

缺省设置:9(次)

3)/proc/sys/net/ipv4/tcp_keepalive_time
该文件表示从不再传送数据到向连接上发送保持连接信号之间所需的秒数。

缺省设置:7200(2小时)

4)/proc/sys/net/ipv4/tcp_keepalive_intvl
该文件表示发送TCP探测的频率,乘以tcp_keepalive_probes表示断开没有相应的TCP连接的时间。

缺省设置:75(秒)

5)/proc/sys/net/ipv4/tcp_retries1
该文件表示放弃回应一个TCP连接请求前进行重传的次数。
  
缺省设置:3

6)/proc/sys/net/ipv4/tcp_retries2
该文件表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。
  
缺省设置:15

7)/proc/sys/net/ipv4/tcp_orphan_retries
在近端丢弃TCP连接之前,要进行多少次重试。默认值是 7 个,相当于 50秒–16分钟,视 RTO 而定。如果您的系统是负载很大的web服务器,那么也许需要降低该值,这类 sockets 可能会耗费大量的资源。另外参考tcp_max_orphans。

8)/proc/sys/net/ipv4/tcp_fin_timeout
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。可以设置该值,但需要注意,如果您的机器为负载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。

缺省设置:60(秒)

9)/proc/sys/net/ipv4/tcp_max_tw_buckets
系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果网络条件需要比默认值更多,则可以提高它(或许还要增加内存)。

缺省设置:180000

10) /proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随意修改这个值。

缺省设置:0

11) /proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。

缺省设置:0

12) /proc/sys/net/ipv4/tcp_max_orphans
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要依赖这个或是人为的降低这个限制。

缺省设置:8192

13) /proc/sys/net/ipv4/tcp_abort_on_overflow
当守护进程太忙而不能接受新的连接,就向对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。

缺省设置:0

14) /proc/sys/net/ipv4/tcp_syncookies
该文件表示是否打开TCP同步标签(syncookie),内核必须打开了CONFIG_SYN_COOKIES项进行编译。同步标签(syncookie)可以防止一个套接字在有过多试图连接到达时引起过载。

缺省设置:0

15) /proc/sys/net/ipv4/tcp_stdurg
使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的BSD解释,因此如果您在 Linux 打开它,或会导致不能和它们正确沟通。

缺省设置:0

16) /proc/sys/net/ipv4/tcp_max_syn_backlog
对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于超过 128Mb 内存的系统,默认值是 1024,低于 128Mb 的则为 128。如果服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己的ICMP ECHO请求或那些广播地址的请求。

缺省设置:1024

17) /proc/sys/net/ipv4/tcp_window_scaling
该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到65535字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。

缺省设置:1

18) /proc/sys/net/ipv4/tcp_sack
该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。

缺省设置:1

19) /proc/sys/net/ipv4/tcp_timestamps
该文件表示是否启用以一种比超时重发更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。

缺省设置:1

20) /proc/sys/net/ipv4/tcp_fack
该文件表示是否打开FACK拥塞避免和快速重传功能。

缺省设置:1

21) /proc/sys/net/ipv4/tcp_dsack
该文件表示是否允许TCP发送“两个完全相同”的SACK。

缺省设置:1

22) /proc/sys/net/ipv4/tcp_ecn
该文件表示是否打开TCP的直接拥塞通告功能。

缺省设置:0

23) /proc/sys/net/ipv4/tcp_reordering
该文件表示TCP流中重排序的数据报最大数量。

缺省设置:3

24) /proc/sys/net/ipv4/tcp_retrans_collapse
该文件表示对于某些有bug的打印机是否提供针对其bug的兼容性。

缺省设置:1

25) /proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。

缺省设置:4096 16384 131072

26) /proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值,今天选择参数 SO_SNDBUF则不受该值影响。

缺省设置:4096 87380 174760

27) /proc/sys/net/ipv4/tcp_mem
该文件包含3个整数值,分别是:low,pressure,high
Low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
Pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
High:允许所有tcp sockets用于排队缓冲数据报的页面量。
一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

缺省设置:24576 32768 49152

28) /proc/sys/net/ipv4/tcp_app_win
该文件表示保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

缺省设置:31

29) /proc/sys/net/ipv4/tcp_adv_win_scale
该文件表示计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale >; 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

缺省设置:2

IP Variables

1)/proc/sys/net/ipv4/ip_local_port_range
该文件表示TCP/UDP协议打开的本地端口号。

缺省设置:1024 4999
建议设置:32768 61000

2)/proc/sys/net/ipv4/ip_nonlocal_bind
该文件表示是否允许进程邦定到非本地地址。

缺省设置:0

3)/proc/sys/net/ipv4/ip_dynaddr
该参数通常用于使用拨号连接的情况,可以使系统动能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该文件表示是否允许动态地址,如果该值非0,表示允许;如果该值大于1,内核将通过log记录动态地址重写信息。

缺省设置:0

4)/proc/sys/net/ipv4/icmp_echo_ignore_all/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
该文件表示内核是否忽略所有的ICMP ECHO请求,或忽略广播和多播请求。
0 响应请求
1 忽略请求

缺省设置:0
建议设置:1

5)/proc/sys/net/ipv4/icmp_ratelimit

6)/proc/sys/net/ipv4/icmp_ratemask

7)/proc/sys/net/ipv4/icmp_ignore_bogus_error_reponses
某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会记录这种警告信息。

缺省设置:0

8)/proc/sys/net/ipv4/igmp_max_memberships
该文件表示多播组中的最大成员数量。

缺省设置:20

Other Configuration

1)/proc/sys/net/ipv4/conf/*/accept_redirects
如果主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0以消除安全性隐患。

2)/proc/sys/net/ipv4/*/accept_source_route
是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角度出发,建议关闭该功能。

3)/proc/sys/net/ipv4/*/secure_redirects
其实所谓的“安全重定向”就是只接受来自网关的“重定向”icmp包。该参数就是用来设置“安全重定向”功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值为启用。

4)/proc/sys/net/ipv4/*/proxy_arp
设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,缺省值为0。该参数通常只对充当路由器的linux主机有用。

8、性能优化策略

基本优化
1)关闭后台守护进程
系统安装完后,系统会默认启动一些后台守护进程,有些进程并不是必需的;因此,关闭这些进程可以节省一部分物理内存消耗。以root身份登录系统,运行ntsysv,选中如下进程:
iptables
network
syslog
random
apmd
xinetd
vsftpd
crond
local
修改完后,重新启动系统。如此,系统将仅仅启动选中的这些守护进程。

2)减少终端连接数
系统默认启动6个终端,而实际上只需启动3个即可;以root身份登录系统,运行vi /etc/inittab,修改成如下:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
如上所述,注释掉4、5、6终端。

网络优化
1)优化系统套接字缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216

2)优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

3)优化网络设备接收队列
net.core.netdev_max_backlog=3000

4)关闭路由相关功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0

net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0

net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0

net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0

5)优化TCP协议栈
打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1

打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1

减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30

减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800

增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192


其他文件依赖于不同的硬件,模块配置与内核改变。

Linux下使用 /proc 的基本工具是 procps (/proc processes) 中的程序,这个程序只对 procfs 具有意义。procfs 对部分功能从核心态移到用户态的过程中产生重大的意义,GNU 版本的 ps 只需在用户态底下运作透过 procfs 获取资料便可以完成所有的工作。

相关命令:
sysctl
lsdev 收集相关设备的DMA, IRQ, I/O端口信息并汇总显示
procinfo

Cygwin实现的 /proc 与Linux基本一致。


/proc文件系统中重要的网络参数

在/proc/sys/net/ipv4/目录下,包含的是和tcp/ip协议相关的各种参数,上面也详细谈到了,下面再对这些比较重要网络参数详细的说明一些。
ip_forward 参数类型:BOOLEAN
0 - 关闭(默认值)
!0 – 打开ip转发(非0,通常为1)

在网络本地接口之间转发数据报。该参数非常特殊,对该参数的修改将导致其它所有相关配置参数恢复其默认值(对于主机参阅RFC1122,对于路由器参见RFC1812)

ip_default_ttl 参数类型:INTEGER ,默认值为 64 。表示IP数据报的Time To Live值。

ip_no_pmtu_disc 参数类型:BOOLEAN ,关闭路径MTU探测,默认值为FALSE

ipfrag_high_thresh 参数类型:整型 ,用来组装分段的IP包的最大内存量。当ipfrag_high_thresh数量的内存被分配来用来组装IP包,则IP分片处理器将丢弃数据报直到ipfrag_low_thresh数量的内存被用来组装IP包。

ipfrag_low_thresh 参数类型:整型 ,参见ipfrag_high_thresh。

ipfrag_time 参数类型:整型 ,保存一个IP分片在内存中的时间。

inet_peer_threshold 参数类型:整型 ,INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多,存活期越低,GC 间隔越短。

inet_peer_minttl 参数类型:整型 ,条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。

inet_peer_maxttl 参数类型:整型 ,条目的最大存活期。在此期限到达之后,如果缓冲池没有耗尽压力的话(例如,缓冲池中的条目数目非常少),不使用的条目将会超时。该值以 jiffies为单位测量。

inet_peer_gc_mintime 参数类型:整型 ,废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值以 jiffies为单位测量。

inet_peer_gc_maxtime 参数类型:整型 ,废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。 该值以 jiffies为单位测量。

tcp_syn_retries 参数类型:整型 ,对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。

tcp_synack_retries 参数类型:整型 ,对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。

tcp_keepalive_time 参数类型:整型 ,当keepalive打开的情况下,TCP发送keepalive消息的频率,默认值是2个小时。

tcp_keepalive_probes 参数类型:整型 ,TCP发送keepalive探测以确定该连接已经断开的次数,默认值是9。

tcp_keepalive_interval 参数类型:整型,探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。

tcp_retries1 参数类型:整型 ,当出现可疑情况而必须向网络层报告这个可疑状况之前,需要进行多少次重试。最低的 RFC 数值是 3 ,这也是默认值,根据RTO的值大约在3秒 - 8分钟之间。

tcp_retries2 参数类型:整型 ,在丢弃激活的TCP连接之前,需要进行多少次重试。RFC1122规定,该值必须大于100秒。默认值为15,根据RTO的值来决定,相当于13-30分钟。

tcp_orphan_retries 参数类型:整型 ,在近端丢弃TCP连接之前,要进行多少次重试。默认值是 7 个,相当于 50秒 - 16分钟,视 RTO 而定。如果您的系统是负载很大的web服务器,那么也许需要降低该值,这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。

tcp_fin_timeout 参数类型:整型 ,对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ,因为它们最多只吃 1.5K 的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。

tcp_max_tw_buckets 参数类型:整型 ,系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果网络条件需要比默认值更多,则可以提高它(或许还要增加内存)。

tcp_tw_recycle 参数类型:布尔 ,打开快速 TIME-WAIT sockets 回收。默认值是1。除非得到技术专家的建议或要求,请不要随意修改这个值。

tcp_max_orphans 参数类型:整型 ,系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要依赖这个或是人为的降低这个限制。

tcp_abort_on_overflow 参数类型:布尔 ,当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。

tcp_syncookies 参数类型:整型 ,只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。默认值是false。
注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现synflood消息,但是调查发现没有收到synflood攻击,而是合法 用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow。

syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。
tcp_stdurg 参数类型:整型 ,使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux 打开它,或会导致不能和它们正确沟通。默认值为为:FALSE 。

tcp_max_syn_backlog 参数类型:整型 ,对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于超过 128Mb 内存的系统,默认值是 1024 ,低于 128Mb 的则为 128。如果服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于 1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ,以保持 TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果 tcp_adv_win_scale??128Mb 32768-610000)则系统将忽略所有发送给自己的ICMP ECHO请求或那些广播地址的请求。
icmp_destunreach_rate - 整数
icmp_paramprob_rate - 整数
icmp_timeexceed_rate - 整数
icmp_echoreply_rate - 整数(not enabled per default)
限制发向特定目标的ICMP数据报的最大速率。0表示没有任何限制,否则表示jiffies数据单位中允许发送的个数。

icmp_ignore_bogus_error_responses - 布尔类型 ,某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会记录这种警告信息。默认值为False。

Jiffie: 内核使用的内部时间单位,在i386系统上大小为1/100s,在Alpha中为1/1024S。在/usr/include/asm/param.h中的HZ定义有特定系统的值。

conf/interface/*:
conf/all/*是特定的,用来修改所有接口的设置,is special and changes the settings for all interfaces. Change special settings per interface.

log_martians - 布尔类型 ,记录带有不允许的地址的数据报到内核日志中。

accept_redirects - 布尔类型 ,收发接收ICMP重定向消息。对于主机来说默认为True,对于用作路由器时默认值为False。

forwarding - 布尔类型 ,在该接口打开转发功能。

mc_forwarding - 布尔类型 ,是否进行多播路由。只有内核编译有CONFIG_MROUTE并且有路由服务程序在运行该参数才有效。

proxy_arp - 布尔类型 ,打开proxy arp功能。

shared_media - 布尔类型 ,发送(路由器)或接收(主机) RFC1620 共享媒体重定向。覆盖ip_secure_redirects的值。默认为True。

secure_redirects - 布尔类型 ,仅仅接收发给默认网关列表中网关的ICMP重定向消息,默认值是TRUE。

send_redirects - 布尔类型 ,如果是router,发送重定向消息,默认值是TRUE 。

bootp_relay - 布尔类型 ,接收源地址为0.b.c.d,目的地址不是本机的数据报。用来支持BOOTP转发服务进程,该进程将捕获并转发该包。默认为False,目前还没有实现。

accept_source_route - 布尔类型 ,接收带有SRR选项的数据报。对于主机来说默认为False,对于用作路由器时默认值为True。

rp_filter 参数类型
1 - 通过反向路径回溯进行源地址验证(在RFC1812中定义)。对于单穴主机和stub网络路由器推荐使用该选项。
0 - 不通过反向路径回溯进行源地址验证。 默认值为0。某些发布在启动时自动将其打开。

/proc/cpuinfo文件

该文件中存放了有关 cpu的相关信息(型号,缓存大小等)。

说明:以下只解释对我们计算Cpu使用率有用的相关参数。
参数    解释
processor (0)    cpu的一个物理标识

结论1:可以通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。


分类总结

接上文的详细介绍已经知道Linux下的proc是一个伪文件系统,提供了访问内核数据的方法,一般挂载在“/proc”目录,其中的大部分内容是只读的,挂载(mount)信息可能为:
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

proc文件系统支持如下挂载选项:
hidepid _n
gid=_gid

_n设置访问“/proc/[pid]”目录的权限,可以取值为0、1、2,0为默认值,表示任何人可以访问“/proc/[pid]”的所有目录,1表示只能访问访问者本身所属进程对应目录的内容,其它进程的目录的内容一概不能访问,这隐藏了敏感文件的信息如“/proc/[pid]/cmdline”、“/proc/[pid]/status”等,2类似于1,但是“/proc/[pid]”目录对于其它用户来说是不见的,也就是说不能直观地看到pid值,但PID确实是存在的,可以通过其它方法如kill -0 $PID获取,虽然隐藏了UID、GID,但是仍然可以通过命令stat获取,这增加了攻击者获取进程信息的难度。

_gid设置组ID,授权其成员可以获取进程信息(man sudoers)。

下面列举“/proc”文件系统下的文件和目录。

1、pid目录

“/proc/[pid]”,目录,pid为进程的数字ID,是个数值,每个运行着的进程都有这么一个目录。
“/proc/[pid]/attr”,目录,提供了安全相关的属性,可读可写,以支持安全模块如SELinux等,需配置CONFIG_SECURITY。
“/proc/[pid]/attr/current”,文件,当前的安全相关的属性。
“/proc/[pid]/attr/exec”,文件,执行命令execve时设置的安全相关的属性。
“/proc/[pid]/attr/fscreate”,文件,执行命令open、mkdir、symlink、mknod时设置的安全相关的属性。
“/proc/[pid]/attr/keycreate”,文件,执行命令add_key时设置的安全相关的属性。
“/proc/[pid]/attr/prev”,文件,最后一次执行命令execve时的安全相关的属性,即前一个“/proc/[pid]/attr/current”。
“/proc/[pid]/attr/sockcreate”,文件,创建socket时设置的安全相关的属性。
“/proc/[pid]/auxv”,文件,ELF解释器信息,格式为一个unsigned long类型的ID加一个unsigned long类型的值,最后为两个0(man getauxval)。
“/proc/[pid]/cgroup”,文件,进程所属的控制组,格式为冒号分隔的三个字段,分别是结构ID、子系统、控制组,需配置CONFIG_CGROUPS。
“/proc/[pid]/clear_refs”,文件,只写,只用于进程的拥有者,清除用于估算内存使用量的PG_Referenced和ACCESSED/YOUNG,有1、2、3、4四种策略,1表示清除相关的所有页,2表示清除相关的匿名页,3表示清除相关的映射文件的页,4表示清除相关的soft-dirty的页,需配置CONFIG_PROC_PAGE_MONITOR。
“/proc/[pid]/cmdline”,文件,只读,保存启动进程的完整的命令行字符串,如果是僵尸进程,这个文件为空。
“/proc/[pid]/comm”,文件,进程的命令名,不同的线程(man clone prctl pthread_setname_np)可能有不同的线程名,位置在“task/[tid]/comm”,名字长度超过TASK_COMM_LEN时会被截断。
“/proc/[pid]/coredump_filter”,文件,coredump过滤器,如00000033(man core),不同的二进制位表示过滤不同的信息。
“/proc/[pid]/cpuset”,文件,控制CPU和内存的节点(man cpuset)。
“/proc/[pid]/cwd”,目录,符号链接到当前工作目录。
“/proc/[pid]/environ”,文件,环境变量。
“/proc/[pid]/exe”,文件,符号链接到启动进程的完整命令。
“/proc/[pid]/fd/”,目录,包含当前的fd,这些fd符号链接到真正打开的文件。
“/proc/[pid]/fdinfo/”,目录,包含当前fd的信息,不同类型的fd信息不同。
“/proc/[pid]/io”,文件,IO信息。
“/proc/[pid]/gid_map”,文件,从用户命名空间映射的组ID的信息(man user_namespaces)。
“/proc/[pid]/limits”,文件,资源软、硬限制(man getrlimit)。
“/proc/[pid]/map_files/”,目录,包括一些内存映射文件(man mmap),文件名格式为BeginAddress-EndAddress,符号链接到映射的文件,需要配置CONFIG_CHECKPOINT_RESTORE。
“/proc/[pid]/maps”,文件,内存映射信息,下面“proc-pid-maps”详细介绍。
“/proc/[pid]/mem”,文件,用于通过open、read、lseek访问进程的内存页。
“/proc/[pid]/mountinfo”,文件,挂载信息,格式为36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue,以空格作为分隔符,从左到右各字段的意思分别是唯一挂载ID、父挂载ID、文件系统的设备主从号码、文件系统中挂载的根节点、相对于进程根节点的挂载点、挂载权限等挂载配置、可选配置、短横线表示前面可选配置的结束、文件系统类型、文件系统特有的挂载源或者为none、额外配置。
/proc/[pid]/mounts,文件,挂载在当前进程的文件系统列表,格式参照(man fstab)。
/proc/[pid]/mountstats,文件,挂载信息,格式形如device /dev/sda7 mounted on /home with fstype ext3 [statistics]。
/proc/[pid]/ns/,目录,保存了每个名字空间的入口,详见(man namespaces)。
/proc/[pid]/numa_maps,文件,numa即Non Uniform Memory Access,详见(man numa)。
/proc/[pid]/oom_adj,文件,调整OOM分数,OOM即Out Of Memory,发生OOM时OOM Killer根据OOM分数杀掉分数高的进程,默认值为0,会继承自父进程的设置。
/proc/[pid]/oom_score,文件,OOM分数。
/proc/[pid]/oom_score_adj,文件,OOM分值介于-1000到1000之间。
/proc/[pid]/pagemap,文件,当前进程的虚拟内存页映射信息,需要配置CONFIG_PROC_PAGE_MONITOR。
/proc/[pid]/personality,文件,进行执行域。
/proc/[pid]/root,目录,链接到了当前进程的根目录。
/proc/[pid]/seccomp,文件,seccomp模式下允许的系统调用只有read、write、_exit、sigreturn,Linux 2.6.23已弃用这个文件,由prctl替代。
/proc/[pid]/setgroups,文件,详见(man user_namespaces)。
“/proc/[pid]/smaps”,文件,内存映射信息,类似于pmap命令,需要配置CONFIG_PROC_PAGE_MONITOR,下面“proc-pid-smaps”详细介绍。
/proc/[pid]/stack,文件,内核空间的函数调用堆栈,需要配置CONFIG_STACKTRACE。
/proc/[pid]/stat,文件,进程状态信息,用于ps命令。
/proc/[pid]/statm,文件,进程内存使用信息,以空格分隔的7个数字,从左到右分别表示程序总大小、常驻内存大小、共享内存页大小、text code、library、data + stack、dirty pages。
/proc/[pid]/status,文件,可读性好的进程相关信息,下面“proc-pid-status”详细介绍。
/proc/[pid]/syscall,文件,系统调用相关信息,需要配置CONFIG_HAVE_ARCH_TRACEHOOK。
/proc/[pid]/task,目录,每个线程一个子目录,目录名为线程ID。
/proc/[pid]/timers,文件,POSIT定时器列表,包括定时器ID、信号等信息。
/proc/[pid]/uid_map,文件,用户ID映射信息,详见(man user_namespaces)。
/proc/[pid]/gid_map,文件,组ID映射信息,详见(man user_namespaces)。
/proc/[pid]/wchan,文件,进程休眠时内核中相应位置的符号表示,如do_wait。

2、proc-pid-maps

maps文件内容的格式如下:

       address                      perms offset    dev    inode        pathname
       00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon
       00651000-00652000 r--p 00051000 08:02 173521      /usr/bin/dbus-daemon
       00652000-00655000 rw-p 00052000 08:02 173521      /usr/bin/dbus-daemon
       00e03000-00e24000 rw-p 00000000 00:00 0           [heap]
       00e24000-011f7000 rw-p 00000000 00:00 0           [heap]
       ...
       35b1800000-35b1820000 r-xp 00000000 08:02 135522  /usr/lib64/ld-2.15.so
       35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522  /usr/lib64/ld-2.15.so
       35b1a20000-35b1a21000 rw-p 00020000 08:02 135522  /usr/lib64/ld-2.15.so
       35b1a21000-35b1a22000 rw-p 00000000 00:00 0
       35b1c00000-35b1dac000 r-xp 00000000 08:02 135870  /usr/lib64/libc-2.15.so
       35b1dac000-35b1fac000 ---p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
       35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
       35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870  /usr/lib64/libc-2.15.so
       ...
       f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0    [stack:986]
       ...
       7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0   [stack]
       7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0   [vdso]


address字段表示进程中内存映射占据的地址空间,格式为十六进制的BeginAddress-EndAddress。
perms字段表示权限,共四个字符,依次为rwxs或rwxp,其中r为read,w为write,x为execute,s为shared,p为private,对应位置没有权限时用一个短横线代替。
offset字段表示内存映射地址在文件中的字节偏移量。
dev字段表示device,格式为major:minor。
inode字段表示对应device的inode,0表示内存映射区域没有关联的inode,如未初始化的BSS数据段就是这种情况。
pathname字段用于内存映射的文件,对于ELF格式的文件来说,可以通过命令readelf -l查看ELF程序头部的Offset字段,与maps文件的offset字段作对比。pathname可能为空,表示匿名映射,这种情况下难以调试进程,如gdb、strace等命令。除了正常的文件路径之外,pathname还可能是下面的值:
[stack]    初始进程(主线程)的stack
[stack:<tid>]    线程IDtidstack
[vdso]    Virtual Dynamically linked Shared Object
[heap]    进程的heap


3、proc-pid-smaps

smaps文件内容的格式如下:

                      00400000-0048a000 r-xp 00000000 fd:03 960637       /bin/bash
                      Size:                552 kB
                      Rss:                 460 kB
                      Pss:                 100 kB
                      Shared_Clean:        452 kB
                      Shared_Dirty:          0 kB
                      Private_Clean:         8 kB
                      Private_Dirty:         0 kB
                      Referenced:          460 kB
                      Anonymous:             0 kB
                      AnonHugePages:         0 kB
                      Swap:                  0 kB
                      KernelPageSize:        4 kB
                      MMUPageSize:           4 kB
                      Locked:                0 kB


第一行内容同maps文件,剩下的是各种类型的内存映射大小,其中Rss表示当前常驻在RAM中的内存,Pss表示进程按比例共享的内存。

4、proc-pid-status

status文件内容的格式如下(查看当前shell命令所在进程的信息):

                  $ cat /proc/$$/status
                  Name:   bash
                  State:  S (sleeping)
                  Tgid:   3515
                  Pid:    3515
                  PPid:   3452
                  TracerPid:      0
                  Uid:    1000    1000    1000    1000
                  Gid:    100     100     100     100
                  FDSize: 256
                  Groups: 16 33 100
                  VmPeak:     9136 kB
                  VmSize:     7896 kB
                  VmLck:         0 kB
                  VmPin:         0 kB
                  VmHWM:      7572 kB
                  VmRSS:      6316 kB
                  VmData:     5224 kB
                  VmStk:        88 kB
                  VmExe:       572 kB
                  VmLib:      1708 kB
                  VmPMD:         4 kB
                  VmPTE:        20 kB
                  VmSwap:        0 kB
                  Threads:        1
                  SigQ:   0/3067
                  SigPnd: 0000000000000000
                  ShdPnd: 0000000000000000
                  SigBlk: 0000000000010000
                  SigIgn: 0000000000384004
                  SigCgt: 000000004b813efb
                  CapInh: 0000000000000000
                  CapPrm: 0000000000000000
                  CapEff: 0000000000000000
                  CapBnd: ffffffffffffffff
                  CapAmb:   0000000000000000
                  Seccomp:        0
                  Cpus_allowed:   00000001
                  Cpus_allowed_list:      0
                  Mems_allowed:   1
                  Mems_allowed_list:      0
                  voluntary_ctxt_switches:        150
                  nonvoluntary_ctxt_switches:     545


5、bus目录

/proc/bus,目录是已安装的总线。
/proc/bus/pccard
/proc/bus/pccard/drivers
/proc/bus/pci
/proc/bus/pci/devices

6、net目录

/proc/net,目录是网络伪文件系统相关。
/proc/net/arp
/proc/net/dev
/proc/net/dev_mcast
/proc/net/igmp
/proc/net/rarp
/proc/net/raw
/proc/net/snmp
/proc/net/tcp
/proc/net/udp
/proc/net/unix
/proc/net/netfilter/nfnetlink_queue

7、sys目录

/proc/sys,目录是系统变量相关信息,详细如下。
/proc/sys/abi
/proc/sys/debug
/proc/sys/dev
/proc/sys/fs
/proc/sys/fs/binfmt_misc
/proc/sys/fs/dentry-state
/proc/sys/fs/dir-notify-enable
/proc/sys/fs/dquot-max
/proc/sys/fs/dquot-nr
/proc/sys/fs/epoll
/proc/sys/fs/file-max
/proc/sys/fs/file-nr
/proc/sys/fs/inode-max
/proc/sys/fs/inode-nr
/proc/sys/fs/inode-state
/proc/sys/fs/inotify
/proc/sys/fs/lease-break-time
/proc/sys/fs/leases-enable
/proc/sys/fs/mqueue
/proc/sys/fs/nr_open
/proc/sys/fs/overflowgid
/proc/sys/fs/overflowuid
/proc/sys/fs/pipe-max-size
/proc/sys/fs/protected_hardlinks
/proc/sys/fs/protected_symlinks
/proc/sys/fs/suid_dumpable
/proc/sys/fs/super-max
/proc/sys/fs/super-nr
/proc/sys/kernel
/proc/sys/kernel/acct
/proc/sys/kernel/auto_msgmni
/proc/sys/kernel/cap_last_cap
/proc/sys/kernel/cap-bound
/proc/sys/kernel/core_pattern
/proc/sys/kernel/core_uses_pid
/proc/sys/kernel/ctrl-alt-del
/proc/sys/kernel/dmesg_restrict
/proc/sys/kernel/domainname
/proc/sys/kernel/hostname
/proc/sys/kernel/hotplug
/proc/sys/kernel/htab-reclaim
/proc/sys/kernel/kptr_restrict
/proc/sys/kernel/l2cr
/proc/sys/kernel/modprobe
/proc/sys/kernel/modules_disabled
/proc/sys/kernel/msgmax
/proc/sys/kernel/msgmni
/proc/sys/kernel/msgmnb
/proc/sys/kernel/ngroups_max
/proc/sys/kernel/ostype
/proc/sys/kernel/osrelease
/proc/sys/kernel/overflowgid
/proc/sys/kernel/overflowuid
/proc/sys/kernel/panic
/proc/sys/kernel/panic_on_oops
/proc/sys/kernel/pid_max
/proc/sys/kernel/powersave-nap
/proc/sys/kernel/printk
/proc/sys/kernel/pty
/proc/sys/kernel/pty/max
/proc/sys/kernel/pty/nr
/proc/sys/kernel/random
/proc/sys/kernel/random/uuid
/proc/sys/kernel/randomize_va_space
/proc/sys/kernel/real-root-dev
/proc/sys/kernel/reboot-cmd
/proc/sys/kernel/rtsig-max
/proc/sys/kernel/rtsig-nr
/proc/sys/kernel/sched_rr_timeslice_ms
/proc/sys/kernel/sched_rt_period_us
/proc/sys/kernel/sched_rt_period_us
/proc/sys/kernel/sem
/proc/sys/kernel/sg-big-buff
/proc/sys/kernel/shm_rmid_forced
/proc/sys/kernel/shmall
/proc/sys/kernel/shmmax
/proc/sys/kernel/shmmni
/proc/sys/kernel/sysctl_writes_strict
/proc/sys/kernel/sysrq
/proc/sys/kernel/version
/proc/sys/kernel/threads-max
/proc/sys/kernel/yama/ptrace_scope
/proc/sys/kernel/zero-paged
/proc/sys/net
/proc/sys/net/core/bpf_jit_enable
/proc/sys/net/core/somaxconn
/proc/sys/proc
/proc/sys/sunrpc
/proc/sys/vm
/proc/sys/vm/compact_memory
/proc/sys/vm/drop_caches
/proc/sys/vm/legacy_va_layout
/proc/sys/vm/memory_failure_early_kill
/proc/sys/vm/memory_failure_recovery
/proc/sys/vm/oom_dump_tasks
/proc/sys/vm/oom_kill_allocating_task
/proc/sys/vm/overcommit_kbytes
/proc/sys/vm/overcommit_memory
/proc/sys/vm/overcommit_ratio
/proc/sys/vm/panic_on_oom
/proc/sys/vm/swappiness

8、其它

/proc/apm,文件,apm即Advanced Power Management,需要配置CONFIG_APM。
/proc/buddyinfo,文件,用于诊断内存碎片问题。
/proc/cmdline,文件,系统启动时传递给Linux内核的参数,如lilo、grub等boot管理模块。
/proc/config.gz,文件,内核编译配置选项,需要配置CONFIG_IKCONFIG_PROC。
/proc/crypto,文件,内核加密API提供的加密列表。
/proc/cpuinfo,文件,CPU和系统架构信息,lscpu命令使用这个文件。
/proc/devices,文件,设备相关信息。
/proc/diskstats,文件,磁盘状态。
/proc/dma,文件,dma即Direct Memory Access。
/proc/driver/rtc,文件,系统运行时配置。
/proc/execdomains,文件,执行域列表。
/proc/fb,文件,Frame Buffer信息,需要配置CONFIG_FB。
/proc/filesystems,文件,内核支持的文件系统类型(man filesystems)。
/proc/fs,目录,挂载的文件系统信息。
/proc/ide,目录,用于IDE接口。
/proc/interrupts,文件,每个CPU每个IO的中断信息。
/proc/iomem,文件,IO内存映射信息。
/proc/ioports,文件,IO端口信息。
/proc/kallsyms,文件,用于动态链接和和模块绑定的符号定义。
/proc/kcore,文件,系统中ELF格式的物理内存。
/proc/kmsg,文件,内核信息,dmsg命令使用这个文件。
/proc/kpagecount,文件,每个物理页帧映射的次数,需要配置CONFIG_PROC_PAGE_MONITOR。
/proc/kpageflags,文件,每个物理页帧的掩码,需要配置CONFIG_PROC_PAGE_MONITOR。
/proc/ksyms,文件,同kallsyms。
/proc/loadavg,文件,工作负荷。
/proc/locks,文件,当前文件锁的状态。
/proc/malloc,文件,需要配置CONFIG_DEBUG_MALLOC。
/proc/meminfo,文件,系统内存使用统计,free命令使用了这个文件。
/proc/modules,文件,系统加载的模块信息,相关命令为lsmod。
/proc/mounts,文件,链接到了/self/mounts。
/proc/mtrr,文件,Memory Type Range Registers。
/proc/partitions,文件,分区信息。
/proc/pci,文件,PCI接口设备。
/proc/profile,文件,用于readprofile命令作性能分析。
/proc/scsi,目录,SCSI接口设备。
/proc/scsi/scsi
/proc/scsi/[drivername]
/proc/self,目录,链接到了当前进程所在的目录。
/proc/slabinfo,文件,内核缓存信息,需要配置CONFIG_SLAB。
/proc/stat,文件,系统信息统计。
/proc/swaps,文件,使用的交换空间。
/proc/sysrq-trigger,文件,可写,触发系统调用。
/proc/sysvipc,目录,包括msg、sem、shm三个文件,为System V IPC对象。
/proc/thread-self,文件,链接到了当前进程下的task目录中的线程文件。
/proc/timer_list,文件,还在运行着的定时器列表。
/proc/timer_stats,文件,定时器状态。
/proc/tty,目录,tty设备相关。
/proc/uptime,文件,系统更新时间和进程空闲时间。
/proc/version,文件,内核版本信息。
/proc/vmstat,文件,内存统计信息,以键值对形式显示。
/proc/zoneinfo,文件,内存区块信息,用于分析虚拟内存的行为。

/proc/net/tcp和/proc/net/tcp6接口展示了tcp的连接信息。首先是listening TCP sockets,接着是established TCP sockets,其中每个字段的解释如下(由于长度原因,分为3个部分):

Part1:

   46: 010310AC:9C4C 030310AC:1770 01 
   |      |      |      |      |   |--> connection state(套接字状态)
   |      |      |      |      |------> remote TCP port number(远端端口,主机字节序)
   |      |      |      |-------------> remote IPv4 address(远端IP,网络字节序)
   |      |      |--------------------> local TCP port number(本地端口,主机字节序)
   |      |---------------------------> local IPv4 address(本地IP,网络字节序)
   |----------------------------------> number of entry


connection state(套接字状态),不同的数值代表不同的状态。

Part2:

   00000150:00000000 01:00000019 00000000  
      |        |     |     |       |--> number of unrecovered RTO timeouts(超时重传次数)
      |        |     |     |----------> number of jiffies until timer expires(超时时间,单位是jiffies)
      |        |     |----------------> timer_active (定时器类型,see below)
      |        |----------------------> receive-queue(根据状态不同有不同表示,see below)
      |-------------------------------> transmit-queue(发送队列中数据长度)


receive-queue,当状态是ESTABLISHED,表示接收队列中数据长度;状态是LISTEN,表示已经完成连接队列的长度。

timer_active:
0  no timer is pending  //没有启动定时器
1  retransmit-timer is pending  //重传定时器
2  another timer (e.g. delayed ack or keepalive) is pending  //连接定时器、FIN_WAIT_2定时器或TCP保活定时器
3  this is a socket in TIME_WAIT state. Not all fields will contain data (or even exist)  //TIME_WAIT定时器
4  zero window probe timer is pending  //持续定时器

Part3:

   1000        0 54165785 4 cd1e6040 25 4 27 3 -1
    |          |    |     |    |     |  | |  | |--> slow start size threshold, 
	                                                or -1 if the threshold is >=0xFFFF 
    |          |    |     |    |     |  | |  |     (如果慢启动阈值大于等于0xFFFF则显示-1,否则表示慢启动阈值)
    |          |    |     |    |     |  | |  |      
    |          |    |     |    |     |  | |  |----> sending congestion window(当前拥塞窗口大小)
    |          |    |     |    |     |  | |-------> (ack.quick<<1)|ack.pingpong
	                                               (快速确认数和是否启用的标志位的或运算结果)    
    |          |    |     |    |     |  |---------> Predicted tick of soft clock (delayed ACK control data)
	                                               (用来计算延时确认的估值)
    |          |    |     |    |     |             
    |          |    |     |    |     |------------> retransmit timeout()(RTO,单位是clock_t)
    |          |    |     |    |------------------> location of socket in memory(socket实例的地址)
    |          |    |     |-----------------------> socket reference count(socket结构体的引用数)
    |          |    |-----------------------------> inode(套接字对应的inode)
    |          |----------------------------------> unanswered 0-window probes(see below)
    |---------------------------------------------> uid(用户id)


unanswered 0-window probes:持续定时器或保活定时器周期性发送出去但未被确认的TCP段数目,在收到ACK之后清零。



参考来源:

Linux Howtos proc(5)

Linux ManPage proc(5)

Linux Filesystem Hierarchy(/proc)


该文章最后由 阿炯 于 2022-12-16 21:15:29 更新,目前是第 3 版。