Killing Floor Dedicated Server Optimization - KillingFloor.ini Settings

Killing Floor Dedicated Server Optimization - KillingFloor.ini Settings

  • Topic closed
  • You cannot reply to this topic

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.

Geekrainian #1

    • Group: Admin
    • Posts: 974

    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

    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

    • NetServerMaxTickRate=30 - server update rate. For public servers, 25-30 is usually enough.
    • LanServerMaxTickRate=35 - can be higher for LAN or private low-ping servers.
    • MaxClientRate and MaxInternetClientRate - 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:

    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:

    • 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.

    Back