设置Linux套接字-高优先级的效果是什么?

sc4hvdpw  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(143)

从Linux套接字manpage
SO_优先级
为要在此套接字上发送的所有数据包设置协议定义的优先级。Linux使用此值对网络队列进行排序:根据所选的设备优先级规则,优先级较高的数据包可能会首先处理。
这是使用以下公式设置的:

int optval=7 // valid values are in the range [1,7]  
             // 1- low priority, 7 - high priority  
setsockopt(socket, SOL_SOCKET, SO_PRIORITY, &optval, optlen)

字符串
比如说,这个过程有:
a.从socket_1-socket_10的10个低优先级套接字(优先级=4),
B. 1个高优先级套接字(优先级=7)-socket_11
在以下情况下会发生什么:

  1. send():进程在socket_1-socket_10socket_11上发送多个消息,socket_11上的IMO消息将优先于通过socket_1-socket_10发送的消息。
  2. recv():如果在上述所有套接字处接收到多个消息,那么socket_11在阅读消息时是否比socket_1-socket_10获得更高的优先级?
    1.有没有一种方法可以使用lsofnetstat等工具从命令行测量套接字优先级?
wdebmtf2

wdebmtf21#

每个Linux网络接口都有一个所谓的 qdisc(排队规则)。你的问题的答案取决于所使用的qdisc。一些排队规则,如pfifo and bfifo,没有优先级的概念。所以如果使用它们,答案很简单--没有优先级
然而,对于优先级qdisc,如pfifo_fast(通常是Linux上的默认qdisc),套接字优先级可能会产生影响。
下图描述了pfifo_fast qdisc中的情况:
x1c 0d1x的数据
我们可以看到,数据包根据其优先级被放入队列中。(实际上是 frame,但我们不讨论这个),它总是选择发送具有最高优先级的数据包。这意味着如果有多个数据包在等待,具有最高优先级的数据包将首先发送。请注意,这要求接口拥塞-*如果接口不拥塞并且数据包从操作系统到达后立即发送,则没有排队,因此没有优先级。
其他qdisc具有不同的结构和策略。例如,SFQ qdisc:


的数据
记住这一点,让我们回到您的问题:
1.如果使用了pfifo_fast,并且socket_11发送的流量足以使出站网络接口饱和,那么,则来自其他套接字的数据包可能根本不会被发送,实际上这是不可能的,因为在使其他资源饱和之前,除非是无线接口。
1.数据包从计算机的网络接口到套接字所采用的路径比网络本身要快得多。而且,正如您所记得的,要使优先级排序产生任何效果,必须存在拥塞。在典型的情况下,到达您的网络接口的数据包已经通过了它们在网络中传输的瓶颈,因此拥塞是不可能的。
当然,您可以使用ingress qdiscother mechanisms来人为地创建瓶颈,并对传入的流量进行优先级排序。这只有在构建流量整形器或类似的网络设备时才有意义。(甚至在桥接或路由之前),我怀疑套接字的优先级是否会对in产生任何影响。
1.我不知道,但我很乐意了解。This kernel module很接近,但它似乎不能显示优先级标志,只是常规的套接字选项。

vfh0ocws

vfh0ocws2#

回答您的问题:
1.默认情况下是,解释如下
1.没有优先级只在发送时工作,解释也在下面
1.我不这么认为,因为即使通过/proc接口也看不到此选项

详情1

关于优先级、网络队列和设备规则的一些话。所有这些东西都与服务质量有关,特别是与区分服务(DiffServ)有关。
当数据包被发送时,它会被放到接口“队列”中,由网络设备处理。默认情况下,队列不是真实的队列,而是三个真实的fifo,它们具有很强的优先级。如果fifo 0中的数据包比fifo 1中的数据包等待。套接字优先级通过以下MapMapMap到这个fifo:

  • 0(最大努力)是fifo 1
  • 1-3(填充物,散装,...)是fifo 2
  • 4是fifo 1
  • 5是fifo 2
  • 6-7(交互,控制)为fifo 0
  • 8-15是fifo 1

所以优先级1将在优先级0之后被调度。
为了改变默认的行为“流量控制”(tc)实用程序被使用。用它你可以在网络接口上配置优先级队列。这就是所谓的“设备优先级规则”。你可以定义优先级如何由特定的网络设备提供(Malt的答案对此有很好的解释)。

详情2

Socket有状态“ready for read”/“not ready for read”,这是bool。如果任何数据到达not ready socket,它会将状态从“not ready”变为“ready”,这可以通过select/poll等函数或从阻塞的recv调用返回来看到。什么线程将被唤醒不取决于socket优先级,而是取决于线程优先级。
所以如果你想优先考虑套接字,

  • 要么把它们放在优先的线程上
  • 或在选择/轮询后按代码优先
m2xkgtsf

m2xkgtsf3#

这对TSN很有用。内核流量控制支持TAPRIO(时间感知优先级)。套接字中的优先级信息将转到skb->priority字段。内核可以将优先级Map到流量类,将流量类Map到TX队列Map。对于TSN QBV,高优先级的TX队列将获得更多的时间来传输。TX队列行为由门控制列表控制。

相关问题