Edited by Sam_xXx, Special Thanks to WaLLy3Ks and Whispers
Rates has always been an issue in online games such as Counter-Strike Source since the birth of Valves' Source Engine.
Users have always guessed what they should use or just followed someone elses advice which generally speaking, was always wrong.
This is evident with the amount of people who run purely awful rates in public servers such as GameArena.

Definitions:

cl_ = console commands for Client ( cl_ )
sv_ = console commands for Server ( sv_ )
mp_ = console commands for Map ( mp_ )

Tickrate
As per Whispers Wiki.

From Valve: During each tick, the server processes incoming user commands, runs a physical simulation step, checks the game rules, and updates all object states. After simulating a tick, the server decides if any client needs a world update and takes a snapshot of the current world state if necessary. A higher tickrate increases the simulation precision, but also requires more CPU power and available bandwidth on both server and client. When a client connects to a server, the clients Source Engine matches the SRCDS (Source Dedicated Server) tickrate that the client connected to.
  • Server tickrate 100 = Client tickrate 100
  • Server tickrate 66 = Client tickrate 66
  • Server tickrate 33 = Client tickrate 33

Rate
Max bytes/sec the host can receive data.

This is the maximum amount of bytes per second that you use to transfer data. The hard coded upper limit in the source engine was previously 30000 bytes, which converts into 29.297 kilobytes. The new hard coded maximum rate is 1048576 bytes, which works out to be 1024 kilobytes. Keep in mind however, that Valve only implemented this for Local Area Network environments and sv_maxrate 30000 is still the recommended and encouraged value for online servers to use.

Cl_cmdrate
Max number of command packets sent to server per second.

This variables determines how many times you update the location of others around you.
Since a servers tickrate will never exceed 100 in the source engine (Tickrate being the amount of times the server will update the 'world' per second), you will never have any need to set this variable above 100 as you can not exceed the amount of updates that the server allows. This cvar (Console Variable) is also directly proportional to the amount of Frames Per Second (FPS) that you get, as you can not update your own position more than one time per each and every frame. This very basically means that you don't need to get any more than 100 frames per second on a server with a tickrate of 100. This doesn't mean you should just set fps_max to 100 either, but more on that later.

Cl_updaterate
Number of packets per second of updates you are requesting from the server.

