Linux TCP参数——tcp_adv_win_scale

2024-03-19 05:20
文章标签 参数 linux tcp win scale adv

本文主要是介绍Linux TCP参数——tcp_adv_win_scale,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

tcp_adv_win_scale

adv-advise;win-window;
用于指示TCP中接收缓存比例的值。

static inline int tcp_win_from_space(int space)
{return sysctl_tcp_adv_win_scale<=0 ?(space>>(-sysctl_tcp_adv_win_scale)) :space - (space>>sysctl_tcp_adv_win_scale);
}

在这里插入图片描述

ip-sysctl.txt解释

tcp_adv_win_scale - INTEGERCount buffering overhead as bytes/2^tcp_adv_win_scale(if tcp_adv_win_scale > 0) or bytes-bytes/2^(-tcp_adv_win_scale),if it is <= 0.Possible values are [-31, 31], inclusive.Default: 1

指定计算缓冲 Overhead 的方式:
如果 tcp_adv_win_scale > 0 则为 bytes/2^tcp_adv_win_scale 否则为bytes - bytes/2^(-tcp_adv_win_scale)。

默认值:1(低版本默认值是 2)
可选值:[-31, 31]

buffering overhead

buffering overhead即缓冲开销,即除去数据部分的其他开销,包括头字段开销以及内核结构体(例:sk_buffer)设置部分的上下文参数的开销。
也就是接收缓存区其实是由数据信息和辅助信息组成!!!
所以“Count buffering overhead as”说明这是计算辅助信息(即非数据信息)的所占空间大小,而该参数就是比例因子。

内核缓存和应用缓存

tcp手册描述,“application” buffer,以及延伸出内核缓存概念(形容可能不是那么恰当准确,所以不用太过于陷入这个命名之中,否则会不利于你的理解)

The socket receive buffer space is shared between the
application and kernel.  TCP maintains part of the buffer
as the TCP window, this is the size of the receive window
advertised to the other end.  The rest of the space is
used as the "application" buffer, used to isolate the
network from scheduling and application latencies.  The
tcp_adv_win_scale default value of 2 implies that the
space used for the application buffer is one fourth that
of the total.

注:应用部分的作用是“used to isolate the network from scheduling and application latencies”,具体指的应该是内核的 skb_shared_info 结构,对 TCP 本身没什么用,但对其它模块有用。

所以需要理解的其实就是:

  1. 内核缓存,表示的就是TCP载荷(数据),也就是TCP滑动窗口机制中的通告窗口大小
  2. 应用缓存,表示的就是内核中的辅助标识数据的元数据信息
    帮助理解
    REF:关于Linux TCP接收缓存以及接收窗口的一个细节解析

示例计算

tcp_adv_win_scale > 0bytes/2^tcp_adv_win_scale
tcp_adv_win_scale <= 0bytes - bytes/2^(-tcp_adv_win_scale)1:1/2 即非数据使用1/2区域,数据使用1/2区域
2:1/4 即非数据使用1/4区域,数据使用3/4区域

你会发现:在Linux内核版本优化中为什么该值会从2到1呢?(我的第一反应是增大非数据区的比例不是会减少载荷导致效率反而下降吗?)

深入理解从2到1(tcp_adv_win_scale的值)

比较Linux 2.6.32和Linux 3.10版本的sk_buffer

之所以要比较sk_buffer,是因为struct sk_buffer是网络协议栈中整个网络数据包存储的地方。(这个数据结构会被网络协议栈中的各层用来储存它们的协议头、用户数据和其他它们完成工作需要的数据)

# 以下命令可以查看到内核部分结构大小
sudo cat /proc/slabinfo
sudo cat slabtop

对比结果是sk_buff变打了,因为功能扩展,除了skb的膨胀之外,系统中还有别的膨胀,比如为了效率的“对齐开销”,但更大的开销增加是skb_shared_info结构体的计入。

虽然这种开销的膨胀在TCP层面几乎看不到什么收益(反而付出了代价,你不得不配置更大的rcvbuf…),然而skb等并不单单服务于TCP,这种膨胀的收益可能被调度,中断,IP路由,负载均衡等机制获取了。所以这种变化对于整个系统来说,是好的变化,好的发展。
记住两点即可:首先,Linux内核各个子系统是一个整体,其次,内存越来越便宜而时间一去不复返,空间换时间,划得来!

总结

tcp_adv_win_scale计算出非载荷的占比,也被称之为application” buffer的占比。

这篇关于Linux TCP参数——tcp_adv_win_scale的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824928

相关文章

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa