Is there a technique in Windows that can selectively limit bandwidth of a running process?
I use Net Limiter, which has a free version, but unfortunately you'll need to pay for the limitation feature.
NetLimiter is an ultimate internet traffic control and monitoring tool designed for Windows. You can use NetLimiter to set download/upload transfer rate limits for applications or even single connection and monitor their internet traffic.
Along with this unique feature, Netlimiter offers comprehensive set of internet statistical tools. It includes real-time traffic measurement and long-term per-application internet traffic statistics
There are good reasons to look at the "Internet facing router" approach for managing a network as a whole - however as the original question was specific and the user may very well be the only computer on the network, that is a secondary concern.
Per one of the other top answers, for a while I tested out NetBalancer. It works really well - and is easy to configure.
NetBalancer is available for purchase on their web page for about $50. The trial/free version allows you to monitor connections - but does not allow throttling.
The alternative is NetLimiter. It has a free trial period - but starts at ~$20 for the Lite version or ~$30 for the Pro version. NetLimiter is the tried-and-tested go-to application for many SysAdmins.
When NetLimiter's trial ends, until you buy a license, it becomes a monitoring-only tool - and no longer supports throttling. This can still be useful - but not for this use case.
Using a Router (with an explanation of why this isn't a good approach to this use case).
Though using a smart/highly-configurable router is usually the better approach to wholistic network management, the disconnect between that and the original question is not explained in @ZaB's answer. The original question is specifically asking about a process - which a router has no way reliably to identify.
The one variation that is close to useful on this end is if an application only communicates over a specific channel or type of traffic that easily can be identified by the router. An example is below of EA's Origin downloads:
Origin presently uses Akamai. Typically I set automatic downloads/updates to run at any time - but I'd prefer that it not use all the line capacity while I'm busy doing other more important things. Origin happens to be very bad at this sort of thing, thus it doesn't support download schedules or download throttling. Currently my desktop is downloading a game using the server "a1750.d.akamai.net". A MikroTik router (an example of a smart router) can take note that this DNS name was used (it will be in the DNS cache with an IP address) and can be configured temporarily to add the destination server's IP address to an "address list". All traffic to/from the address list can be added to a throttled queue thereby, technically, throttling a single application.
The approach above is naive however. EA could at any time change the server name, the protocol used, or another unrelated service using the Akamai infrastructure could be inadvertently throttled. Now my shiny new rule is rendered useless and broken.
Here is my poor mans throttling:
It does not exactly limit the bandwith, it rather suspends/resume the bandwidth eating process and thus frees some bandwidth for other applications. And it's free!
You need PsSuspend.exe (I put this file into C:\tools\sysinternals) and a batch file (e.g.) slow.bat:
@echo off :START c:\tools\sysinternals\pssuspend.exe %1 >NUL: 2>&1 timeout /T 1 /NOBREAK >NUL: c:\tools\sysinternals\pssuspend.exe -r %1 >NUL: 2>&1 timeout /T 1 /NOBREAK >NUL: goto START
Now open a command line as administrator and run the batch file with the throttles program as parameter
(replace filetransfer.exe with your program name)
If you are done, hit CTRL-C and cancel the batch.
If the program is still running consider to resume the program in case you interrupted the batch while the program was suspended:
c:\tools\sysinternals\pssuspend.exe -r filetransfer.exe
(replace filetransfer.exe with your program name)
You can use Windows Group Policy to throttle the bandwidth of any process. Go to:
- Start Menu > Run > gpedit.msc
- Computer/User Configuration (pick one or the other) > Windows Settings > Policy-based QoS
Here you can see the current policies and create new ones by:
- Either right clicking "Policy-based QoS" or going to "Action" > Create new policy...
- Then follow the wizard to create a new throttling policy.
The wizard allows you to create a policy to throttle bandwidth for either:
- Everything on your computer
- Specific processes
- Specific websites (only for applications using HTTP protocols)
And your policies can then be filtered by:
- TCP or UDP protocols
- Source/destination IP
- Source/destination ports
You can also create these policies in Powershell by running:
New-NetQosPolicy -Name "FTP" -AppPathNameMatchCondition "ftp.exe" -ThrottleRateActionBitsPerSecond 1MB
Although this might require administrator rights, and there seems to be a bug where policies created like this will not appear in the GUI.