Killing Floor Dedicated Server Optimization - KillingFloor.ini Settings A practical Killing Floor Dedicated Server optimization guide covering cache, tickrate, network limits, HTTP redirect, precache, and stable server operation.
#1
Posted:
Killing Floor Dedicated Server Optimization
Killing Floor Dedicated Server performance usually comes from stable networking, a clean KillingFloor.ini, fast redirect hosting for custom files, and a sensible tickrate. This guide turns the rough config notes into a practical KF1 server baseline and explains which values are worth changing first.
Before editing, stop the server and make a backup of
System/KillingFloor.ini. Change one group of settings at a time and test after each group.
Quick baseline
| Area | Safe starting point | Change it when |
|---|---|---|
CacheSizeMegs | 128 or 256 | You run many custom maps, mutators, or slow map changes |
NetServerMaxTickRate | 25 or 30 | CPU headroom and ping are both stable |
MaxInternetClientRate | 10000 or 15000 | Players need more per-client bandwidth |
| HTTP redirect | Enabled | Players download maps from the game server |
| Precache | Keep default first | You have repeatable freezes or long loading stalls |
For a public internet server, stable 25-30 tickrate is usually better than a higher tickrate that causes packet loss or late-wave stutters.
1. Cache and memory
In KillingFloor.ini, find [Engine.GameEngine]. For a dedicated server with 1 GB RAM or more, CacheSizeMegs=256 is a reasonable starting point:
[Engine.GameEngine]
CacheSizeMegs=256
Practical table:
| Server RAM | Value |
|---|---|
| 256 MB or less | CacheSizeMegs=32 |
| 512 MB | CacheSizeMegs=64 |
| 768 MB | CacheSizeMegs=128 |
| 1 GB or more | CacheSizeMegs=256 |
Do not set a huge value just because the machine has spare RAM. With old UE2.5 servers, predictable behavior matters more than aggressive caching.
2. Network limits and tickrate
Main block for an internet server:
[IpDrv.TcpNetDriver]
MaxClientRate=15000
MaxInternetClientRate=10000
NetServerMaxTickRate=30
LanServerMaxTickRate=35
ServerTravelPause=4.0
SpawnPrioritySeconds=1.0
RelevantTimeout=5.0
KeepAliveTime=0.2
InitialConnectTimeout=200.0
ConnectionTimeout=15.0
AckTimeout=1.0
DownloadManagers=IpDrv.HTTPDownload
AllowDownloads=True
What matters
NetServerMaxTickRate=30- server update rate. For public servers,25-30is usually enough.LanServerMaxTickRate=35- can be higher for LAN or private low-ping servers.MaxClientRateandMaxInternetClientRate- upper bandwidth limit per player.AllowDownloads=True- needed for custom files, but large maps should not be served directly by the game process.
If the server starts lagging during heavy waves, try lowering tickrate to 25 before cutting every bandwidth value.
3. HTTP redirect for maps and mutators
When players download custom maps from the game server itself, downloads consume bandwidth that should be serving active players. A production server should use HTTP redirect hosting.
[IpDrv.HTTPDownload]
RedirectToURL=https://example.com/kf-redirect/
UseCompression=True
Checklist:
- Redirect files must match the server files.
- Names and extensions must be exactly what the client expects.
- After updating a map or mutator, update redirect hosting at the same time.
- If players get
Package version mismatch, check redirect files and client cache first.
Related fix: Package version mismatch.
4. Precache: keep it or disable it?
Disabling precache across several subsystems can make startup or map travel faster, but it can also move the stutter to the first spawn of a weapon, zed, or effect.
Test variant:
[ALAudio.ALAudioSubsystem]
UsePrecache=False
[Engine.LevelInfo]
bNeverPrecache=True
[Engine.NullRenderDevice]
UsePrecaching=False
[D3DDrv.D3DRenderDevice]
UsePrecaching=False
[D3D9Drv.D3D9RenderDevice]
UsePrecaching=False
[OpenGLDrv.OpenGLRenderDevice]
UsePrecaching=False
[PixoDrv.PixoRenderDevice]
UsePrecaching=False
For a dedicated server, stability matters most. If disabling precache creates micro-stutters at the start of waves or first content use, restore the previous values.
5. Corpses, gibs, and extra physics
For KF1, do not copy [KFGame.KFGoreManager] blocks from KF2 guides. In Killing Floor 1, look for settings that actually exist in your KillingFloor.ini and your active mutators.
If your config has [KFMod.KFGameType], you can carefully reduce corpse lifetime:
[KFMod.KFGameType]
TimeUntilVanished=5.0
Very low values can look strange to players, but they can help weaker servers during large late waves and custom maps.
6. Uplink, query, and server visibility
Make sure query is enabled and the server is not hidden by NAT or broadcast settings:
[IpServer.UdpServerQuery]
bEnabled=True
[IpDrv.MasterServerUplink]
DoUplink=True
SendStats=True
ServerBehindNAT=False
DoLANBroadcast=True
If the server is behind NAT, ServerBehindNAT depends on your network setup. The critical part is opening the correct game/query ports and testing visibility from outside your LAN.
7. Paths and basic integrity
[Core.System] is not a magic performance block, but it is useful when checking a moved or copied server install:
[Core.System]
CachePath=..\Cache
CacheExt=.uxx
Paths=..\System\*.u
Paths=..\Maps\*.rom
Paths=..\StaticMeshes\*.usx
SavePath=..\Save
Do not remove Paths for optimization. If the server stops seeing maps, mutators, or packages, check this block first.
8. Logs and operations
Do not disable useful logs completely. Use a separate log file per instance and clean old files on a schedule.
Good practice for multiple servers on one machine:
- separate folder or separate config per instance
- different game/query ports
- separate log files
- scheduled cleanup for old logs and temp files
- monitor CPU during late waves, not only on an empty server
UE2.5 has limited multi-core scaling. If one process hits CPU limits, it is often better to split servers across instances/cores than to chase one magic config value.
Minimal production profile
For a normal public KF1 server, start with this:
[Engine.GameEngine]
CacheSizeMegs=256
[IpDrv.TcpNetDriver]
MaxClientRate=15000
MaxInternetClientRate=10000
NetServerMaxTickRate=30
LanServerMaxTickRate=35
ServerTravelPause=4.0
SpawnPrioritySeconds=1.0
RelevantTimeout=5.0
KeepAliveTime=0.2
InitialConnectTimeout=200.0
ConnectionTimeout=15.0
AckTimeout=1.0
DownloadManagers=IpDrv.HTTPDownload
AllowDownloads=True
[IpServer.UdpServerQuery]
bEnabled=True
[IpDrv.MasterServerUplink]
DoUplink=True
SendStats=True
ServerBehindNAT=False
DoLANBroadcast=True
After that, configure HTTP redirect, test late waves with 6 players, and only then experiment with precache, corpse lifetime, and higher tickrate.