Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I programmatically limit my program's CPU usage to below 70%?

Of late, I'm becoming more health oriented when constructing my program, I have observed that most of programs take 2 or 3 minutes to execute and when I check on the task scheduler, I see that they consume 100% of CPU usage, can I limit this usage programatically in code? This will certainly enable me to run multiple programs at a given time.

Thanks, Nidhi

like image 535
Nidhi Avatar asked Jun 12 '09 22:06

Nidhi


People also ask

How do I limit CPU usage per program?

Change the CPU Affinity Another method to curb the CPU usage of a program is by adjusting the CPU Affinity. It is simply restricting the processes to use fewer CPU cores of your system. By changing CPU affinity, you can free up CPU cores which will become available to other processes.

How do I limit CPU usage in Python?

Limiting CPU and Memory Usage Resources like CPU, memory utilised by our Python program can be controlled using the resource library. To get the processor time (in seconds) that a process can use, we can use the resource. getrlimit() method. It returns the current soft and hard limit of the resource.


2 Answers

This thread is over four years old, and it still annoys me that the accepted answer criticizes the question rather than answering it. There are many valid reasons you would want to limit the CPU time taken by your program, I can list a few off the top of my head.

It might seem like a waste not to use all free CPU cycles available, but this mentality is flawed. Unlike older CPUs, most modern CPUs do not run at a fixed clock speed - many have power saving modes where they drop the clock speed and cpu voltage when load is low. CPUs also consume more power when performing calculations than they do running NOOPs. This is especially relevant to laptops that require fans to cool the CPU when it is under high load. Running a task at 100% for a short time can use far more energy than running a task at 25% for four times as long.

Imagine you are writing a background task that is designed to index files periodically in the background. Should the indexing task use as much of the CPU as it can at a lower priority, or throttle itself to 25% and take as long as it needs? Well, if it were to consume 100% of the CPU on a laptop, the CPU would heat up, the fans would kick in, and the battery would drain fairly quickly, and the user would get annoyed. If the indexing service throttled itself, the laptop may be able to run with completely passive cooling at a very low cpu clock speed and voltage.

Incidentally, the Windows Indexing Service now throttles itself in newer versions of Windows, which it never did in older versions. For an example of a service that still doesn't throttle itself and frequently annoys people, see Windows Installer Module.

An example of how to throttle part of your application internally in C#:

public void ThrottledLoop(Action action, int cpuPercentageLimit) {     Stopwatch stopwatch = new Stopwatch();      while(true) {         stopwatch.Reset();         stopwatch.Start();          long actionStart = stopwatch.ElapsedTicks;         action.Invoke();         long actionEnd = stopwatch.ElapsedTicks;         long actionDuration = actionEnd - actionStart;          long relativeWaitTime = (int)(             (1/(double)cpuPercentageLimit) * actionDuration);          Thread.Sleep((int)((relativeWaitTime / (double)Stopwatch.Frequency) * 1000));     } } 
like image 124
Ryan Avatar answered Oct 06 '22 03:10

Ryan


That's not your concern... It's the job of the operating system to distribute processor time between running processes. If you'd like to give other processes first crack at getting their stuff done, then simply reduce the priority of your own process by modifying the Process.PriorityClass value for it.

See also: Windows Equivalent of ‘nice’

like image 32
Shog9 Avatar answered Oct 06 '22 05:10

Shog9