1. A method comprising: determining system-wide memory bandwidth usage for a thread of a plurality of threads executing on at least one processor based on local memory bandwidth usage information associated with the thread periodically collected from a plurality of memory controllers during a timeframe; determining a quality-of-service priority of the thread based on the system-wide memory bandwidth usage for the thread and a predetermined quality-of-service for the thread; communicating the quality-of-service priority of the thread to each memory controller of the plurality of memory controllers; and locally scheduling a memory request requested by the thread according to the quality-of-service priority of the thread.