`

转:Linux内核参数详解

 
阅读更多

https://blog.csdn.net/yueguanghaidao/article/details/47144247

 

SYN_RECV

服务端收到sys,还未发出syn+ack 
1.net.ipv4.tcp_synack_retries 
默认值5,linux对应1+2+4+..32=2^6-1=63s

2.net.ipv4.tcp_syncookies 
应该设置为1,防止SYN Flood。 
处在SYN_RECV的TCP连接称为半连接,存储在SYN队列。大量SYN_RECV会导致队列溢出,后续请求将被内核直接丢弃,也就是SYN Flood攻击。 
开启syncookies后,当SYN队列满了后,TCP会通过原地址端口,目的地址端口和时间戳打造一个特别的Sequence Number(又叫cookie)发回去,如果是攻击者则不会有响应,如果是正常连接则把这个SYNCookie发回来,然后服务器端可以通过cookie建立连接(即使不在SYN队列)。 
别用tcp_syncookies来处理正常大负载连接,因为syncookies是妥协版的TCP协议,不严谨。对于正常的请求可调整三个TCP参数。 
1.tcp_max_syn_backlog 减少重试次数 
2.tcp_max_syn_backlog 增大syn连接数 
3.tcp_abort_on_overflow 处理不过来拒绝连接

CLOSE_WAIT

被动关闭的一方收到FIN后发送ACK处于CLOSE_WAIT状态。出现这种状态比较多时,一般都是没有及时close()导致的,默认将持续2小时。

TIME_WAIT

主动关闭一方,socket将在TIME_WAIT等待2msl时间。 
1.net.ipv4.tcp_fin_timeout 
默认值60,TCP保持在FIN_WAIT2状态的时间,超时后直接处于CLOSED,所以降低tcp_fin_timeout有助于减少TIME_WAIT数量。注意:虽然shutdown(SHUD_WR)也会处于FIN_WAIT2状态,但超时并不起作用。

2.net.ipv4.tcp_tw_recycle 
默认值0,打开快速TIME_WAIT socket回收。 
如果tcp_timestamps开启的话,会缓存每个连接的最新时间戳,如果后续请求时间戳小于缓存的时间戳,即视为无效,相应的包被丢弃。所以如果是nat或负载均衡环境下,就可能出现数据包丢弃的现象。

3.net.ipv4.tcp_tw_resue 
默认值0,是否重用TIME_WAIT状态的socket用于新的连接 
这个选项要比tcp_tw_recycle安全,从协议的角度看,复用是安全的。 
网上查找的复用条件:

1.tcp_timestamps选项必须打开(客户端也必须打开) 
2.重用TIME_WAIT的条件是收到最后一个包后超过1s

4.net.ipv4.tcp_timestamps 
默认值1,tcp增加时间戳,可避免序列号的环绕,更精确的RTT计算,为了更好的性能应该启用这个选项。

5.net.ipv4.tcp_max_tw_buckets 
默认值180000,TIME_WAIT的上限。

TCP优化

1.net.ipv4.tcp_moderate_rcvbuf 
默认值1,是否自动调节TCP接收缓冲区大小,当编程中设置了SO_SNDBUF,SO_RCVBUF将会使内核不对这些连接执行自动调节。 
2. net.ipv4.tcp_adv_win_scale 
默认值2,将拿出1/(2^tcp_adv_win_scale)缓存做应用读缓存,那么最大的接受滑动窗口只能到达读缓存的3/4。

3.net.ipv4.tcp_rmem 
4096 87380 6291456 
第一个是接受缓冲区最小字节 
第二个是接受缓冲区长度初始值,用来初始化sock的sk_rcvbuf,将取代rmem_default 
第三个是接受缓冲区长度最大值,用来调整sock的sk_rcvbuf

4.net.core.rmem_default 
适用所有协议的默认接受窗口大小(字节) 
接受窗口(rwnd)合理值取决于BDP(带宽和延迟的乘积),假设带宽100Mbps,延迟100ms 
BDP= (100Mbps/8) * (100/1000) = 1.25M 
由于有tcp_adv_win_scale额外开销,所以缓存的合理值为: 
BDP/(1-1/(2^tcp_adv_win_scale))

5.net.ipv4.tcp_window_scaling 
默认值1,是否启用windows scaling,若要支持超过64KB的窗口,必须启用。

6.net.ipv4.tcp_sack 
默认值1,是否开启sack(selective ack),报告收到的数据碎片,解决快速重传不知道后续数据是否重传的问题。

拥塞窗口

拥塞窗口(cwnd)是发送端一个内部参数,用来避免网络拥塞, 
通过慢启动快速增加cwnd,Linux2.6内核初始为3*MSS,为了提高传输效率,Linux3.0以后为10*MSS,可通过以下命令修

 

[root@10-9-22-239 ~]# ip route show
default via 10.9.0.1 dev eth0 
10.9.0.0/16 dev eth0  proto kernel  scope link  src 10.9.22.239 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1 
[root@10-9-22-239 ~]# ip route change default via 10.9.0.1 dev eth0 initcwnd 10
[root@10-9-22-239 ~]# ip route show
default via 10.9.0.1 dev eth0  initcwnd 10
10.9.0.0/16 dev eth0  proto kernel  scope link  src 10.9.22.239 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1

 

Out of socket memory

原因

1.有很多孤儿(orphan)socket 
2.tcp socket用尽了分配的内存 
tcp socket使用page计数,linux默认4096bytes

getconf PAGESIZE

 

1./proc/net/ipv4/tcp_mem 
365664 487552 731328 
当使用小于365664 page时,kernel不对其进行干预 
当使用超过487552 page时,kernel进入”memory pressure” 
当tcp使用超过731328时,会报:Out of socket memory

2./proc/net/sockstat

 

sockets: used 307
TCP: inuse 13 orphan 0 tw 0 alloc 34 mem 6
UDP: inuse 6 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

 

 

可通过对比tcp_mem查看当前socket内存状态。

孤儿(orphan)socket

1.FIN_WAIT1和LAST_ACK状态连接就是孤儿socket 
2.FIN_WAIT2加入tw状态统计,而不是orphan socket 
3.CLOSE_WAIT既不假如orphan统计也不加入tw统计

fs

1.fs.file-max 
系统所能打开的最大文件数 
fs.file-max代表系统级别能够打开的文件句柄,ulimit -n控制用户进程所能打开的数量 
设置多少比较合适,建议:内存/10k

grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'

 

2.fs.file-nr 只读文件 
1984 0 65535 
第一个代表了目前分配的文件句柄数,第三个代表了系统分配的最大文件句柄数(同file-max) 
file-nr一般会小于lsof | wc -l,但数量级是一致的。

vm

1.vm.dirty_background_ratio 
默认值10 
kdmflush守护进程负责同步所有与文件系统相关的页面至磁盘,当内存中的脏页面数量超过10%时kdmflush开始回写。

kswapd

kswapd守护进程负责确保内存保持可用空闲空间,它监控内核中pages_high和page_low标准,如果空闲内存空间小于pages_low,kswapd开始扫描并尝试每次回收32个页面,直到空闲内存大于pages_high。 
kswapd执行以下操作:

1.假如页面未改变,它将该页面放入free list 
2.假如页面改变且被文件系统回写,它将页面写入磁盘 
2.假如页面改变且未被文件系统回写,它将页面写入swap设备

buff:供read()和write()使用的物理内存缓冲大小 
cache:映射到进程地址空间的物理内存数

1.当大量的数据从磁盘读入内存(bi),cache值将不断增加 
2.vmstat中swapd值不断增大,说明kswapd正将脏页面写入交换空间(so) 
3.buff值不断减少,说明kswapd正不断回收内存

参考文章

  1. TCP的那些事(http://coolshell.cn/articles/11564.html)
  2. 通讯系统经验谈(http://maoyidao.iteye.com/blog/1744309)
  3. http://www.quora.com/Whats-orphaned-sockets-and-how-can-I-prevent-them
  4. http://blog.csdn.net/russell_tao/article/details/18711023
  5. http://www.speedguide.net/articles/linux-tweaking-121
  6. http://huoding.com/2013/11/21/299
分享到:
评论

相关推荐

    linux内核参数详解

    ### Linux内核参数详解 #### 一、引言 Linux作为一个功能强大且广泛使用的操作系统,其内核提供了丰富的参数配置选项来优化系统性能和资源管理。对于特定的应用场景,如安装Oracle数据库或运行大型PostgreSQL...

    linux内核代码详解

    《Linux内核代码详解》是深入理解Linux操作系统核心机制的重要参考资料。这个压缩包包含的文件名"Linux011_en内核"暗示了这可能是关于Linux内核的一个章节或者一个系列教程的一部分,英文版本,可能涉及到内核的特定...

    linux 内核参数调优

    Linux 内核参数调优详解 Linux 内核参数是 Linux 操作系统的核心组件之一,它控制着系统的行为和性能。通过调整 Linux 内核参数,可以提高系统的性能、安全性和稳定性。本文将详细讲解 Linux 内核参数的调整,包括...

    Linux 内核参数详解-KERNEL.docx

    ### Linux内核参数详解 #### 1. `kernel.wake_balance` **参数描述**: `kernel.wake_balance` 控制着内核如何决定唤醒哪些CPU上的任务。默认情况下,其值为1,这意味着当需要唤醒一个处于睡眠状态的任务时,内核...

    Linux内核完全注释V1.9.5版

    Linux内核是操作系统的核心部分,负责管理系统的硬件资源,提供基础服务给其他软件,并执行调度、内存管理、网络协议等核心任务。Linux内核完全注释V1.9.5版是一个详细的文档,旨在帮助开发者和系统管理员深入理解...

    Linux设备驱动开发详解-基于最新的Linux4.0内核》配套代码.zip

    总之,Linux设备驱动开发是嵌入式Linux开发的重要组成部分,通过深入研究《Linux设备驱动开发详解-基于最新的Linux4.0内核》这本书及其配套代码,你将能够熟练地驾驭Linux内核与硬件设备之间的通信,为你的嵌入式...

    《Linux设备驱动开发详解——基于最新的Linux4.0内核》源码.zip

    Linux内核通过驱动程序提供了对硬件的抽象,使得开发者可以使用标准的API和接口进行操作,而无需关心底层硬件的具体实现细节。 驱动程序的开发通常分为以下几个步骤: 1. **驱动程序的结构**:理解Linux驱动的基本...

    嵌入式Linux内核移植详解

    在移植过程中,关键步骤包括配置内核(通过menuconfig或make xconfig等工具)、裁剪不需要的模块、添加或修改硬件驱动、调整内核参数,以及编译和测试。配置内核时,要确保选中与目标硬件对应的选项,例如S3C2440的...

    inux设备驱动开发详解:基于最新的Linux4.0内核配套光盘

    《Linux设备驱动开发详解:基于最新的Linux4.0内核配套光盘》一书由宋保华编写,针对Linux4.0内核进行了深入浅出的解析与实践指导。本书结合了理论与实践,旨在帮助读者掌握Linux设备驱动程序的设计与开发技能。 ##...

    Linux_Kernel核心中文手册(内核图解).pdf,linux内核结构详解,C,C++源码.zip

    《Linux_Kernel核心中文手册(内核图解).pdf》和《linux内核结构详解》是深入理解Linux内核的重要参考资料。这份资料涵盖了从基本概念到高级主题的广泛知识,包括进程管理、内存管理、文件系统、设备驱动等多个关键...

    Linux 内核网络参数配置资料

    ### Linux内核网络参数配置详解 #### 一、概述 在深入探讨Linux内核网络参数配置之前,我们先来了解一下这些参数的基本作用及其对系统的影响。Linux作为一种强大的开源操作系统,其内核提供了丰富的网络参数配置...

    Linux内核源码剖析:TCP IP实现(上册).pdf

    根据提供的文件标题、描述、标签以及部分内容,我们可以推断出这份文档主要关注的是Linux内核中的TCP/IP协议栈实现分析。接下来将详细阐述这一主题下的关键知识点。 ### 一、Linux内核源码剖析概述 #### 1. Linux...

    linux内核软中断_linux内核源码详解.docx

    "Linux内核软中断详解" Linux内核软中断是指在Linux内核中用于处理中断的机制。软中断是异步中断的一种,通常是由硬件设备随机产生的中断信号。软中断的处理程序是串行执行的,在处理中断前,通常需要禁用该中断,...

    linux内核驱动详解1

    | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `--...

    linux 内核启动地址,解压缩,内核参数问题探讨.pdf

    ### Linux内核启动地址、解压缩与内核参数问题探讨 #### 一、Linux内核启动地址确定 在深入理解Linux内核启动地址之前,我们首先需要了解内核是如何被加载到内存中的,并且如何确定其加载地址。Linux内核启动地址...

    Linux内核编程详解

    7. **启动参数** - Linux内核支持通过启动参数进行配置,这些参数可以在启动时通过命令行传递,或者在GRUB等引导加载器中设置。这些参数可以用来调整内核的行为,如内存管理策略、设备初始化等。 在进行Linux内核...

    03-DM365 Linux内核简介

    通过不断优化和调整内核参数,开发者可以充分利用DM365的性能,实现高效、稳定的嵌入式系统。在实际项目中,可能还需要对DM365的Linux内核进行裁剪和定制,以满足特定应用的需求。 【标签】: DM365 由于提供的...

    Linux内核设计与实现.pdf

    《Linux内核设计与实现》是一本深入探讨Linux操作系统内核的重要著作,它详细阐述了Linux内核的设计原理和实现机制。这本书对于理解操作系统的核心概念、掌握Linux内核的工作方式以及进行系统级编程具有极高的价值。...

    Linux 下安装oacle 内核参数详解

    以下是对Linux内核参数的详细解释,特别是针对Oracle数据库安装的配置: 1. **kernel.shmmax**: 此参数定义了共享内存段的最大尺寸,单位为字节。在Oracle中,它应该大于SAG(System Global Area)的最大初始化参数...

Global site tag (gtag.js) - Google Analytics