快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

proc文件系统中网络参数详解(1)

  permalink

  什么是proc文件系统

  proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。它的目录结构如下:

  目录名称 目录内容

  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 系统正常运行时间

  用户如果要查看系统信息,可以用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中,使它在系统启动时自动完成修改。

  -----------------------------------------------------------------------------------------------

  /proc文件系统中网络参数

  在/proc/sys/net/ipv4/目录下,包含的是和tcp/ip协议相关的各种参数,下面我们就对这些网络参数加以详细的说明。

  参数名 参数类型

  参数值(如无特别标注,内存类的单位为byte,关于时间的单位为秒)

  官方详细说明(skylove对该参数的个人心得或补充说明)

  ip_forward :BOOLEAN

  0 - 关闭(默认值)

  非0值 - 打开ip转发

  在网络本地接口之间转发数据报。该参数非常特殊,对该参数的修改将导致其它所有相关配置参数恢复其默认值(对于主机参阅RFC1122,对于路由器参见 RFC1812)(在其他一些操作系统中,这个参数不是boolean型,而是INTEGER型,设置为0为不转发,1为根据接口情形决定是否转发,2是始终转发)

  ip_default_ttl :INTEGER

  默认值为 64

  表示IP数据报的Time To Live值(在网络传递中,每经过一"跳",该值减少1,当ttl为0的时候,丢弃该包.该值越大,即在网络上可以经过的路由器设备的数量越多,但一个错误的包,也会越发浪费生存周期.根据目前的实际情形而看,设置为32已经足够普通网络访问Internet的需求了)

  ip_no_pmtu_disc :BOOLEAN

  默认值为FALSE(0)

  关闭路径MTU探测(典型的瓶颈原理,一次成功的传输中,mtu是由网络上最"窄"的位置决定的.如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。

  几种常见网络的MTU值:

  超通道         65535

  16Mb/ s令牌网(IBM)   17914

  4Mb/ s令牌网(IEEE 802.5) 4464

  FDDI          4352

  以太网         1500

  IEEE 802.3/802.2     1492

  X.25          576

  点对点(低延时)     296

  ipfrag_high_thresh :INTEGER

  默认值为262144

  用来组装分段的IP包的最大内存量。两个文件分别表示用于重组IP分段的内存分配最低值和最高值,一旦达到最高内存分配值,其它分段将被丢弃,直到达到最低内存(ipfrag_low_thresh 见下文)分配值。(根据我个人理解,就是达到最高后,就"关门打狗",直到处理到最低值的时候才又开门放分段的ip包进来处理.如果最高/最低差距过小, 很可能很快又达到限制又开始丢弃包;而设置过大,又会造成某段时间丢包时间持续过久.因此需要适当地考虑,默认值中给出的最低/最高比率值为3/4.此外补充说明, kernel中,对内存的使用单位,都是以byte为单位的.当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。我在1G内存的NAT机器上,分别设置最低为262144,最高为393216)

  ipfrag_low_thresh :INTEGER

  默认值为196608

  参见ipfrag_high_thresh。

  ipfrag_time :INTEGER

  默认值为30

  保存一个IP分片在内存中的时间。

  inet_peer_threshold :INTEGER

  默认值为65664

  INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多﹐存活期越低﹐GC 间隔越短(GC=Grabage Collection 废物收集?默认值65664=65536 + 128 是怎么得来的呢?看include/net/inetpeer.h struct inet_peer的内容,是为了IP ROUTE更快,缓冲对方IP的信息,一个对方IP一个记录.该值与

  inet_peer_gc_maxtime

  inet_peer_gc_mintime

  inet_peer_maxttl

  inet_peer_minttl

  inet_peer_threshold

  参数都是用来控制这个cache的大小的。似乎这个cache消耗比较大,在CU上有朋友提到过在一个26M的嵌入式Linux中,这个cache就用到了1M多内存)

  inet_peer_minttl :INTEGER

  默认值为120

  条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。(每次整理的时候,会考虑小于inet_peer_minttl 的ip条目一定保存,而大于inet_peer_maxttl时间设置的ip条目会被释放)

  inet_peer_maxttl :INTEGER

  默认值为600

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

  inet_peer_gc_mintime :INTEGER

  默认值为10

  废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值以 jiffies为单位测量。(如果长期不整理,会cache很多条目,而整理的时间太频繁,又会给系统造成压力,这个值就是确定最小整理周期间隔的)

  inet_peer_gc_maxtime :INTEGER

  默认值为120

  废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。 该值以 jiffies为单位测量。Jiffie: 内核使用的内部时间单位,在i386系统上大小为1/100s,在Alpha中为1/1024S。在/usr/include/asm/param.h中的HZ定义有特定系统的值。

  ====================TCP 参数================

  tcp_syn_retries :INTEGER

  默认值是5

  对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

  tcp_synack_retries :INTEGER

  默认值是5

  对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的 tcp_syn_retries 来决定这个值)

  tcp_keepalive_time :INTEGER

  默认值是7200(2小时)

  当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu 的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击? tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)

  tcp_keepalive_probes:INTEGER

  默认值是9

  TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

  tcp_keepalive_intvl:INTEGER

  默认值为75

  探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)

  tcp_retries1 :INTEGER

  默认值是3

  放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn连接)

  tcp_retries2 :INTEGER

  默认值为15

  在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

  tcp_orphan_retries :INTEGER

  默认值是7

  在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显着的,我本人的网络环境中降低该值为3)

  tcp_fin_timeout :INTEGER

  默认值是 60

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

  tcp_max_tw_buckets :INTEGER

  默认值是180000

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

  tcp_tw_recycle :BOOLEAN

  默认值是0

  打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候,建议打开它)

  tcp_tw_reuse:BOOLEAN

  默认值是0

  该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论