首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置linux套接字高优先级的效果是什么?

问设置linux套接字高优先级的效果是什么?
EN

Stack Overflow用户
提问于 2016-06-23 17:40:36
回答 2查看 13.5K关注 0票数 11

从linux套接字命令页:

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

这是使用以下方法设置的:

代码语言:javascript
复制
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. 10个低优先级套接字(priority=4)来自socket_1 - socket_10,

B.1高优先级套接字(priority=7) - socket_11

在下列情况下将发生什么:

  1. send():进程在socket_1-socket_10上发送多个消息&在socket_11上,将优先考虑socket_11上的socket_11消息,而不是通过socket_1-socket_10发送的消息。
  2. recv():如果在上面描述的所有套接字上都接收到多条消息,那么socket_11在通过socket_1-socket_10读取消息时会获得更高的优先级吗?
  3. 是否有一种方法可以使用诸如lsof、netstat等工具从命令行测量套接字优先级?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-23 19:41:52

每个Linux网络接口都附加了一个所谓的qdisc (队列规则)。你的问题的答案取决于使用中的qdisc。一些队列规则,如pfifo和bfifo,没有优先级的概念。因此,如果使用它们,答案很简单--不需要优先排序。

但是,如果对qdisc (通常是Linux上的默认qdisc )进行排序,套接字优先级可能会产生影响。

此图像描述了pfifo_fast qdisc中正在发生的事情:

​

​

我们看到数据包根据其优先级被放置在队列中。当接口发送下一个数据包(实际上是帧,但我们不要进入)时,它总是选择发送优先级最高的数据包。这意味着,如果正在等待多个数据包,则将首先发送具有最高优先级的。请注意,这要求接口拥塞-如果接口没有拥塞,并且数据包从操作系统一到达就立即发送,那么就没有排队,因此也就没有优先级。

其他qdiscs有不同的结构和策略。例如,SFQ光盘:

​

​

考虑到这一点,让我们回到你的问题:

  1. 根据qdisc,是的,来自socket_11的数据包可以在其他套接字的数据包之前发送。如果使用pfifo_fast,并且如果socket_11发送足够的流量使出站网络接口饱和,那么来自其他套接字的数据包甚至可能根本不发送。这在实践中是不太可能的,因为通常很难在饱和其他资源之前使网络接口饱和,除非它是无线接口。
  2. 数据包从机器的网络接口到套接字的路径比网络本身要快得多。而且,正如你所记得的,要想使优先级产生任何影响,就必须出现拥塞。在一个典型的场景中,到达网络接口的数据包已经通过了穿越网络的瓶颈,所以拥塞是不可能的。 当然,您可以使用进气盘或其他机制人为地造成瓶颈,并对传入的流量进行优先排序。但你为什么要这么做?只有当您正在构建流量整形器或类似的网络设备时,这才有意义。此外,由于这个qdiscs是一种低级别机制,发生在较高级别的套接字(甚至在桥接或路由之前),所以我怀疑套接字的优先级是否会对in产生任何影响。
  3. 据我所知,我不知道,但我很乐意学习。这个内核模块很接近,但是它似乎不能显示优先级标志,只显示常规的套接字选项。
票数 15
EN

Stack Overflow用户

发布于 2016-06-23 19:51:54

对你的问题的回答:

  1. 是的,默认情况下,解释如下
  2. 没有优先事项只适用于发送,解释也在下面。
  3. 我不这么认为,因为即使通过/proc接口也看不到这些选项

关于1的详细信息

一些关于优先级、网络队列和设备规则的话。所有这些都与服务质量有关,特别是与区分服务(DiffServ)有关。

当数据包被发送时,将其放入网络设备处理的接口“队列”。默认情况下,队列不是真正的队列,而是三个强优先级的真正fifos。如果fifo0中存在数据包,则fifo1中的数据包正在等待。套接字优先级通过以下映射映射到该fifo:

  • 0(尽最大努力)是fifo1
  • 1-3 (填充,散装,.)是fifo2
  • 4是fifo1
  • 5是fifo2
  • 6-7 (互动,控制)是fifo0
  • 8-15是fifo1

所以优先级1将在优先级0之后被分派。

对于更改默认行为,使用“流量控制”(tc)实用程序。使用它,您可以在网络接口上配置优先级队列。这就是所谓的“设备排队纪律”。您可以定义特定网络设备如何服务优先级( Malt的回答对此有很好的解释)。

详细介绍2

套接字的状态是“准备读”/“未准备读”,这是bool。如果任何数据到达没有准备好的套接字,它会将状态从“未准备好”更改为“就绪”,这可以通过选择/轮询之类的函数或从阻塞的recv调用返回。哪个线程将被唤醒并不取决于套接字优先级,而是取决于线程优先级。

因此,如果您想对所需的套接字进行优先级排序

  • 要么把它们放在优先级线程上
  • 或在选择/轮询后按代码排序
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37998404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档