I usually implement a system similar to Butch's, running completely on MikroTik.
I use the L7 filter to match all 'valid' traffic, then use simple FIFO Queues to prioritize this valid traffic, and put a hard bandwidth limit on the unmatched traffic (which mostly consists of p2p traffic).
See
http://wiki.mikrotik.com/wiki/Basic_tra ... _protocols
It's all self-contained inside the MikroTik router itself, no external devices. It needs practically no maintenance since standard protocols (DNS, HTTP, FTP) rarely change structure, and those are the ones that are matched.
It does need a beefy router, but I usually only implement this at the upstream edge, where I usually have an RB1000 or a P4 at least anyway. CPU never goes above 10%. In one particularly bad environment -a hotel with about 500 rooms with free wired Ethernet access in each room)- I was able to reduce upstream latency from 900-1500ms down to a steady 9ms.