1. A computer-implemented method comprising: receiving, by a computing device, a request to execute a task for a tenant on shared hardware resources, the shared hardware resources including a processing resource shared by multiple tenants executing tasks on the shared hardware resources; determining, by the computing device, a set of computing resources for allocation to the task based on a service level agreement associated with the tenant, the set of computing resources including the processing resource; determining, by the computing device, a set of one or more resource usage constraints to be applied to the set of computing resources including a number of processor cycles per time interval for allocation to the task based on the service level agreement associated with the tenant; allocating, by the computing device, the set of computing resources including the number of processor cycles per time interval to the task; monitoring, by the computing device, one or more performance metrics associated with the processing resource including an instruction counter to determine utilization of the processing resource by the task during execution of the task; and enforcing, in hardware of the computing device, the set of one or more resource usage constraints during the execution of the task by adjusting an execution pipeline priority of processor instructions associated with the task based on the utilization of the processing resource relative to its corresponding resource usage constraint, wherein adjusting the execution pipeline priority includes lowering the execution pipeline priority of the processor instructions associated with the task in a time interval in response to detecting that the task has exhausted the number of processor cycles allocated to the task in that time interval, the execution pipeline priority being adjusted independently of the tasks of other tenants executing on the shared hardware resources during the time interval.