Skip to main content
← All Guides
Performance · 5 min read

How to Reduce Player Join Lag

Fix the lag spike that hits your Minecraft server every time a player joins. Covers chunk loading, login event plugins, data loading, and async solutions to reduce player join lag minecraft.

Why Joining Causes Lag

Every time a player connects to your Minecraft server, a cascade of operations fires on the main thread: the server loads the player's data file, resolves their permissions, checks bans, loads the chunks around their spawn point, sends those chunks to the client, fires plugin login and join events, and runs any join commands. On a well-optimized server with 10 players, this takes milliseconds. On a busy server with 50 plugins, a single player join can freeze the tick loop for 200ms or more. If you want to reduce player join lag minecraft experiences, you need to understand which of these steps are blocking the main thread and either offload them or speed them up.

Diagnosing the Bottleneck

Before you start changing settings, profile the join process. Install Spark, start a profiler with /spark profiler, have a player join, wait 30 seconds, then stop the profiler. In the resulting flame graph, search for PlayerLoginEvent and PlayerJoinEvent. The methods nested under those events reveal exactly which plugins are eating time during the join sequence.

Common offenders we see on production servers:

  • Permission plugins that run synchronous database lookups on join.
  • Economy plugins that load player balances from MySQL on the main thread.
  • Scoreboard and TAB plugins that recalculate every player's display on each join.
  • World guard region checks that iterate large region databases.
  • Essentials loading warps, homes, and mail synchronously.

Chunk Loading on Join

When a player joins, the server must send them enough chunks to render the world. The number of chunks depends on your view distance setting. A view distance of 10 means the server loads a 21x21 area of chunks (441 chunks) around the player. Reducing view distance to 7 cuts this to 225 chunks, nearly halving the work. Paper's send-distance in spigot.yml lets you decouple the client's rendered view distance from the server's simulation distance, which is an effective way to reduce player join lag minecraft suffers from without making the world feel small.

Paper also supports async chunk loading, which means chunk generation and loading can happen off the main thread. Make sure you are running a recent Paper build where this is enabled by default. If players spawn into a pre-generated world (lobby, spawn area), the chunks are already in memory and this step is instant. For survival spawns, consider pre-generating a radius around spawn using Chunky. See our chunk loading guide for the full setup.

Plugin-Side Fixes

The biggest wins to reduce player join lag minecraft players feel come from fixing plugin behavior:

  • LuckPerms: Already async by default, but verify you are using the latest build. Older builds had synchronous fallback paths.
  • EssentialsX: Configure the storage backend carefully. Flat-file (YAML) is fast for small servers. For larger servers, use the built-in SQLite or MySQL backend and verify that async-world-teleportation is enabled in the EssentialsX config.
  • Vault: If your economy plugin's Vault hook runs synchronous DB queries, switch to a plugin that loads balances asynchronously (such as Treasury-compatible plugins).
  • TAB plugin: Set update-interval in TAB's config to 1000ms or higher. Updating the tablist for every player every 200ms is wasteful, especially on join when all entries recalculate.
  • Join commands: If you run commands on join (titles, messages, sounds), make sure they fire with a short delay (runTaskLater with 10-20 ticks) so they do not stack on the join tick.

Server-Side Settings

Several Paper and Spigot config options directly affect join performance:

# paper-world-defaults.yml
chunks:
  max-auto-save-chunks-per-tick: 8   # lower = less save pressure on join
  prevent-moving-into-unloaded-chunks: true

# spigot.yml
world-settings:
  default:
    view-distance: 7
    simulation-distance: 5

Also check paper-global.yml for incoming-packet-threshold. If set too low, legitimate players with slow connections get kicked during the join handshake, which looks like lag from their perspective. The default of 300 is reasonable for most setups.

Pre-generating Spawn Chunks

The single most effective way to eliminate join lag in survival servers is pre-generating the area around spawn. Install the Chunky plugin, then run:

/chunky radius 500
/chunky start

This generates all chunks within 500 blocks of spawn. Once generated, these chunks load from disk (or NVMe cache) instead of being computed, which is orders of magnitude faster. For spawn areas with heavy redstone or many entities, also run /paper fixlight in the area to prevent light recalculation lag on join.

Connection Throttling

If multiple players join simultaneously (after a restart, for example), the join lag multiplies. Paper's connection-throttle in server.properties spaces out connections by a configurable number of milliseconds. A value of 4000 (4 seconds) prevents two players from joining within the same tick window. This does not reduce per-player join time, but it prevents the spikes from stacking.

For a full server optimization walkthrough that covers join lag alongside other performance topics, see our 20 TPS guide.

See an optimized server in action: Astroworld MC, IP play.astroworldmc.com, Java + Bedrock.

Related Tools & Resources

🔧

Minecraft Tools

Calculators, generators & server tools

🧱

Item Database

Browse all Minecraft items, stats & recipes

⚒️

Crafting Recipes

Visual crafting guides for every recipe