Dashboard Metrics displays Dyno Load, measured as "1m Load Average" and "1m Load Max". The method of taking these measurements is explained on our Dev Center (https://devcenter.heroku.com/articles/metrics#dyno-load), but this does not illustrate what you should expect my application to run at.
Load average limits by dyno type
Dynos that consistently see a load average higher than this value will experience CPU contention:
|Dyno Type||Dedicated cores||Load average|
Dyno load explained
The dyno load metric is a count of tasks actively executing on the CPU as well as tasks waiting for a free CPU. If you only have one physical "dedicated" core and you have a load average of 2, that indicates that you are asking for more CPU resources than the machine has. Exceeding the indicated load average for a consistent stretch of time means that your application is having performance issues.
Note: IO tasks such as reading from disk or making network requests are not counted in dyno-load since they're not actively waiting on the CPU.
Decreasing dyno load
Many applications have a way to tune the number of threads or processes that their application is attempting to use. Different languages have different performance characteristics, for instance, Ruby and Python have a GVL/GIL that prevents concurrent execution of program code by multiple threads. In general, if you are above the listed load, you will want to decrease process and/or thread counts until your application is under the given value.
Physical core count
You can obtain the number of physical cores on a machine by running
nproc in a
heroku run session and dividing the number by two:
$ heroku run nproc --size=performance-l 8
In this case performance-l dynos have
4 physical cores. The value of
8 since it includes hyperthreads.
Note: Physical CPU cores on non-performance dynos are shared across multiple applications and do not represent a dedicated resource to your application.