Christmas Patriarch

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

AreaSafe starting pointChange it when
CacheSizeMegs128 or 256You run many custom maps, mutators, or slow map changes
NetServerMaxTickRate25 or 30CPU headroom and ping are both stable
MaxInternetClientRate10000 or 15000Players need more per-client bandwidth
HTTP redirectEnabledPlayers download maps from the game server
PrecacheKeep default firstYou 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 RAMValue
256 MB or lessCacheSizeMegs=32
512 MBCacheSizeMegs=64
768 MBCacheSizeMegs=128
1 GB or moreCacheSizeMegs=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

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:

  1. Redirect files must match the server files.
  2. Names and extensions must be exactly what the client expects.
  3. After updating a map or mutator, update redirect hosting at the same time.
  4. 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.

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:

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.