1. A computer-implemented method comprising: monitoring execution of a plurality of groups of software threads executing on a physical machine, wherein the physical machine comprises a physical hardware platform that includes a plurality of processor packages, the processor packages each having a plurality of processor cores and having a plurality of package power states, wherein the plurality of package power states includes an independent package power state, and wherein each of the processor packages can enter the independent package power state independently of other processor packages in the plurality of processor packages; obtaining a respective independent power state measure for each of the processor packages, wherein the independent power state measure provides a measure of a percentage of time the processor package spends in the independent package power state; obtaining a respective load measure for each of the processor packages, wherein the load measure provides a measure of a percentage of time the processor package was in use during a time window; adjusting an allocation of the plurality of groups of software threads across the plurality of processor packages based in part on the independent power state measures for the packages and the load measures for the packages; and classifying each of the plurality of processor packages into a respective category based on the load measures and the independent power state measures.