On Mon, 1 Oct 2012 23:31:44 +0200
Paolo Valente <[email protected]> wrote:

> 
> Il giorno 01/ott/2012, alle ore 19:52, Stephen Hemminger ha scritto:
> 
> > On Mon, 01 Oct 2012 19:46:41 +0200
> > Paolo Valente <[email protected]> wrote:
> > 
> >> Il 01/10/2012 17:31, Stephen Hemminger ha scritto:
> >>> On Sun, 30 Sep 2012 19:40:49 +0200
> >>> Paolo Valente <[email protected]> wrote:
> >>> 
> >>>> Hi,
> >>>> this patch turns QFQ into QFQ+, a faster variant of QFQ that groups
> >>>> classes into aggregates, and uses the original QFQ scheduling
> >>>> algorithm to schedule aggregates instead of single classes. An
> >>>> aggregate is made of at most M classes, all with the same weight and
> >>>> maximum packet size.  M is equal to the minimum between tx_queue_len+1
> >>>> and 8 (value chosen to get a good trade-off between execution time and
> >>>> service guarantees). QFQ+ associates each aggregate with a budget
> >>>> equal to the maximum packet size for the classes in the aggregate,
> >>>> multiplied by the number of classes of the aggregate. Once selected an
> >>>> aggregate for service, QFQ+ dequeues only the packets of its classes,
> >>>> until the aggregate finishes its budget. Finally, within an aggregate,
> >>>> classes are scheduled with DRR. In my tests, described below, the
> >>>> execution time of QFQ+ with M=8 was from 16% to 31% lower than that of
> >>>> QFQ, and close to that of DRR.
> >>>> 
> >>>> QFQ+ does not use packet lengths for computing aggregate timestamps,
> >>>> but budgets. Hence it does not need to modify any timestamp if the
> >>>> head packet of a class changes. As a consequence, differently from
> >>>> QFQ, which uses head-packet lengths to compute class timestamps, QFQ+
> >>>> does not need further modifications to correctly schedule also
> >>>> non-leaf classes and classes with non-FIFO qdiscs. Finally, QFQ+ is
> >>>> more robust than QFQ against corruption of the data structures
> >>>> implementing the bucket lists. A detailed description of QFQ+ can be
> >>>> found in [1].
> >>>> 
> >>>> As for service guarantees, thanks to the way how M is computed, the
> >>>> service of QFQ+ is close to the one of QFQ. For example, as proved in
> >>>> [1], under QFQ+ every packet of a given class is guaranteed the same
> >>>> worst-case completion time as under QFQ, plus an additional delay
> >>>> equal to the transmission time, at the rate reserved to the class, of
> >>>> three maximum-size packet. See [1, Section 7.1] for a numerical
> >>>> comparison among the packet delays guaranteed by QFQ+, QFQ and DRR.
> >>>> 
> >>>> I measured the execution time of QFQ+, DRR and QFQ using the testing
> >>>> environment [2]. In particular, for each scheduler I measured the
> >>>> average total execution time of a packet enqueue plus a packet
> >>>> dequeue.  For practical reasons, in this testing environment each
> >>>> enqueue&dequeue is also charged for the cost of generating and
> >>>> discarding an empty, fixed-size packet (using a free list). The
> >>>> following table reports the results with an i7-2760QM, against four
> >>>> different class sets. Time is measured in nanoseconds, while each set
> >>>> or subset of classes is denoted as <num_classes>-w<weight>, where
> >>>> <num_classes> and <weight> are, respectively, the number of classes
> >>>> and the weight of every class in the set/subset (for example, 250-w1
> >>>> stands for 250 classes with weight 1). For QFQ+, the table shows the
> >>>> results for the two extremes for M: 1 and 8 (see [1, Section 7.2] for
> >>>> results with other values of M and for more information).
> >>>> 
> >>>>  -----------------------------------------------
> >>>> | Set of  |      QFQ+ (M)     |   DRR      QFQ  |
> >>>> | classes |    1          8   |                 |
> >>>> |-----------------------------------------------|
> >>>> | 1k-w1   |   89         63   |    56       81  |
> >>>> |-----------------------------------------------|
> >>>> | 500-w1, |                   |                 |
> >>>> | 250-w2, |  102         71   |    87      103  |
> >>>> | 250-w4  |                   |                 |
> >>>> |-----------------------------------------------|
> >>>> | 32k-w1  |  267        225   |   173      257  |
> >>>> |-----------------------------------------------|
> >>>> | 16k-w1, |                   |                 |
> >>>> | 8k-w2,  |  253        187   |   252      257  |
> >>>> | 8k-w4   |                   |                 |
> >>>>  -----------------------------------------------
> >>>> 
> >>>> About DRR, it achieves its best performance when all the classes have
> >>>> the same weight. This is fortunate, because in such scenarios it is
> >>>> actually pointless to use a fair-queueing scheduler, as the latter
> >>>> would provide the same quality of service as DRR. In contrast, when
> >>>> classes have differentiated weights and the better service properties
> >>>> of QFQ+ make a difference, QFQ+ has better performance than DRR. It
> >>>> happens mainly because QFQ+ dequeues packets in an order that causes
> >>>> about 8% less cache misses than DRR. As for the number of
> >>>> instructions, QFQ+ executes instead about 7% more instructions than
> >>>> DRR, whereas QFQ executes from 25% to 34% more instructions than DRR.
> >>>> 
> >>>> Paolo
> >>>> 
> >>>> [1] P. Valente, "Reducing the Execution Time of Fair-Queueing Schedulers"
> >>>> http://algo.ing.unimo.it/people/paolo/agg-sched/agg-sched.pdf
> >>>> 
> >>>> [2] http://algo.ing.unimo.it/people/paolo/agg-sched/test-env.tgz
> >>>> 
> >>>> Signed-off-by: Paolo Valente <[email protected]>
> >>> I like the improvement and the performance improvement.
> >>> Is there some concern that changing the implementation this much might
> >>> upset some people already using QFQ?
> >> If you mean people upset for the degradation of the service quality 
> >> (which should however be hard to perceive in most practical 
> >> applications), then the following solution could address this issue. It 
> >> was the my first idea, before I decided not to change the interface at all.
> >> 
> >> 1. Add an additional parameter M to the tc interface, with two types of 
> >> values:
> >> 0        -> automatically compute the max number of classes in an 
> >> aggregate using the current formula
> >>> 0     -> use the value provided by the user as max number of classes
> >> 
> >> 2. Set M to 1 as default value, which would let QFQ+ behave as QFQ by 
> >> default.
> >> 
> >> tc should however be modified, and people using QFQ should probably move 
> >> to the new version (which is the main reason why I opted for the other 
> >> solution).
> >> 
> >> Paolo
> >>> What happens if an existing working QFQ config is used in QFQ+?
> >>> 
> >>> 
> >>> 
> >> 
> >> 
> > 
> > In order for the transistion to be seamless all possible upgrades
> > have to work. As in:
> >  * old iproute2 utilities with new kernel with QFQ+
> >  * new iproute2 utilities with old kernel with QFQ
> > 
> > It is okay to force users to give new parameters to get full performance,
> > but just don't want to break existing users.
> 
> I am sorry for asking again, but I did not clearly understand what you think 
> about the current solution, with no interface change, no need to give new 
> parameters, and no compatibility issues between new and old versions of 
> iproute2 and kernel. But of course with less control over the small service 
> deviation between QFQ+ and QFQ.
> 

Then great, I say put it in for net-next.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to