思路:

  1. cat proc文件系统下的 sys/net 目录下所有文件,根据结果降序排序(如果打印前xx,可能会漏掉关键信息,在定位问题时需要注意,慎用过滤),根据结果使用 grep -rn xxx 找到配置文件
  2. 查看配置文件含义,资料网站:https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
  3. 对结论进行测试

步骤一,进入 /proc/sys/net 目录,执行命令: find . -type f | xargs cat {} ; | sort -nr | head -20 ; 根据结果寻找配置文件

# 测试机器
[root@api net]# find . -type f | xargs cat {} \; | sort -nr | less
cat: {}: No such file or directory
cat: ;: No such file or directory
cat: ./ipv4/route/flush: Permission denied
cat: ./ipv6/conf/all/stable_secret: Input/output error
cat: ./ipv6/conf/default/stable_secret: Input/output error
cat: ./ipv6/conf/enp4s0/stable_secret: Input/output error
cat: ./ipv6/conf/lo/stable_secret: Input/output error
cat: ./ipv6/route/flush: Permission denied
2147483647
4194304
4194304
3145728
3145728
...
4096 87380 6291456
4096 16384 4194304
... [root@api net]# grep -rn 6291456
grep: ipv4/route/flush: Permission denied
ipv4/tcp_rmem:1:4096 87380 6291456

步骤二:确认配置含义

# 网页搜索 tcp_rmem,得到两处结果
# 根据解释,linux 系统默认就是接收缓冲区自动调整,不大于tcp_rmem tcp_moderate_rcvbuf - BOOLEAN
If set, TCP performs receive buffer auto-tuning, attempting to automatically size the buffer (no greater than tcp_rmem[2]) to match the size required by the path for full throughput. Enabled by default.
# 如果设置,TCP将执行接收缓冲区自动调整,尝试自动调整缓冲区大小(不大于tcp_rmem[2]),以匹配路径所需的大小以实现全吞吐量。默认情况下启用。 tcp_rmem - vector of 3 INTEGERs: min, default, max
min: Minimal size of receive buffer used by TCP sockets. It is guaranteed to each TCP socket, even under moderate memory pressure. Default: 4K default: initial size of receive buffer used by TCP sockets. This value overrides net.core.rmem_default used by other protocols. Default: 131072 bytes. This value results in initial window of 65535. max: maximal size of receive buffer allowed for automatically selected receiver buffers for TCP socket. This value does not override net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables automatic tuning of that socket’s receive buffer size, in which case this value is ignored. Default: between 131072 and 6MB, depending on RAM size.
# TCP套接字自动选择的接收器缓冲区允许的最大接收缓冲区大小。该值不会覆盖net.core.rmem_max。使用SO_RCVBUF调用setsockopt()将禁用该套接字接收缓冲区大小的自动调整,在这种情况下,该值将被忽略。默认值:介于131072和6MB之间,具体取决于RAM大小。

步骤三:验证

使用client 和 server 端代码

[root@api ~]# cat client.py
# coding: utf-8
import socket print ('我是客户端!') HOST = 'localhost' # 服务器的ip
PORT = 60008 # 需要连接的服务器的端口
BUFSIZ = 10240000
ADDR = (HOST,PORT) c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(ADDR) while 1:
data=input("请输入:\n >>>")
if not data:
break
c.sendall(data.encode()) # 发送‘Hello,world’给服务器
# data = c.recv(BUFSIZ).decode()
# if not data:
# break
# print ('接收到', repr(data)) # 打印从服务器接收回来的数据
c.close() [root@api ~]# cat server.py
# coding: utf-8
# 服务器端代码
from socket import *
import time print ('我是服务端!') HOST = ''
PORT = 60008
BUFSIZ = 10240000
ADDR = (HOST,PORT) # 创建端口,规定缓冲区大小 s = socket(AF_INET, SOCK_STREAM) # 创建TCP socket对象
s.bind(ADDR) # 绑定地址
s.listen(4) # 监听TCP,4代表:操作系统可以挂起(未处理请求时等待状态)的最大连接数量。该值至少为1 while 1:
print("等待连接...")
client, addr = s.accept() # 开始被动接受TCP客户端的连接。
print ('连接的地址', addr) while 1:
time.sleep(10)
# while 1:
# data = client.recv(BUFSIZ).decode() # 接受TCP数据 decode是由于此处接受bytes而不是 str类型
# print("接收到数据:",data)
# if not data: break # client.send(data.encode()) # 把从客户端接收来的数据完整的,发送给客户端
# client.close()
s.close()

通过手动修改服务端的相关配置,得到如下结果:

测试的结果,net.core.rmem_max = 1024 net.ipv4.tcp_rmem = 2000 4000 6000 最大的写队列是2936

