Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s";tcp积压工作“;在redis.conf中_Tcp_Redis_Backlog - Fatal编程技术网

什么';s";tcp积压工作“;在redis.conf中

什么';s";tcp积压工作“;在redis.conf中,tcp,redis,backlog,Tcp,Redis,Backlog,我被redis.conf中的tcp backlog弄糊涂了: # TCP listen() backlog. # # In high requests-per-second environments you need an high backlog in order # to avoid slow clients connections issues. Note that the Linux kernel # will silently truncate it to the value of /

我被redis.conf中的
tcp backlog
弄糊涂了:

# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511
tcp backlog
是“完整连接队列”(三方握手完成,如所述)还是“不完整连接队列”的大小


如果它的意思是“完整连接队列”,那么我为什么要提出限制不完整连接队列大小的
tcp\u max\u syn\u backlog

tcp backlog是接受队列或完整连接队列的大小

正如你提到的文件所说:

在Linux上,情况有所不同,如listen系统调用的手册页所述:

TCP套接字上backlog参数的行为随Linux 2.2而改变。现在,它指定等待接受的完全建立的套接字的队列长度,而不是不完整连接请求的数量。可以使用/proc/sys/net/ipv4/tcp\u max\u syn\u backlog设置不完整套接字的最大队列长度

这意味着当前的Linux版本将第二个选项与两个不同的队列一起使用:由系统范围设置指定大小的SYN队列和由应用程序指定大小的接受队列。

Redis server使用tcp backlog的配置,通过listen()指定接受队列的大小。SYN队列大小由linux的管理员决定

如果它意味着“完整连接队列”,那么我为什么要提出tcp\u max\u syn\u backlog来限制不完整连接队列的大小?

提高tcp_max_syn_backlog的目的是避免客户端连接缓慢的问题。如果有一些速度较慢的客户机正在与redis server进行三方握手,并且这些客户机读取响应和发送请求的速度较慢,那么它们将占用redis server的SYN队列很长一段时间,因为它们速度较慢

在某些情况下,由于这些低效的客户端,SYN队列将被填满。如果SYN队列已满,redis服务器将无法接受新客户端。因此,您应该提高tcp_max_syn_backlog来处理这个问题

tcp backlog的大小是“完整连接队列”(三方握手完成,此处描述)还是“不完整连接队列”

tcp backlog
是完整连接队列的大小。事实上,Redis将此配置作为
listen(ints,intbacklog)
调用的第二个参数传递

@广胜作对这个问题已经有了很好的答案。所以我会关注另一个

如果它意味着“完整连接队列”,那么我为什么要提出tcp_max_syn_backlog来限制不完整连接队列的大小

引用您提到的文档:

该实现使用两个队列,一个SYN队列(或不完全连接队列)和一个接受队列(或完全连接队列)。状态为SYN RECEIVED的连接被添加到SYN队列,并在其状态更改为已建立时(即,当接收到三向握手中的ACK数据包时)移动到接受队列。顾名思义,然后实现accept调用只是为了使用accept队列中的连接。在这种情况下,listen系统调用的backlog参数确定接受队列的大小

我们可以看到,
完整连接队列中的项从
不完整连接队列中移动

如果您有一个大的
somaxconn
和一个小的
tcp\u max\u syn\u积压
,那么您可能没有足够的项目移动到
完整连接队列
,并且
完整连接队列
可能永远不会满。许多请求在有机会移动到第二个队列之前可能已经从第一个队列中删除


因此,仅提高
somaxconn
的值可能不起作用。你必须同时提出这两个问题。

昨天,我读了《Redis in Action》第六章,约书亚·卡尔顿 写道“Redis发布和订阅的缺点之一 模型是客户端必须始终连接才能接收数据 消息、断开连接可能导致客户端丢失消息,以及 旧版本的Redis可能无法使用、崩溃或在以下情况下被杀死: 用户速度慢。”

然后,约书亚·卡尔顿说,“尽管推送消息可能很有用,但当客户端由于某种原因无法始终保持连接时,我们会遇到问题。为了解决这个限制,我们将编写两种不同的pull消息传递方法,它们可以替代发布/订阅。我们将首先从单一收件人消息开始,因为它与我们的先进先出队列有很多共同之处。在本节后面,我们将讨论一种方法,在该方法中,可以有多个邮件收件人。对于多个收件人,我们可以在需要将邮件发送给所有收件人时替换Redis PUBLISH and SUBSCRIBE,即使这些收件人已断开连接。” 我们有兴趣知道,用Joshua Carlton的第6.5.2节“多收件人发布/订阅替换”取代Redis PUBLISH and SUBSCRIBE,而不是利用UDP协议检测和修复断开连接丢失,是否会更有效

 Could we set a high tcp_max_syn_backlog in redis.conf to prevent either of

Joshua Carlson的单收件人消息传递和多收件人消息传递方法在每秒20000条消息(每条消息为20字节)的负载下断开连接?

问得好。这是一个完整的连接队列。SYN积压是独立的。我看不出他们需要跟踪的原因。@GuangshengZuo,什么tcp_max_SYN_bredis.conf中的acklog to将阻止Joshua Carlson的单个收件人消息传递和多个收件人消息传递方法在每秒20000条消息的负载下断开连接,其中每条消息为20字节?谢谢。