We've had this issue a few times and each time it's turned out to be run away GC (garbage collection). It's hard to prove and diagnose, but what I end up doing is using the kudo (scm) site, clicking tools => support (which takes you to the support site for apps.
From here you pick your directory (incase you have several) and site, click on Analyze => Metrics then the Diagnose button (NOTE this has already changed so these steps can change at any time), then back on Analyze => Dianotics, you'll eventually get a Memory Dump => "Analysis status" report. This should be a mht file (which you can open in the hateful browser IE or Edge), then search for the key "gc".
you'll find some interesting call stack frames with references to things like "GCFrame" or more interestingly calls to "System.Threading.WaitHandle.WaitMultiple" if you get too many of these, you're system might be having issues with garbage collection.
How to solve that... that's a topic covered in many other threads because it's like asking "how do I live in a world with IE 6 still in use?"...
Is there another reason why all API and HTTP requests are being sent to the same instance?
If you have load balancer, using session persistence you can keep the same client access the same virtual machine.
In the Free and Shared tiers, an app receives CPU minutes on a shared VM instance and cannot scale out. In other tiers, an app runs and scales as follows.
When you create an app in App Service, it is put into an App Service plan. When the app runs, it runs on all the VM instances configured in the App Service plan. If multiple apps are in the same App Service plan, they all share the same VM instances. If you have multiple deployment slots for an app, all deployment slots also run on the same VM instances. If you enable diagnostic logs, perform backups, or run WebJobs, they also use CPU cycles and memory on these VM instances.
In this way, the App Service plan is the scale unit of the App Service apps. If the plan is configured to run five VM instances, then all apps in the plan run on all five instances. If the plan is configured for autoscaling, then all apps in the plan are scaled out together based on the autoscale settings.
What can I do to balance the load fairly between the two instances?
You can use auto-scale conditions to scale VMs based on a metric such as 50% CPU per instance. For information on scaling out an app, see Scale instance count manually or automatically
Best Answer
This blog shows you how to troubleshoot high CPU, basically you run a profile on the process that takes up CPU. https://virtocommerce.com/blog/how-to-identify-the-cause-100
You can't reboot the hosts but you can move apps between app service plans so if you create another app service plan and move your apps you would "migrate" them to new hosts.