测试的结果,net.core.rmem_max = 1024 net.ipv4.tcp_rmem = 1000 4000 6000 最大的写队列是2936

测试的结果,net.core.rmem_max = 1024 net.ipv4.tcp_rmem = 1000 4000 8000 最大的写队列是4136

测试的结果,net.core.rmem_max = 1024 net.ipv4.tcp_rmem = 1000 6000 8000 最大的写队列是4136

结论:linux 系统的TCP连接的接收缓冲区大小会自动调整,不大于tcp_rmem。(具体调整的算法未知)

netstat 某连接的 Recv-Q(接收队列)达到500多万字节的内核参数排查的更多相关文章

  1. TCP长连接管道通信改消息队列涉及到的知识点

    1.队列,链表,STL 1.C++ STL标准库简介 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出"可重复运用的东西" 的方法,从函数(functions) ...

  2. TCP/IP源码(59)——TCP中的三个接收队列

    http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列  作者:gfree.wind@gmai ...

  3. phoenixframe平台连接socketserver,并接收返回值的演示样例

    package org.phoenix.cases.webservice; import java.util.LinkedList; import org.phoenix.action.WebElem ...

  4. 记录一次排查使用HttpWebRequest发送请求的发生“基础连接已关闭:接收时发生错误”异常问题的过程

    描述:某次更新程序,需要给测试员MM测试,之前都是正常的,更新后给MM测试就报异常System.Net.WebException 基础连接已经关闭:接收时发生错误 -------> System ...

  5. netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c      16 CLOSING     130 ESTABLISHED     298 FIN_WA ...

  6. 修改Linux内核参数,减少TCP连接中的TIME-WAIT

    一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Linux系统下的负载能力,当网站发展起来之后,web连接数过多的问题就会日益明显.在节省成本的情况下, ...

  7. linux 内核参数tcp_max_syn_backlog对应的队列最小长度

    环境:centos7.4 内核版本3.10 内核参数net.ipv4.tcp_max_syn_backlog定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过t ...

  8. 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能

    from:http://www.cnblogs.com/kkdd-2013/p/3868676.html 1 RRC协议功能 为NAS层提供连接管理,消息传递等服务: 对接入网的底层协议实体提供参数配 ...

  9. TCP的三个接收队列

    之前对于TCP接收过程中的三个队列的关系之前没搞清楚. 这几天,在同事邱的帮助下,终于把关系理清了,故特此做个笔记. 一.在软中断中加入数据包 tcp_v4_rcv()函数是tcp层收包的入口. in ...

  10. python通过连接池连接redis,操作redis队列

    在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...

随机推荐

  1. 明解STM32—GPIO应用设计篇之API函数及配置使用技巧

    一.前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理. 了解过STM32的GPIO相关 ...

  2. Python-webdriver_manager的简单使用

    前言: 提前祝大家五一快乐(*^▽^*) 我们在使用Selenium做UI自动化时都需要手动去下载各个浏览器版本的webdriver,有时我们可能还会遇到跨操作系统去进行测试. 以及有时因浏览器自动升 ...

  3. Prism Sample 6 Activation Deactivation

    例5中刚说到视图精确控制,这次说明这样的灵活控制是怎样做的,显示或不显示,或切换视图. 主页上显示了主按钮和一个ContentControl <DockPanel LastChildFill=& ...

  4. C# POST提交以及 解析 JSON 实例

    一.解析的JSON字符串如下 {"tinyurl":"http:\/\/dwz.cn\/v9BxE","status":0,"lo ...

  5. 2022-06-26:以下golang代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { type

    2022-06-26:以下golang代码输出什么?A:true:B:false:C:编译错误. package main import "fmt" func main() { t ...

  6. 2021-05-13:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,返回arr的最大子数组异或和。

    2021-05-13:数组中所有数都异或起来的结果,叫做异或和.给定一个数组arr,返回arr的最大子数组异或和. 前缀树.一个数,用二进制表示,0走左边分支,1走右边分支. 时间复杂度:O(N). ...

  7. 2021-07-07:股票问题4。给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成

    2021-07-07:股票问题4.给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你最多可以完成 ...

  8. django时区问题的解决

    django时区问题的解决  更新时间:2021年05月18日 09:37:58   作者:Silent丿丶黑羽     我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...

  9. 使用git 将本地代码上传码市私用仓库操作

    1  现在在登录码市建立项目 2   本地建立一个文件夹,然后使用git bash 3   初始化本地库  git init 4,进入刚刚在码云新建的项目里,复制框框里的路径 5,然后在回到本地新建的 ...

  10. .Net8罕见的技术:MSIL的机器码简析

    前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...