This variables determines how many times you update the location of yourself and the things you do within the world. Setting this to 100 on a server with 100 tickrate server would normally mean that you get the full amount of update that is possible with the Source Engine, but this is often not the case. Server performance is the factor in what you see in net_graph 3's IN, if it's not at 100 (When it can't hold it at all, not just a small deviation from the number for short periods of time) then it's typically safe to say that the server can not sustain the tickrate because of either bandwidth or CPU requirement. (Most commonly an overloaded server host with too many game servers running off the single PC host (More commonly known as a 'box'). Assuming the server and your own internet connection was able to handle it though, setting cl_updaterate 100 will mean that you get the full amount of updates as it is not bound by your own FPS in any way. You will want to keep this the same value of cl_cmdrate though, to avoid choke. More on choke later.

Fps_max
Frame rate limiter.

The frames per second limiter. The value you give it, will always return -1. EG: If you define 60, it will always hold 59. Since cl_cmdrate limits itself off the current amount of frames you get, you would assume to set this to 101. Even on a decent specification system however, you may still fluctuate more than you would if you set it say 20 frames higher. IE: On my personal rig, using fps_max 101 will cause the FPS to fluctuate around the 80's in firefights, whereas setting it to 121 will cause the FPS to fluctuate around the 100's. I personally haven't quite figured out what causes this aside from your actual hardware, but it's still my observation that you will want to take note of. I personally use 129. Rumours say that this should be set to the value of your monitors Hz (Usually 60/75/80/100), but just because your monitor won't show you the difference between 80 and 100 on a 75 Hz screen, doesn't mean the game will limit the amount of updates recieved.

Choke
As per Whispers Wiki.
Choke is quite simply the server wanting to send an update to the client, but cannot.

  • If the server cannot sustain the tickrate, you get choke (You may not actually get choke, but the server will lag very badly)
  • If the server cannot sustain the fps the tickrate requires, you get choke
  • If the server cannot sustain the fps the sv_minupdaterate requires, you get choke
  • If the server cannot sustain the the sv_minupdaterate, you get choke
  • If the server connection cannot sustain the bandwidth required to support the updaterate, you get choke
  • If the server connection cannot sustain the bandwidth required to support the sv_minrate, you get choke
  • If the required bandwidth demanded by the sv_maxupdaterate exceeds the sv_maxrate, you get choke
  • If the clients connection cannot sustain the bandwidth required to support the cl_updaterate you get choke
  • If the clients required bandwidth demanded by the cl_updaterate exceeds the rate, you get choke

The main variables...

There are three main cvars that you should concentrate on:

Rate - The value of this is from 0 to 30000, 30000 being the online maximum.
Cl_cmdrate - The value of this is from 0 to 100.
Cl_updaterate - The value of this is from 0 to 100.

Choosing what's right for you
How can you tell which are the best rates to use?

Grab and install Pingplotter Freeware, get an IP of a server that has a tickrate of 66 (..and of course is geographically close to you), set the trace delay down to 1 second and leave that running for two minutes. If everything looks fine, with pings in the green and packet loss at none, you now have a guideline to go off that it's not you having ISP issues and can leave you to focus on correctly adjusting your rates. If pings are high (assuming the server is close to you) and/or you're getting packet loss, you will want to seek help in fixing your ISP network issues instead of adjusting your rates as the problem isn't something which you can fix on your end.

Now launch your Source Engine (SE) game of choice, enable net_graph 3 via console (Keyboard > Options > Advanced > Enable Developer Console) on a server with a tickrate of AT LEAST 66 (Practically all GameArena servers have a tickrate of 66). This will show two things that you need to read - loss and choke.

You need to aim for absolutely minimal choke as possible, with next to no loss. Choke means that the server is sending you updates, but your rates are making you disregard them (EG: You're using 30000/66/66 and the server has max rates of 30000/100/100 - this means you'll be getting a choke of 34.. at least that's the theory). Loss is actual updates being lost between you and the server and is something you need to absolutely avoid as much as possible - assuming the problem does indeed lie on your end in the first place.

Optimally, you will want to use the following rates on a 100 tickrate server: rate 30000;cl_cmdrate 100;cl_updaterate 100. Try them and see if you get loss in the net graph. However, do not try this if you don't have at least 128k upload dedicated to your own PC playing your SE game of choice, as running 30000/100/100 on a 100 tickrate server will utilise almost all of the 128k of bandwidth you have to spare. You can also try running rate 20000;cl_cmdrate 66;cl_updaterate 66 if the above fails.

The next step down is rate 15000;cl_cmdrate 45;cl_updaterate 45 and this is about the absolute minimum you'll want to use on a broadband connection.

The bare minimum you will want to use is rate 7500;cl_cmdrate 35;cl_updaterate 35. You should only run this if you absolutely have to, because you're disadvantaging yourself by running rates that are this appalling. Generally, this is what users of IDSN/56k should use.

Making the most of what you have
You have one of the rate values that has been suggested, but you want to make the most out of that.

Remember that you need to keep in mind that you need to aim for absolutely minimal choke as possible, with next to no loss. With this in mind, you'll want to increase rate by 2500 each time (15000 > 17500 > 20000 > Etc), cl_cmdrate and cl_updaterate by 10 and then keep your eye on the net graph. When you've got as minimal choke as you can get with no loss (Along with the rates being as high as possible), then you've hopefully hit the sweet spot that you've been looking for.

Notes regarding Netgraph Updates per second measurements you need to be aware of:
    You won't get higher updates than:
  • 1. The servers tickrate
  • 2. The servers sv_maxupdaterate
  • 3. As fast as your server fps allows (Limited by fps_max, hardware and the servers' Kernel Timer Resolution)
  • 4. As fast as your servers sv_maxrate allows
  • 5. As fast as the client/server connection allows
  • 6. As fast as the clients rate allows
  • 7. As fast as the clients cl_updaterate allows
  • 8. As fast as the clients fps allows (Limited by fps_max, hardware, and Refresh Rate)
  • 9. Client FPS controls how fast the client can send updates to the server, this the OUT on the net_graph 3

Fixing Choke
As per Whispers Wiki.

Besides making sure you follow the bad choke solution and set your Steam internet connection settings correctly, the only two variables that are going to really help the clients choke problems are rate and cl_updaterate.
  1. If in doubt about your Steam Internet Connection Setting, set it 1 higher than what you have.
  2. If you are getting choke and the throughput on the net_graph 3 is lower than what you expect, then raise your rate.
  3. The blame may not always be with you, the client! Try another server, or another server on another Game Service Provider.
  4. Finally again, don't bugger around trying to fix choke problems if you have loss problems. You are just wasting your time and everybody else's if you ask them to help fix your choke problems if you have LOSS!!! Loss is a network problem, that being a problem BETWEEN YOU AND THE SERVER. (See point 6. of the net_graph 3 explanation)

Net_graph 3 Explanation
As per Whispers Wiki.

net_graph3
  • 1. FPS is how many frames per second the client is rendering. This is limited by the clients fps_max setting or the refresh rate of the monitors vertical refresh rate if Vertical-Sync is enabled.
  • 2. IN is what is being received by you the client, FROM the server.
  • 3. OUT is what is being sent by you the client, TO the server.
    • The IN & OUT both have 3 components, starting from left to right:

    • The size of the game packet in bytes being sent and received (Uncertain if this includes UDP Segment + IP Packet overhead)
    • The average amount of kilobytes per second being sent or received of gamedata + UDP segment + IP packet overhead
    • The average amount of updates being sent or received per second (This one is the important one for clients to be reading)
    • The amount of IN Updates received by the client per second (controlled by cl_updaterate) will in most cases equal the servers tickrate, but will NEVER exceed:

      • The Clients cl_updaterate
      • The Servers sv_maxupdaterate

    • The server/clients tickrate which are always the same, as the client will always use the same tickrate as the server it connects to.
    • Which ever is the smallest of those 3 numbers will determine the number you see for Updates per second RECEIVED by the client. If the clients AND/OR servers bandwidth is not sufficient, or is limited by the clients rate or servers sv_maxrate, then the client will NOT see the IN Updates received by the client per second equaling the servers advertised tickrate. This is one example of when the client will see choke. If the server does not have enough CPU to sustain the servers fps above the servers tickrate, the client will NOT see the IN Updates received by the client per second equaling the servers advertised tickrate. This is another example of when the client will see choke.

    • The clients cl_cmdrate
    • The server/clients tickrate
    • The clients frames per second

    • Which ever is the smallest of those 3 numbers will determine the number you see for Updates per second SENT by the client. It may look like the OUT Updates sent by your computer per second does exceed the fps, but it reality it does not. It is that the net_graph 3 readings are not always perfectly in sync or there are rounding errors in the calculations, because the the two per second counts in 2. and 3. shown in net_graph 3, are only averages. There is also the error in the net_graph 3 that occurs when the average updates received by you per second magically seem to exceed the servers sv_maxupdaterate, servers tickrate, and the clients cl_updaterate, which were all set to 100 at the time the screenshot was taken above, despite what is shown in the picture above.

  • 4. Loss are lost packets due to Network problems, either with your computers connection to your ISP, your ISP, or the ISP that is hosting the server or anywhere in between. If you have loss then you will probably have choke. Do not bother trying to solve Choke problems if you have Loss problems. Resolving loss problems is done by following standard Network Trouble Shooting Procedures. Get a friend to help you or call your ISP, or ask in the Game Server Providers Forum for help. Helping you with network problems is outside the purview of this document, and people who know what they are doing get paid 3 or 4 figure dollar amounts an hour to solve them.
  • 5. Choke is quite simply the server wanting to send you data but cannot. The reason for this though are not always simple to understand, diagnose or fix. See the Choke explanation above.

Making your rates stay when you restart your game

Note down the values of rate, cl_cmdrate and cl_updaterate. Now browse to the folder on the hard drive that has Steam installed to (EG: C:/Valve/Steam), note the username of the current account you're logged into (Typically referred to ~Username or user@domain.com) and then go to your /SteamApps/~Username/ folder. Find the mod folder for your game of choice (EG: /SteamApps/~Username/counter-strike source/cstrike/) and look for a folder named 'cfg'. Open that folder and then before you do anything, make sure you can see filename extensions by going to the top toolbar and clicking on 'Tools', followed by 'Folder Options'. Then look for the tab that says 'View' on it and click it. Look for the option that says 'Hide extensions for known file types', disable this by clicking on the tickbox and then hit the 'OK' button. Now, look for a file called autoexec.cfg (If it doesn't exist, create a blank file and name it autoexec.cfg making sure it DOES NOT have a .txt extension on it) and edit it with your rates. One console command per line, so it would look something like the following:

rate 30000
cl_cmdrate 100
cl_updaterate 100

Then throw in the following line:

echo "Autoexec loaded..."

This is just a safety measure to know when the configuration file has loaded when you start up your game of choice, which will be visible in console. Your newfound rates will now stick and you should hopefully be able to be more accurate while playing your game of choice and therefore be more enjoyable.


Frequently Asked Questions

Q. Why is the maximum value of rate 30000 online?
A. This was the original hardcoded maximum in the Source Engine. The sv_pure update however allows for a higher maximum rate, but is only to be used in a Local Area Network environment. It is NOT advised that you use anything above 30000 for online gameplay.

Q. Why is the maximum value of cl_cmd/updaterate 100?
A. This is because of the server tickrate and how it will never exceed 100. You can't send/recieve more updates than the current servers tickrate!

Q. Why should I run higher rates in the first place?
A. So your shots are MUCH more accurate, instead of having to spray bullets to hit someone. Using less bullets is always a good thing!

Q. Why should I keep the value of cl_cmd/updaterate the same?
A. To not disadvantage yourself in any way. At most, try to keep them within 10 of each other. (IE: cl_cmdrate 45 & cl_updaterate 55)

Q. Why does my ping stay nice and low when I'm using lower rates?
A. This is because of the size of the 'packets' you're trying to send, are smaller than what they'd be if you had higher rates. While lower is better, don't sacrifice ANY of your hit registration to get a low ping.

Q. What is this 'hit registration' that you speak of?
A. When you aim directly at your enemy and shoot, good hit registration means your 'hits' (Bullets, etc) actually make contact and count with the other player you're shooting at. Better hit registration means you can be much more accurate and use less bullets to kill the other player.

Q. I see people using a high rate, but low cmd/updaterates or vica versa. Should I do the same?
A. No. These people are absolutely misguided on which rates they should use. You generally want to go by the following:
  • rate 30000, cl_cmdrate 100, cl_updaterate 100 for maximum of rate 30000.
  • rate 30000, cl_cmdrate 66, cl_updaterate 66 for minimum of rate 30000.
  • rate 20000, cl_cmdrate 66, cl_updaterate 66 for maximum of rate 20000.
  • rate 20000, cl_cmdrate 50, cl_updaterate 50 for minimum of rate 20000.
  • rate 15000, cl_cmdrate 50, cl_updaterate 50 for maximum of rate 15000.
  • rate 15000, cl_cmdrate 35, cl_updaterate 35 for minimum of rate 15000.
  • rate 7500, cl_cmdrate 35, cl_updaterate 35 if your rate is set to 7500 or below.
Q. Many people speak about cl_interp and how it should be at 0.01, should I use this?
A. ABSOLUTELY NOT. You should set your cl_interp_ratio to 1, so you can get an accurate interp value based off your rates (Final value works out to be your cl_interp_ratio value divided by your cl_updaterate to make the final value). Many people think that you should use 0.01, although this would only disadvantage yourself unless you had a latency under 10 to the server on the net graph, was able to send & recieve 100 updates a second and if the server tickrate was at 100.

Q. What's my true ping? The scoreboard and net_graph contradict each other!
A. Ping is a one way trip from your computer to the game server, this is displayed on the scoreboard. Lowering your rates means you're sending a smaller packet to the server and hence is lower (Although not good when you actually want to hit and kill an enemy!). Net_graph shows the latency between you and the server - the ping from you being sent to the server, the server recieving this and sending a ping back to you. The entire time for this 'trip' is then displayed in your net graph.

Q. I heard some person state that you should get your cl_cmd/updaterate to match your average FPS, is this true?
A. Not quite. Cl_cmdrate will not send updates any more than your current FPS as you can't send more than one update per single frame. FPS is something that wildly fluxuates though, so set it as you would - based off how high you can go before the net graph starts to show choke/loss.

Q. Elsewhere, I've heard that I should match cl_cmd/updaterate to the same value of what my monitor HZ is (EG: 60/75/85/100), should I?
A. No. While your monitor might not display the updates when the FPS are higher than the monitor HZ, the game won't know the difference. Any legitimate advantage is a good advantage, no matter how small it may be!

Q. What the hell is tickrate?
A. Fail!! Read the guide again word for word before asking this again!

Q. I'm on IDSN/56k and this guide still doesn't help me!
A. The Source Engine wasn't really designed with IDSN/56k in mind, so don't play the game at all until you can get a better connection.

Q. Someone else is warping around while playing, what are they doing and what should I do?
A. They are intentionally using very low rates or their ping is very high (200+). If their ping is low and they're warping around, spread the word about this guide and help them fix their rates. Generally, saying that they should use 'rate 20000 cl_cmdrate 66 cl_updaterate 66' will be adequate enough - even though their changes won't stick after they restart the game, so it's honestly a lost cause to not direct them to this guide.

Q. This guide has helped a lot, thanks! What can I do to help?
A. Spread the word about this guide and raise awareness on people using low and/or default rates.

Default rates are the following:
  • 56K modem - rate 3500 cl_cmdrate 30 cl_updrate 20
  • DSL>256K - rate 7500 cl_cmdrate 30 cl_updrate 20
  • DSL>768K - rate 9999 cl_cmdrate 30 cl_updrate 20
  • DSL/Cable>2M - rate 20000 cl_cmdrate 30 cl_updrate 20
  • Cable/Fibre>10M- rate 30000 cl_cmdrate 30 cl_updrate 20