Issue
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.
Resolution
Load average limits by dyno type
Dynos that are at or below the listed load average below are considered to have an acceptable dyno load:
Dyno Type | vCPU count | Load average |
---|---|---|
Hobby | n/a | 1.0 |
Standard-1x | n/a | 1.0 |
Standard-2x | n/a | 1.0 |
Performance-M | 2 | 2.0 |
Performance-L-RAM | 4 | 4.0 |
Private-L-RAM | 4 | 4.0 |
Shield-L-RAM: | 4 | 4.0 |
Performance-L | 8 | 8.0 |
Performance-XL | 8 | 8.0 |
Private-XL | 8 | 8.0 |
Performance-2XL | 16 | 16 |
Private-2XL | 16 | 16 |
Shield-2XL | 16 | 16 |
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.
If your dyno load is much higher than the number listed above, it indicates that your application is experiencing CPU contention.
If your dyno load is considerably lower than the number listed above, while under maximum load, it indicates that your application is not fully utilizing all available resources.
Increasing and 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.
vCPU count
The vCPU count is a count of the physical cores plus the hyper threads available to your dyno.
You can obtain the vCPU count on a machine by running nproc
in a heroku run
session:
$ heroku run nproc --size=performance-l
8
In this case performance-l dynos have 4
physical cores and 4
hyper threads. The value of nproc
shows vCPU count of 8
.
Note: Physical CPU cores on non-performance dynos are shared across multiple applications and do not represent a dedicated resource to your application.
WARNING: Starting November 28, 2022, free Heroku Dynos, free Heroku Postgres, and free Heroku Key-Value Store plans will no longer be available. If you have apps using any of these resources, you must upgrade to paid plans by this date to ensure your apps continue to run and retain your data. Heroku Connect and Heroku Scheduler free plans and other third-party add-ons are not affected. Eligible students can apply for platform credits through our new Heroku for GitHub Students program. See our blog and FAQ for more info.