netstat 某连接的 Recv-Q(接收队列)达到500多万字节的内核参数排查
思路:
- cat proc文件系统下的 sys/net 目录下所有文件,根据结果降序排序(如果打印前xx,可能会漏掉关键信息,在定位问题时需要注意,慎用过滤),根据结果使用 grep -rn xxx 找到配置文件
- 查看配置文件含义,资料网站:https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
- 对结论进行测试
步骤一,进入 /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多万字节的内核参数排查的更多相关文章
- TCP长连接管道通信改消息队列涉及到的知识点
1.队列,链表,STL 1.C++ STL标准库简介 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出"可重复运用的东西" 的方法,从函数(functions) ...
- TCP/IP源码(59)——TCP中的三个接收队列
http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列 作者:gfree.wind@gmai ...
- phoenixframe平台连接socketserver,并接收返回值的演示样例
package org.phoenix.cases.webservice; import java.util.LinkedList; import org.phoenix.action.WebElem ...
- 记录一次排查使用HttpWebRequest发送请求的发生“基础连接已关闭:接收时发生错误”异常问题的过程
描述:某次更新程序,需要给测试员MM测试,之前都是正常的,更新后给MM测试就报异常System.Net.WebException 基础连接已经关闭:接收时发生错误 -------> System ...
- netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)
# netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSING 130 ESTABLISHED 298 FIN_WA ...
- 修改Linux内核参数,减少TCP连接中的TIME-WAIT
一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Linux系统下的负载能力,当网站发展起来之后,web连接数过多的问题就会日益明显.在节省成本的情况下, ...
- linux 内核参数tcp_max_syn_backlog对应的队列最小长度
环境:centos7.4 内核版本3.10 内核参数net.ipv4.tcp_max_syn_backlog定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过t ...
- 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能
from:http://www.cnblogs.com/kkdd-2013/p/3868676.html 1 RRC协议功能 为NAS层提供连接管理,消息传递等服务: 对接入网的底层协议实体提供参数配 ...
- TCP的三个接收队列
之前对于TCP接收过程中的三个队列的关系之前没搞清楚. 这几天,在同事邱的帮助下,终于把关系理清了,故特此做个笔记. 一.在软中断中加入数据包 tcp_v4_rcv()函数是tcp层收包的入口. in ...
- python通过连接池连接redis,操作redis队列
在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...
随机推荐
- c# 异步进阶———— 自定义 taskschedule[三]
前言 我们知道我们的task async 和 await 是基于线程池进行调度的. 但是async 和 await 也就是使用了默认的task调度,让其在线程池中运行. 但是线程池是榨干机器性能为本质 ...
- Django 静态文件 request对象方法 pycharm和Django连接MySQL Django模型层初步了解 基本的ORM操作
目录 静态文件 一.概念 静态文件:不经常变化的文件,主要针对html文件所使用到的各种资源. 例如:css文件.js文件.img文件.第三方框架文件 ps: Django针对静态文件资源需要单独在根 ...
- Amazon S3 对象存储Java API操作记录(Minio与S3 SDK两种实现)
缘起 今年(2023年) 2月的时候做了个适配Amazon S3对象存储接口的需求,由于4月份自学考试临近,一直在备考就拖着没总结记录下,开发联调过程中也出现过一些奇葩的问题,最近人刚从考试缓过来顺手 ...
- 自定义alert、confirm、prompt的vue组件
Prompt.vue组件 说明: 通过props定制定制的Prompt,可选值 mode 默认值:prompt, 其他模式:confirm.message(简单的提示,可设置提示显示时间,类似aler ...
- pytest插件开发
插件的加载方式 外部插件: pip install 安装的插件 本地插件: pytest 自动模块发现机制(conftest.py存放) 内置插件: 代码内部的_pytest目录加载 什么是hook ...
- 2022-11-19:第二高的薪水。表结构和数据的sql语句如下,输出200,因为200是第二大的。请问sql语句如何写? DROP TABLE IF EXISTS `employee`; CREAT
2022-11-19:第二高的薪水.表结构和数据的sql语句如下,输出200,因为200是第二大的.请问sql语句如何写? DROP TABLE IF EXISTS `employee`; CREAT ...
- 2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754。
2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754.给定一个整数num,判断它是不是某个数的step sum? 福大大 答案2021 ...
- Grafana系列-统一展示-9-Jaeger数据源
系列文章 Grafana 系列文章 配置 Jaeger data source Grafana内置了对Jaeger的支持,它提供了开源的端到端分布式跟踪.本文解释了针对Jaeger数据源的配置和查询. ...
- Nacos必知必会:这些知识点你一定要掌握!
前言 Nacos 是一个开源的服务发现.配置管理和服务治理平台,是阿里巴巴开源的一款产品. Nacos 可以帮助开发者更好地管理微服务架构中的服务注册.配置和发现等问题,提高系统的可靠性和可维护性. ...
- drf——序列化之source(了解)、定制字段的两种方式(重要)、多表关联反序列化保存、反序列化字段校验、ModelSerializer使用
1 序列化高级用法之source(了解) # 1.创建了5个表(图书管理的5个) # 2.对book进行序列化 # 总结:source的用法 1.修改前端看到的字段key值--->source指 ...