思路:

  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. 【leetcode】258. 各位相加

    [leetcode]258. 各位相加 C++解法: class Solution { public: int addDigits(int num) { string s;//用来将num转换成字符串 ...

  2. Azure Devops上模版化K8s部署

    在2022年我们终于完成了主要业务系统上K8s的计划,在这里总结下我们上K8s时候的模版工程. 前提条件 本文不讨论K8s是什么,什么是容器化,为什么需要容器化,什么是微服务等这些基础内容,这些到处说 ...

  3. 2022-12-05:部门工资前三高的所有员工。编写一个SQL查询找出每个部门中收入前三高的员工 。 +------------+----------+--------+ | Department |

    2022-12-05:部门工资前三高的所有员工.编写一个SQL查询找出每个部门中收入前三高的员工 . ±-----------±---------±-------+ | Department | Em ...

  4. 2020-09-23:TCP头部信息有哪些?

    福哥答案2020-09-23:#福大大架构师每日一题# 福哥口诀法:T源目序缺首保 紧确推和复同终 窗校紧选数(TCP格式:源端口,目的端口,序号,确认号,首部长度,保留,紧急位URG,确认位ACK, ...

  5. LOTO示波器如何测试阻抗的频响曲线

    LOTO示波器如何测试阻抗的频响曲线 模块的输入输出端口,在电路分析上,一般简单表征为电阻来进行计算和分析.但多数情况下,这些端口并不是纯电阻的特性,更精确一些,它可能是电阻电容以及电感的组合,表现为 ...

  6. 洛谷 - P1030 求先序

    Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8). Input 共两行,均为大写字母组成的字符串,表示一棵二叉 ...

  7. nas盒子内网穿透

    2023年5月27日星期六 -------------------------------------------------------------------------------------- ...

  8. 驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<驱动开发:内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntim ...

  9. 驱动开发:内核PE结构VA与FOA转换

    本章将继续探索内核中解析PE文件的相关内容,PE文件中FOA与VA,RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址,RVA是内存基址与当前地址的相对偏移,本章还 ...

  10. Vue3从入门到精通(二)

    vue3 侦听器 在Vue3中,侦听器的使用方式与Vue2相同,可以使用watch选项或$watch方法来创建侦听器.不同之处在于,Vue3中取消了immediate选项,同时提供了新的选项和API. ...