I'm working on an application, that does IP routing and QoS. Today we have the QoS implemented, with 3 priorities (low, normal and high) and for each level we create a Queue and as soon as the packages are queued, we send it forward in a FIFO way (the scheduler spend 60% of time with the high queue, 30% the time with normal and 10% with the low queue). It works, but as FIFO it has some drawbacks like:
An aggressive traffic will fill in the queue and all other flows with the same priority will be stucked
under high usage, TCP will slow down and UDP will keep flooding our Queue. It means in the end UDP flows will have better priorization then TCP flows
I was thinking a way to improve it and my idea is to implement a SFQ with the following algorithm:
keep the high, normal, low, but they aren't just 3 queues, but one per (seen) protocol
The scheduler still spending 60% of time we spend with the high queues, 30% the time with normal and 10% with the low queues. But now, it does a round-robin between the queues with the same priority. The choosen Queue, will still forward the packets in a FIFO way.
drawbacks from this implementation:
- it is more expensive to the CPU
Am I missing something? Any recommendation?