<div dir="ltr">Regardless of whether this is the most logical thing or not, using 0 as the lowest priority was done for historical reasons and is unlikely to change for simple_switch. Maybe future bmv2 architecture implementations will use the reverse.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 20, 2018 at 10:16 AM, Costa Molero  Edgar <span dir="ltr"><<a href="mailto:cedgar@ethz.ch" target="_blank">cedgar@ethz.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Antonin,<br>
<br>
Not 100% sure, but would not it be better that the highest priority for simple_switch also be 0? I mean, the default value of Intrinsic_metadata.priority will be 0 change it meaning that if you don’t set the priority for a given packet it ends up in the worst queue?  I would not expect a switch queueing my packets to the worst queue when I don’t set the priority. Or do you think its better to end up in the worst priority queue when not setting the metadata field?<br>
<br>
In the pull request I submitted some days ago (<a href="https://github.com/p4lang/behavioral-model/pull/566/" rel="noreferrer" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/pull/566/</a>). I added a way to set the depth/rate to a given priority queue, however that uses  QueueingLogicPriRL.set_rate() and  QueueingLogicPriRL.set_<wbr>capacity() methods that do not reverse the other and thus when I set in the CLI the depth/rate of queue 0 it will actually affect the packets for which I set priority=7. I could reverse that in the CLI too, but that would require to know SSWITCH_PRIORITY_QUEUEING_NB_<wbr>QUEUES.<br>
<br>
Kind regards,<br>
Edgar<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> On 20 Mar 2018, at 17:32, Antonin Bas <<a href="mailto:antonin@barefootnetworks.com">antonin@barefootnetworks.com</a>> wrote:<br>
><br>
> In my previous email, I was using TCP, and not UDP. If I try again with UDP I get 9.65Mbps for the high-priority client and 0.2Mpbs for the low-priority one; so you can clearly observe the starvation there.<br>
><br>
> There is no contradiction. QueueingLogicPriRL indeed assumes that 0 is the highest priority. However, the semantics of intrinsic_metadata.priority are that 0 is the lowest priority (<a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/simple_switch.h#L42" rel="noreferrer" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/blob/master/<wbr>targets/simple_switch/simple_<wbr>switch.h#L42</a>). Which is why when I enqueue a packet I reverse the priority value: <a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/simple_switch.cpp#L262" rel="noreferrer" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/blob/master/<wbr>targets/simple_switch/simple_<wbr>switch.cpp#L262</a>. As far the simple_switch user is concerned, 0 is is the lowest priority and hopefully nothing contradicts this.<br>
><br>
> On Tue, Mar 20, 2018 at 2:39 AM, Costa Molero Edgar <<a href="mailto:cedgar@ethz.ch">cedgar@ethz.ch</a>> wrote:<br>
> Thanks for trying to replicate, I will try to use your files, but I think the main issue here is the queues implementation and that my bmv2 had debugging enabled. Even if you have the interfaces limited at 10 mbps, don’t you think that with this strict priority queueing the lowest priority<br>
> queue should get even less than 1.77 mbps? If your tests used UDP sending at 10mbps that should leave very few opportunities for the other queue to even send packets no?<br>
><br>
> Btw, there is a contradiction here:<br>
><br>
> <a href="https://github.com/p4lang/behavioral-model/blob/master/include/bm/bm_sim/queueing.h#L390" rel="noreferrer" target="_blank">https://github.com/p4lang/<wbr>behavioral-model/blob/master/<wbr>include/bm/bm_sim/queueing.h#<wbr>L390</a><br>
><br>
> //! This class is slightly more advanced than QueueingLogicRL. The difference<br>
> //! between the 2 is that this one offers the ability to set several priority<br>
> //! queues for each logical queue. Priority queues are numbered from `0` to<br>
> //! `nb_priorities` (see QueueingLogicPriRL::<wbr>QueueingLogicPriRL()). Priority `0`<br>
> //! is the highest priority queue. Each priority queue can have its own rate and<br>
> //! its own capacity. Queues will be served in order of priority, until their<br>
> //! respective maximum rate is reached. If no maximum rate is set, queues with a<br>
> //! high priority can starve lower-priority queues. For example, if the queue<br>
> //! with priority `0` always contains at least one element, the other queues<br>
> //! will never be served.<br>
><br>
> In this comment it says that priority 0 should be the highest. So I guess or either that comment or the implementation has a mistake.<br>
><br>
> Kind regards,<br>
> Edgar<br>
><br>
>> On 19 Mar 2018, at 22:50, Antonin Bas <<a href="mailto:antonin@barefootnetworks.com">antonin@barefootnetworks.com</a>> wrote:<br>
>><br>
>> Hi Edgar,<br>
>><br>
>> I wasn't able to reproduce this issue. I ran a little experiment myself, using tc from Mininet to limit bandwidth to 10Mbps per interface. The client with high priority got a bandwidth of 8.41 Mbps, while the client with low priority got a bandwidth of 1.77 Mbps.<br>
>><br>
>> I made a minor change to the 1sw_demo.py script included in the bmv2 repo:<br>
>> diff --git a/mininet/1sw_demo.py b/mininet/1sw_demo.py<br>
>> index 6472c19..eec16af 100755<br>
>> --- a/mininet/1sw_demo.py<br>
>> +++ b/mininet/1sw_demo.py<br>
>> @@ -19,6 +19,7 @@ from <a href="http://mininet.net" rel="noreferrer" target="_blank">mininet.net</a> import Mininet<br>
>>  from mininet.topo import Topo<br>
>>  from mininet.log import setLogLevel, info<br>
>>  from mininet.cli import CLI<br>
>> +from mininet.link import TCLink<br>
>><br>
>>  from p4_mininet import P4Switch, P4Host<br>
>><br>
>> @@ -57,7 +58,7 @@ class SingleSwitchTopo(Topo):<br>
>>              host = self.addHost('h%d' % (h + 1),<br>
>>                                  ip = "10.0.%d.10/24" % h,<br>
>>                                  mac = '00:04:00:00:00:%02x' %h)<br>
>> -            self.addLink(host, switch)<br>
>> +            self.addLink(host, switch, bw=10)<br>
>><br>
>>  def main():<br>
>>      num_hosts = args.num_hosts<br>
>> @@ -70,6 +71,7 @@ def main():<br>
>>                              num_hosts)<br>
>>      net = Mininet(topo = topo,<br>
>>                    host = P4Host,<br>
>> +                  link=TCLink,<br>
>>                    switch = P4Switch,<br>
>>                    controller = None)<br>
>>      net.start()<br>
>><br>
>> I used the attached P4_14 program and the attached commands.txt files. I'm also attaching the bmv2 JSON file so that you don't have to compile the program yourself.<br>
>> Here at the commands I used next:<br>
>> - sudo python 1sw_demo.py --behavioral-exe <path to simple_switch> --num-hosts 3 --json simple_router.json<br>
>> - simple_switch_CLI < commands.txt<br>
>><br>
>> I then started an iperf server on h3 and an iperf client on h1 and h2. Traffic originating from h1 has priority 0 (low-priority) and achieved a significantly lower bandwidth.<br>
>> I encourage you to try with my files and see if you observe the same difference in bandwidth. If you don't, it is probably an issue with your P4 program, your CLI commands or the P4 compiler you are using.<br>
>><br>
>> Note that I also compiled bmv2 without the logging macros to ensure that the bmv2 packet processing throughput would not be an issue:<br>
>> ./configure --disable-elogger --disable-logging-macros 'CFLAGS=-g -O2' 'CXXFLAGS=-g -O2'<br>
>><br>
>> I also tried the experiment with 100Mbps interfaces for 60 seconds for the thrill of it, and observed 73 Mbps and 23 Mbps. If I increase the bandwidth to 500Mbps per link, both clients achieve around 200Mbps, but I blame it on my laptop being slow. I don't think the priority queue implementation will give you great results under heavy load.<br>
>><br>
>><br>
>> On Fri, Mar 16, 2018 at 12:40 PM, Costa Molero Edgar <<a href="mailto:cedgar@ethz.ch">cedgar@ethz.ch</a>> wrote:<br>
>> I am trying to do some priority queueing with simple switch.<br>
>><br>
>> I think I did what is needed to enable strict priority queueing in the simple switch, but I do not get what I was expecting:<br>
>><br>
>> 1) uncommented in the simple_switch.h the line that enables multiple queues to be added at compile time. (#define SSWITCH_PRIORITY_QUEUEING_ON)<br>
>> 2) Added the intrinsic metadata to v1model.p4<br>
>><br>
>>     //Priority queueing<br>
>>     @alias("queueing_metadata.qid"<wbr>)           bit<8>  qid;<br>
>>     @alias(“intrinsic_metadata.<wbr>priority")     bit<3> priority;<br>
>><br>
>><br>
>> 3) Testing with a very simple topology:  3 hosts connected to a switch in a star topology, and 2 of them will send to the third host. Using traffic control I set a rate limit of 20 mbps to all the interfaces.<br>
>><br>
>> It the ingress pipe line I just do this very simple thing: (h1 has priority 0, and h2 a priority of 7)<br>
>> if (hdr.ipv4.srcAddr == 0x0a000101){<br>
>>     standard_metadata.priority = (bit<3>)0;<br>
>> }<br>
>> else if (hdr.ipv4.srcAddr == 0x0a000102){<br>
>>     standard_metadata.priority = (bit<3>)7;<br>
>> }<br>
>><br>
>> At the egress I set the tos field of the IP packet to ID of the queue that was used to verify that indeed the priority queueing was happening.<br>
>><br>
>> hdr.ipv4.tos = standard_metadata.qid;<br>
>><br>
>> Results:<br>
>><br>
>> I send two TCP flows with iperf, h1->h3 and h2->h3, both get ~10mbps. Am I doing something wrong?<br>
>><br>
>> ——-<br>
>><br>
>> I have a second question, I saw that the CLI has a command to set a packets_per_second rate and a queue depth. However they work at a port-level. Is there a way to set that at a per queue-level ? I have been checking the source code and the CLI ends up using:<br>
>><br>
>> int<br>
>> SimpleSwitch::set_egress_<wbr>queue_rate(int port, const uint64_t rate_pps) {<br>
>>   egress_buffers.set_rate(port, rate_pps);<br>
>>   return 0;<br>
>> }<br>
>><br>
>> Which used set_rate from queueing.h<br>
>><br>
>> There you can find that there is a set_rate function with the priority parameter: void<br>
>> set_rate(size_t<br>
>><br>
>>  queue_id,<br>
>> size_t<br>
>><br>
>>  priority,<br>
>> uint64_t<br>
>><br>
>>  pps). Would it work if I modify the simple_switch.cpp and add a function that uses set_rate with priority? I have seen that you use some autogenerated python code, is it enough compiling again the entire thing to get that?<br>
>><br>
>><br>
>> I think a good way to go would be to add that a third option in the sswitch_CLI.py in the function do_set_queue_rate.  For example:<br>
>><br>
>> def do_set_queue_rate(self, line):<br>
>>     "Set rate of one / all egress queue(s): set_queue_rate <rate_pps> [<egress_port>] [<priority>]"<br>
>>     args = line.split()<br>
>>     rate = int(args[0])<br>
>>     if len(args) > 2:<br>
>>         port = int(args[1])<br>
>>         priority = int(args[2])<br>
>>         self.sswitch_client.set_<wbr>egress_queue_rate_priority(<wbr>port, rate, priority)<br>
>>     elif len(args) > 1:<br>
>>         port = int(args[1])<br>
>>         self.sswitch_client.set_<wbr>egress_queue_rate(port, rate)<br>
>>     else:<br>
>>         self.sswitch_client.set_all_<wbr>egress_queue_rates(rate)<br>
>><br>
>> Kind regards,<br>
>> Edgar<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> ______________________________<wbr>_________________<br>
>> P4-dev mailing list<br>
>> <a href="mailto:P4-dev@lists.p4.org">P4-dev@lists.p4.org</a><br>
>> <a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/<wbr>listinfo/p4-dev_lists.p4.org</a><br>
>><br>
>><br>
>><br>
>> --<br>
>> Antonin<br>
>> <commands.txt><simple_router.<wbr>p4><simple_router.json>_______<wbr>______________________________<wbr>__________<br>
>> P4-dev mailing list<br>
>> <a href="mailto:P4-dev@lists.p4.org">P4-dev@lists.p4.org</a><br>
>> <a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/<wbr>listinfo/p4-dev_lists.p4.org</a><br>
><br>
><br>
><br>
><br>
> --<br>
> Antonin<br>
> ______________________________<wbr>_________________<br>
> P4-dev mailing list<br>
> <a href="mailto:P4-dev@lists.p4.org">P4-dev@lists.p4.org</a><br>
> <a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/<wbr>listinfo/p4-dev_lists.p4.org</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Antonin<br></div></div>
</div>