Issue
From the linux socket manpage:
SO_PRIORITY
Set the protocol-defined priority for all packets to be sent on this socket. Linux uses this value to order the networking queues: packets with a higher priority may be processed first depending on the selected device queueing discipline.
And this is set using:
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)
And say, the process has:
a. 10 low priority sockets (priority=4) from socket_1
- socket_10
,
b. 1 high priority socket (priority=7) - socket_11
What will happen in the following scenarios:
send()
: process sends multiple msgs onsocket_1
-socket_10
& onsocket_11
, IMO msgs on thesocket_11
will be given preference over the msgs being sent oversocket_1
-socket_10
.recv()
: if there are mutilple msgs being received at all the sockets described above, doessocket_11
gets higher priority in reading the messages oversocket_1
-socket_10
?Is there a way to measure the socket priority from command line using tools such as
lsof
,netstat
etc?
Solution
Every Linux network interface has a so called qdisc (queuing discipline) attached to it. And the answer to your questions depends on the qdisc in use. Some queuing disciplines like pfifo and bfifo, have no concept of priority. So if they're used, the answer is simple - there will be no prioritization
However, with a prioritizing qdisc such as pfifo_fast (which typically the default qdisc on Linux), the socket priority can have an effect.
This image describes what's going on in a pfifo_fast qdisc:
We see that packets are placed in queues depending on their priority. When the time comes for the interface to send the next packet (frame actually, but let's not get into that), it will always choose to send the packet with the highest priority. That means that if multiple packets are waiting, those with the highest priority will be sent first. Note that this requires the interface to be congested - if the interface isn't congested and packets are sent as soon as they arrive from the OS, then there is no queuing and therefore no prioritization.
Other qdiscs have different structures and policies. For example an SFQ qdisc:
With that in mind, let's get back to your questions:
Depending on the qdisc, yes, packets from
socket_11
may be sent ahead of packets from other sockets. Ifpfifo_fast
is used, and ifsocket_11
sends enough traffic to saturate the outbound network interface, then the packets from the other sockets might even not be sent at all. This is unlikely in practice since it's usually hard to saturate a network interface before saturating some other resource, unless it's a wireless interface.The path that packets take from the machine's network interface to the socket is much faster than the network itself. And, as you recall, for prioritization to have any effect, there has to be congestion. In a typical scenario, packets that reached as far as your network interface have already passed the bottleneck of their journey across the network, so congestion is unlikely.
You can of course use an ingress qdisc or other mechanisms to artificially create a bottleneck, and prioritize incoming traffic. But why would you? That only makes sense if you're building a traffic shaper or a similar network device. Plus, since this qdiscs are a low level mechanism that happens well below the higher level sockets (even before bridging or routing), I doubt that the socket's priority could have any effect on in.
Not that I'm aware of, but I'd be happy to learn. This kernel module comes close, but it doesn't seem to be able to show priority flags, just regular socket options.
Answered By - Malt Answer Checked By - Mildred Charles (WPSolving Admin)