1. A method, comprising: performing, by a computer that includes multiple processor sockets, each of which includes one or more processor cores, and one or more hardware performance counters in the one or more processor cores: receiving an application that is configured for parallel execution on the computer; determining, dependent on profile data that characterizes behavior of the computer when multiple applications are executed in parallel on a single one of the processor sockets, that the application is to be executed on a given one of the multiple processor sockets while a particular other application is also executing on the given one of the multiple processor sockets, wherein the profile data indicates that values of the one or more performance counters predict whether or not performance of a pair of applications executed in parallel on one of the multiple sockets will be lower than performance of the pair of applications when executed in parallel on respective different ones of the multiple sockets; beginning execution of the given application, wherein execution of the given application comprises executing program instructions that perform work on behalf of the given application and that cause a respective value of each of the one or more hardware performance counters in the one or more processor cores of the given one of the multiple processor sockets on which respective software threads of the given application are executing to be updated; and determining, prior to completing execution of the given application or the particular other application, and dependent on the updated values of the one or more performance counters, that execution of the given application or execution of the particular other application is to be migrated to a different one of the multiple processor sockets.