1. A method comprising: receiving a plurality of memory operations in a memory controller, wherein each memory operation of the plurality of memory operations has an associated quality of service (QoS) parameter indicating a requested quality of service for performance of the memory operation to a memory controlled by the memory controller; and grouping the plurality of memory operations into a plurality of affinity groups, wherein the memory operations within a given affinity group consume less memory bandwidth when scheduled as a group than when scheduled separately, and wherein the memory controller comprises a plurality of memory channel controllers, wherein each memory channel controller is configured to control an independent memory channel to the memory, and each memory channel controller independently grouping memory operations into affinity groups from the memory operations within a corresponding memory channel; and scheduling memory operations directed to each memory channel of the plurality of memory channels by each memory channel controller, wherein the scheduling in a given memory channel by a given memory channel controller is responsive to the QoS parameters associated with the memory operations in the given memory channel, a state of the memory controller, and sizes of the plurality of affinity groups in the given memory channel.