Paper Chan’s Little Guide to Minecraft Server Optimization!

This guide is totally not an excuse to expose more people to paper chan


Introduction / Background

Hello there! Welcome to the not-very-formal Paper optimization guide by EterNity. Hosting a server is no easy feat, conflicting information and sometimes outright incorrect guidance are being shared all over internet; as a result, I’ve decided to write up this guide to help clarify some misconceptions and to correct common mistakes made by many server admins and other optimization guides. I am in no means an expert on this topic, please help me correct my mistakes if you do find any.


Last updated: December 4, 2021 for Paper Version 1.17.1 Build #391

This Guide will be fully updated for 1.18 in the coming days; however, most options still apply to the new version.

There are many patches that are still work-in-progress and I want to ensure the information here is up-to-date and complete. Thank you for your patience and check back later!!!

If you are currently using experimental builds because you like to live life on the edge, most of the contents in this guide still applies; however, certain terms has changed when Mojang updates to 1.18, please refer to the graph on the right for the new terms when you encounter them.


Table of Contents


Let’s begin!

Prerequisites

Tools and Software for Windows Users

NotePad++ Notepad but better.
WinSCP SFTP client for file transfer.
Replace Tab with Space in NotePad++: Setting > Preference > Language > Replace by Space
Force Binary Mode in WinSCP: Options > Preference > Transfer > Binary

Getting Started

First time hosting on Windows and the above instructions is overwhelming?
Check out Paper Chan’s Little Guide to self-host a Minecraft Server


Configurations & Optimizations

Before we start…

There are no singular value that will work for every server. You should read and understand each available config option and tweak the numbers accordingly to fit your own unique circumstances. The optimal config for your server will vary based on server hardware, average player count and the type of game mode running. Any number shown below is served as an example, please test and experiment then come up with your own set of numbers.

As your world ages and players progress into late game, the workload on the server would gradually increase over time so server optimizing is not an one-off task but a continuous effort.

With Modern Minecraft version, running on default (Vanilla) setting requires decent hardware and it may not be feasible for some small to medium size servers where server resource is very limited. Aside from picking a reputable host and the right hardware, optimizing the configurations and making compromise to Vanilla gameplay becomes essential. Carefully read through the config options provided below and you will ensure a smooth operation!

Pre-generate Your Map

Generating new chunks consumes a considerable amount of resources and it is recommended to pre-generate your map if you are launching a new map/server.

If you do not plan to set a world border, it is still a good idea to pre-generate 5~10k from your spawn as it will help ease the launch day stress on your server. Not to mention, it will catch any potential uncaught bugs on generation ahead of the actual launch day.

  • Grab Chunky and ChunkyBorder by pop4959
    • Chunky is the simplest pre-gen plugin and combined with ChunkyBorder, you can customize the border shapes to your liking.
    • Please be reasonable when picking a border, the file size will grow exponentially the further you set the border and this may cause issues with storage and backup later on.

Picking the right View Distance

View Distance determines how many chunks are visible and how much environment is active around the player.

View Distance has a huge impact on the performance so having a lower value will help maintain the lag-free environment. The default value for Vanilla Minecraft is 10 and most of the farm designs on Youtube are made based off this value. Lower this value will impact those farms which we will go over later. Personally I wouldn’t go lower than 5 so the gameplay experience is somewhat pleasant; however, if you are doing Mini games or Skyblocks, you can go much lower.

  • Utilize no-tick-view-distance in paper.yml to keep a pleasant terrain view for your players in case you decide to lower View Distance.

Keeping Entity Count Under Control

Entities are resource-intensive in Modern Minecraft version, even the top-of-the-line CPU in the current market would still be brought down to its knee if you do not keep the entity under control.

  • Ideally, you want to maintain your overall entity ticks to be below 30%
    (Assuming a reasonable amount of player activities is present and not just an empty server)
  • Timings is a great tool to find the source of lags and to compare the result of optimizations.

Be Aware of the Impacts of your Alteration

With each alteration come with compromise! Most of your players are just copying popular farm designs block by block without knowing how it actually works so it is important as a server owner to understand the impact of your alteration so you can explain to the player better. In the following walk through, I will attempt to explain the impact of each change and how to combat the compromise.


Understand Mob Spawn Mechanics

Below is a demonstration on how mob spawning works around a player. The graph and indicated value is made based on vanilla/paper default.

Graphic design by Niome#7667
inspired by Radiant#6666
View Distance:10 (chunks)
Mob Spawn Range: 8 (chunks)
Despawn range (soft): 32 (blocks)
Despawn Range (hard): 128 (blocks)
entity activation range: 32 (blocks)
- The brown cylinders indicates the mob spawn range
- The red sphere indicates the mob spawning zone (inbetween 24 - 128 blocks)
- The yellow sphere indicates the mob free zone as no mob will spawn that close to a player (24 blocks) 
- Any entity falls under 32 blocks ring (entity activation range) will be ticked at normal rate.
- Any entity resides in-between 32 - 128 blocks rings will be ticked at a reduced rate.
- Any entity falls outside of 128th block is instantly despawned.

Any alteration to the settings above requires you to adjust the farm’s overall size and the its designated afk spot accordingly.

The 5 abovementioned config options are closely related to each other and it is crucial to ensure each value is setup correctly.

  • View Distance determines the maximum possible size of a farm.
    • A farm cannot excess the radius of (View Distance-1)x16 blocks.
    • Everything outside of view distance won’t tick so any farm bigger than this wont be functional.
  • Mob Spawn Range determines the maximum size of collection platform of a farm.
    • Mob Spawn Range should be between (View Distance -1) and 3 minimum.
    • Every mob farm design has a dedicated mob collection platform, the size of the platform is solely decided by this value (in chunks)
  • Despawn Range (hard) or hard despawn-range is the furthest away a mob can exist without it instantly despawns.
    • The value of hard despawn-range determines the ideal afk spot of the farm.
      • This value is 128 (blocks) for vanilla default.
        (Most farm design would set the designated afk spot to be just slightly within this value)
      • Decrease this value below vanilla default means that the afk spots on mob farms would also need to be adjusted within the new hard despawn-range as the range limit applies both horizontally and vertically.
        (Additional important notes is located on later section…)
    • The hard despawn-range should always be equal to your (mob-spawn-range)x16 blocks and never lower.
      (This prevent the server from doing extra work of spawning a mob only to have it depsawns instantly because it falls outside of hard despawn range)
  • entity-activation-range should be the last option to alter as it has major behavioral impact on the gameplay.

When troubleshooting why a farm is not working, be sure to go through every configs mentioned above and make the necessary adjustments to the design of your farm accordingly. Do not copy and paste from YouTube tutorials block by block without ever taking these config into account.

Mob spawning mechanic is overly complicated in Minecraft, do consult the official wiki page for more details.
Check out [Paper Chan’s Little Guide to fix your Nether farm] for a sample walkthrough on troubleshooting steps.

  • Utilize /paper mobcaps and /paper playermobcaps for additional details on mob spawning around a player. It is especially useful for finding errors on the spawnproofing. For more details on this feature click me.

server.properties

Essential configurations for server.properties

view-distance=10

This sets the view distance of the server unless stat otherwise in spigot.yml

Refers to Picking the right View Distance above for more info

Alter this setting has a fundamental impact on all aspect of mob farm designs

  • Ever wonder where the 128 block measurement come from when a farm tutorial instruct you to make your afk spot at that exact spot? It comes from the default view distance and the hard-despawn range of 128 in vanilla. With a view distance of 10, and the 9th chunk being the bordering chunk. the furthest block where a mob can exist is 128 blocks away from the player. Most farm utilize this information to concentrate the mob onto the designated collection platforms.
  • If you do decide to lower your view distance,…
    Please refer to How Mob Spawn Works to ensure all other configs are adjusted accordingly.
  • Additionally, you are given the ability to specify view distance for each world in spigot.yml.
    We will go over this on per-world config section later.

allow-flight=true

This prevent the players from getting kicked by the server for “flying” while riding a horse or claiming on scaffolding. Having this option as true doesn’t mean everyone can fly, it just means that players would not get kicked if the server think they are flying.


bukkit.yml

Essential configurations for bukkit.yml

spawn-limits:
  monsters: 70
  animals: 10
  water-animals: 5
  water-ambient: 20
  water-underground-creature: 5
  ambient: 15

This section determines the mob cap in your server. Lower the value on monster has the most direct impact on server performance as entity is one of the most resource intensive task the server has to tackle.

Changing mob-spawn-range requires you to look over other related config.
Refer to Understand Mob Spawn section for more details.

  • A small trick on finding the optimal numberJust halves the default number and see!
    • If you are new and have no idea what is a good starting value, try halves the limit from the default and see.
    • Analyze your timing report during the peak hour of your server and adjust the number accordingly.
      (Server running nicely with much to spare? Increase the number and see! Still too much, halves the number again!)

Additionally, to help maintain the Perceived mob density consistent with vanilla default, please also alter the mob-spawn-range in spigot.yml accordingly to achieve this.

Below is the actual calculation on how the number is calculated. Keep it in mind that this assume ideal spawning conditions aka all blocks are spawnable blocks. A table of preset value is also included below for your convenience.

For example, if I want to set my monster cap to 45 and also keeping the mob density roughly the same as before, I would solve the math equation below

(Default mob Cap) : (Default Spawn Area) = (New Mob Cap) : (New Spawn Area)

where the constants are as followed,
 
Default Mob Spawn Range = 8 chunks
Minimum distance where a mob can spawn = 24 blocks away from a player

Default Spawn Area = [ (Mob Spawn Range x2 x16) +1]^2 - ( 24 x2 +1 )^2 = (8x2x16+1)^2 - 49^2 = 66049 - 2401 = 63648

70:63648 = 45:b ; where b = New Spawn Area (in blocks)

63648 x 45 = 70b

b= 40916

Let a = New Mob Spawn Range, where b = [ (a x16 x2) +1]^2 - (24 x2 +1)^2, and b = 40916

(32a +1)^2 - 2401 = 40916

(32a +1)^2 = 43317

32a +1 = 208

32a = 207

a = 6.46


I will then set mob-spawn-range to 6 (or 7) in Spigot.yml

Here is a cheat sheet with prefilled suggestions for those who are too lazy to workout the math or failed high school algebra, please read carefully and apply the config accordingly.

Overall Entity Count (%)
(against vanilla)
Suggested
spawn-limit (monster)
in bukkit.yml
Suggested
mob-spawn-range
in spigot.yml
Actual Calculated
Number
100% (vanilla)70 (default)8 (default)8 (default)
90%637 or 87.60
80%5677.18
70%496 or 76.74
60%4266.26
50%355 or 65.75
40%2855.18
30%214 or 54.55
20%1443.81
10%732.89
3%2Please upgrade your server hardwareMy Samsung smart fridge in the kitchen can handle more entities

The suggested number above is for the purpose of keeping the mob density consistent with vanilla, feel free to make up your own number that works for your server. Please do go over understand mob spawn section to validate other configs again as needed.

  • As long as mobs are instantly killed, without accounting mob gathering time, the yield of the farm should be roughly the same as vanilla Minecraft given the farm design is adjusted accordingly.
  • Please note that currently in 1.17, Iron Golem, Guardian are not limited by this config. A plugin is required to properly limit them.

Every mob in game falls under 1 of the 6 categories below aside from the two above mentioned Iron Golems and Guardians.

  • monster category is consisted of blaze, cave spider, creeper, drowned, elder guardian, ender dragon, enderman, endermite, evoker, ghast, giant, guardian, hoglin, husk, illusioner, magma cube, phantom, piglin, piglin brute, pillager, ravanger, shulker, silverfish, skeleton, slime, spider, stray, fex, vindicator, witch, wither, wither skeleton, zoglin, zombie, zombie villager, zombified piglin.
  • animals or creature category is consisted of bee, cat, chicken, cow, donkey, fox, goat, horse, llama, mule, mooshroom, ocelot, panda, parrot, pig, polar bear, rabbit, sheep, skeleton horse, strider, trader llama, turtle, wandering trader, wolf, zombie horse.
  • ambient category is consisted of bat. Bat is useless.
  • water-animals or water_creature category is consisted of squid and dolphins.
  • water-ambient category is consisted of cod, pufferfish, salmon, tropical fish.
  • water-underground-creature or underground_water_creature category is consisted of Axolotl and Glow Squid.

    Some categories have two different name listed due to paper using the proper names in the paper.yml while bukkit.yml still uses the old names.

    Each entity will show up individually on the timings report, you can make necessary adjustments accordingly based on their categories above

ticks-per:
  animal-spawns: 400
  monster-spawns: 1
  water-spawns: 1
  water-ambient-spawns: 1
  water-underground-creature-spawns: 1
  ambient-spawns: 1
  autosave: 6000

This section determines the frequency of each category of entities make an attempt to spawn (value in ticks).

Minecraft will always attempt to spawn entities until it hits the spawn-limits on previous section. Altering the number here does not make sense performance-wise due to the fact that the mob cap will almost always be reached. All you are doing is just delaying the impending doom, please establish a proper entity cap on the spawn-limits mentioned previously instead.

  • Calculating and validating mobspawn costs resources and it is always a better idea to reduce the overall cap on spawn-limits instead of prolonging the process of reaching it with ticks-per config here. Please utilize /paper mobcaps and /paper playermobcaps to monitor and ensure the mob cap is always being reached and in a timely matter.
    • For Skyblock / Oneblock gamemode, this is especially crucial as the server tend to not able to reach the mob cap due to the limited spawnable area (which means the server is constantly making attempts to spawn more mobs). Please adjust the configs accordingly to address this issue.

spigot.yml

Essential configurations for spigot.yml

mob-spawn-range: 8

As mentioned above on bukkit.yml section, this value can be altered to kept the perceived mob density the same.

  • This value should always be set to a maximum of (View Distance - 1) with a minimum of 3 as any entity fall outside of the view distance and the bordering chunk wont be ticked anyway.
    • For example, if you have a view distance of 6, your mob spawn range can be set between 3~5.
  • Refer to How Mob Spawn Works section to read full details.

nerf-spawner-mobs: false

This setting removes the AI from mobs spawn from the spawner in game, if your server allows the player to relocate the spawners, setting this option to true can reduce the lag.

  • Please toggle spawner-nerfed-mobs-should-jump to true in paper.yml if you do decide to enable this. It will allow mob to jump so certain farms will remind functional.
  • Please read the Things to Avoid section for why Silktouch spawner is not a great idea.

max-entity-collisions: 8

The value is the maximum amount of entities should be included in collision lookup. The server will stop processing any additional entity collision after this threshold.

  • Lower this value will help with performance as the animal AI goes haywire trying to path-find away from each other in a small confined space.
  • Do not set the value lower than 3 as it will have game-breaking effects on things that rely on collisions in order to work properly.
  • This is not to be confused with gamerule maxEntityCramming.
    • The cramming gamerule set the maximum amount of entities that can be crammed together before they start taking suffocation damage.
    • To lower this value, use /gamerule maxEntityCramming [number] (default is 24)
    • This gamerule has a direct impact on one block animal farm as the maximum number of animals that can be held inside a block space is determined by this value.

    entity-tracking-range:
      players: 48
      animals: 48
      monsters: 48
      misc: 32
      other: 64

This determines how far away in blocks that an entity shell be sent to the client in order for player to see them.

  • Those value should always be set to a maximum of (View Distance – 1)x16 (and no lower than 16 if you are running extremely low View Distance on your server).
  • If you are experiencing invisible Ghast Ambush, it may be a symptom of your tracking range is set too low.
    • Additionally, check client side setting Options > Video Settings > Entity Distance and make sure it is set high enough to show the Ghast.

entity-activation-range:
      animals: 32
      monsters: 32
      raiders: 48
      misc: 16
      water: 16
      villagers: 32
      flying-monsters: 32
      villagers-work-immunity-after: 100
      villagers-work-immunity-for: 20
      villagers-active-for-panic: true
      tick-inactive-villagers: true
      wake-up-inactive:
        animals-max-per-tick: 4
        animals-every: 1200
        animals-for: 100
        monsters-max-per-tick: 8
        monsters-every: 400
        monsters-for: 100
        villagers-max-per-tick: 4
        villagers-every: 600
        villagers-for: 100
        flying-monsters-max-per-tick: 8
        flying-monsters-every: 200
        flying-monsters-for: 100

entity-activation-range determines how far away (in blocks) an entity should be activated.

Any entity fall outside of this zone will be ticked at a reduced frequency.

  • Those value should always be set to a maximum of (View Distance – 1)x16 and no lower than 16 if you are running extremely low View Distance on your server.
  • Alter activation range will impact all aspect of gameplay so tread carefully.
    • A value of -1 will disable this behavior and restore the behavior to vanilla; however, this is a huge performance hit to your server. Do so at your own risk and only when obsoletely necessary.
  • Reducing entity activation range is last resort
    • You should lower the overall entity count & view distance first. Only alter this config if both are proven insufficient to improve performance.
  • tick-inactive-villager could be changed to false if you do not wish to tick all villagers that are loaded but outside of activation range. (In other word, only villagers that are within the activation range will be active.
    • However, doing so many reduce the yield of Iron Golem farms if a player is not in the close proximity.
    • The villager trade cooldown timer will not go down if no player is close by.
  • If you are experiencing inconstancies with Minecart transfer rates while not on a rail, please change the misc to -1 to remedy the issue. EAR may imposes a negative effect and breaks redstone contraption in this use case.

    (click to enlarge)

work immunity and wake up inactive is paper’s way to bring more life to the world by allowing certain entity to “wake up” and do some work for a set amount of time. It allows villager to restock, find work etc…

To elaborate a bit more, we will use this snippet of wake-up-inactive as an example to help you get a better understanding of the mechanic.

      wake-up-inactive:
        animals-max-per-tick: 4
        animals-every: 1200
        animals-for: 100

The above setting translates into the following behaviors…

For every 1200 game tick, there is a chance of up to 4 randomly selected loaded animal to wakes up for 100 ticks where they are able to do stuffs and be immune from the freezing effect of being too far away from players.


paper.yml

Essential configurations for paper.yml

no-tick-view-distance: -1

Paper offers no-tick-view-distance where chunk terrains is shown to the players with no entity ticking within the region.

  • Picking a suitable combination of no-tick-view-distance & view distance is extremely important
  • no-tick-view-distance enables the player to see chunk terrains without ticking the entity within, it is a huge cost saving measures while “preserving the view” for the players.
    • For resource-saving example, you can set the no-tick-view-distance to 10 while having the view-distance at 7. Most player will never notice any difference.
    • For an enhanced player experience, if you would like to have a ticking Distance of 10 (default) plus 2 chunk worth of additional terrain view, you will set your view-distance to 10 and no-tick-view-distance to 12.
      (Please note that with each additional increase after 10, the total amount of loaded chunks around a player will increase exponentially)
    • Moreover, you can enforce different no-tick-view-distance value per world, by creating separate sections under world-settings in paper.yml and define the no-tick view distance for each world accordingly.
      • For example, you can opt for a higher no-tick view-distance in the_end which would make navigating through the void with Elytra a much more pleasant experience for your player.
  • The formula to calculate the total chunk loaded by a single player is [(VD+2)x2+1]^2 where VD = no-tick-view-distance (or view-distance if no-tick is not utilized)
    • For VD=10, a singular player will load 625 chunks.
    • For VD=5, a singular player will load 225 chunks.
    • For VD=15, a singular player will load 1225 chunks.
  • Although no-tick-view-distance use significant less resources compare to view-distance, please still be mindful on its performance impact especially on large server where every bit of resource saving helps.
  • On the other hand if you have a small server, you can experiment with a higher no-tick-view-distance to give a more enjoyable view to your players since Paper now also respects client-side view-distance choice (after Tuinity merge) and will not send unnecessary chunks if it is higher than client config value.

    despawn-ranges:
      monster:
        soft: 32
        hard: 128
      creature:
        soft: 32
        hard: 128
      ambient:
        soft: 32
        hard: 128
      underground_water_creature:
        soft: 32
        hard: 128
      water_creature:
        soft: 32
        hard: 128
      water_ambient:
        soft: 32
        hard: 64
      misc:
        soft: 32
        hard: 128

This Value decide how far a way an mob should have a chance to despawn (soft) or instantly despawn (hard).

It is divided into 7 categories to provide finer control options over all types of entity despawning.

  • Please refer to previous section for bukkit.yml on mob-limits to see what each entity falls under what category.
  • If you kept your view distance as default, lowing the hard value will increase the Perceived mob density with a cost of extra depsawn/spawn action on the server. (see note below)

If your View Distance is set below 10…

  • The value of hard despawn-range should be (View Distance -1)x16 blocks.
    • This ensures all entities have a chance to despawn before hitting the bordering chunk thus preserving natural mob density.
      • Altering this config will impact the default afk spot on farms as the range limit is enforced both horizontally and vertically. Adjust farm design accordingly.
    • If you do choice to run the default value of 128 to keep the ideal afk spot persistence against vanilla while running a lower view distance and/or mob-spawn-range, you will experience odd mob density, extremely uneven mob spawning, and/or excessive amount of mobs over spawn-limits.
      • To help virtualize the side effect of keeping the hard despawn-range higher than ticking view-distance, please read the following scenario…

        A player named BumbleTree is just chilling in his Minecraft base. He has made a simple mob grinder by his bed because he enjoys sleeping with the sound of zombie growling so he usually keeps a few dozen of them alive inside the grinder until he needs the experience.

        On a Saturday night, BumbleTree decides to visit his Minecraft girlfriend Naomi so he leaves his base by foot. As he moves away from his base, all the zombies inside his grinder is unloaded with the chunk. While he is away, a player named Jerry happens to travel by his base and decided to steal some wheats from the chest. Jerry also noticed something weird! It’s night time but there is hardly any mob spawning around him!?

        This is because the mobcap is already reached with the zombies still inside the grinder. The zombies were never given a chance to properly desapwn so when a new player visit the area and loaded the chunk, no new mob will spawn due to the fact that mobcap is already saturated thus creates an illusion that no mob is actually spawning. This is why it is crucial to ensure the hard despawn-range is inline with the suggested value above. It ensure all mobs are being despawned and redistributed properly.

        Now that you understand the role of hard despawn-range. Choose your own poison and choose wisely!
  • The hard despawn-range should also always be equal to your mob-spawn-range in spigot.yml and never lower.
  • Please review Understand MobSpawn section thoughtfully to validate related configs.

per-player-mob-spawns: true

As of Paper 1.17.1 Build 232 (Tuinity Merge Patch), the default has been set to true.

Paper would attempt to spawn mobs more evenly across all players online.
This is beneficial to majority of servers.

  • Please note that this does not affect the overall spawn-limit as defined in bukkit.yml, it only attempts to spawn mobs across all players.
  • On very rare occasions, if “mob switch” is utilized in your server, you should toggle this option to false.

prevent-moving-into-unloaded-chunks: true

Please toggle this option to true.

This prevents players from moving into an unloaded chunk which would otherwise cause a sync-chunk load.

  • When a player moves into an unloaded chunk, the server would make the task of loading the chunk the upmost priority thus tanking the TPS.

use-faster-eigencraft-redstone: true

Please toggle this option to true.
This uses an optimized redstone logic with minimum impact on existing redstone machines


enable-treasure-maps: true
treasure-maps-return-already-discovered: true

Toggle treasure-maps-return-already-discovered to true.
This prevents server from stalling looking up treasures when a player use a map


fix-climbing-bypassing-cramming-rule: true

Toggle fix-climbing-bypassing-cramming-rule to true.

This fix the issue where climbing mob bypass the cramming rules.
Leave it false if you have farm that utilizes this behavior (unlikely).


keep-spawn-loaded: true
keep-spawn-loaded-range: 10

If your world spawn isnt frequently used, you can toggle this option to false

The world spawn will not be loaded thus saving resources.

  • This option can be defined per-world and is a good resource saving measure if you have added additional worlds but not heavily utilized.
  • The range value is in chunks, and the formula for total chunks to be loaded is [((keep-spawn-loaded-range+1)x2)+1]^2 = total spawn chunk loaded.
    • With keep-spawn-loaded-range at 10, [(10+1)x2+1]^2=529, you would constantly have 529 chunks loaded.

    entity-per-chunk-save-limit:
      experience_orb: 50
      snowball: 20
      ender_pearl: 20
      arrow: 20
      fireball: 10
      small_fireball: 10
      dragon_fireball: 5
      egg: 20
      area_effect_cloud: 10
      llama_spit: 5
      shulker_bullet: 8
      spectral_arrow: 5
      potion: 5
      experience_bottle: 5
      trident: 10
      wither_skull: 10

This determines the maximum amount of each specified entity is saved in a chunk.

  • It is especially critical to enforce them plus the additional additions listed above if you are running an extremely low View Distance.
  • The limit is essentials as it prevent the server from stalling when attempting to load a chunk that contains a large amount of those entities.
    (Sometimes projectiles are being fired into unloaded chunk intentionally by player to crash a server or unintentionally by sheer luck. Both of which can be avoided with these limits set in place)

Special thanks for Puremin0rez for the entry correction. Love you <3 08/21/21


    alt-item-despawn-rate:
      enabled: true
      items:
        COBBLESTONE: 600
        COBBLED_DEEPSLATE: 900
        NETHERRACK: 600
        ROTTEN_FLESH: 600
        ENDER_PEARL: 600
        BONE: 600
        CACTUS: 600
        EGG: 600

Enable this option will allow you to despawn commonly dropped items/junk items faster

CACTUS is added on the list in an effort to reduce the impact of the common cactus farm in which many cactus would be left on the surface until they despawn due to the farm design
EGG is also listed here in an effort to prevent zombie from picking them up thus preventing them from desapwning. It is a common issue in survival servers where players may be afk for an extensive period of time and results in groups of zombie all holding commonly dropped items around the player bases.
  • The value is in ticks which means a value of 20 equals to 1 second server time.
  • You can add on more items to the list that suit your needs as every server has their own unique circumstances.
  • Additionally, there is a similar config item-despawn-rate that controls all dropped-item despawn timer in spigot.yml; however, that is a very intrusive change that breaks the 5 minute de-spawn time promise that most Minecraft players are familiar with, hence why it is omitted here.

    The goal of optimizing the server is to make the game more enjoyable for your players not to make them suffer!

tick-rates:
      sensor:
        villager:
          secondarypoisensor: 40
      behavior:
        villager:
          validatenearbypoi: -1

Set the sensor tick rate of an entity (In this case Villager)

  • A higher value will reduce the resource usage of the entity with some cost to their behaviors.
  • A value of -1 means that it will apply Vanilla default.
  • This config works for all type of entities, consult timings for entity names and manually create an entry for them as desired.
  • If your server is experiencing villager related performance issue, first try to play around this config before moving onto a plugin solution.
    • For example you can adjust secondarypoisensor to 240 and validatenearbypoi to 120 to save resources. The negative behavioral change is likely not noticeable.

grass-spread-tick-rate: 1

Increase this number makes dirt turning into grass slower.

  • Increase this value by too much will result in many ugly dirt patches if you have a lot of animals around.

optimize-explosions: false

Setting this to true would reduce the impact of calculating a large amount of explosions.

  • The actual real world scenario that would benefit from this is minimum; however, if your friends love to blow things up with an unholy amount of TNTs, this setting may be right for you.

armor-stands-tick: true

This decides if armor stand should be ticked.

  • Setting this to false will…
    • completely remove any armor stand related lag machines.
    • It will break plugins that utilize armor stands.
    • It will break farms such as automatic ice maker.

  chunk-loading:
    min-load-radius: 2
    max-concurrent-sends: 2
    autoconfig-send-distance: true
    target-player-chunk-send-rate: 100.0
    global-max-chunk-send-rate: -1.0
    enable-frustum-priority: false
    global-max-chunk-load-rate: -1.0
    player-max-concurrent-loads: 4.0
    global-max-concurrent-loads: 500.0

chunk loading config is part of the Tuinity merge options that is now available to Paper after 1.17.1 build 232.

The default value listed above should work for majority of the server.

  • If you are troubleshooting chunk loading issue, please consult #paper-help channel first for advice, do not alter the value without fully understand what they do. Do not follow any random guide for recommended value, there are a lot of misinformation out there!
  • If you’ve just migrated from Tuinity to Paper, please run the server with the default config first before altering any setting. Certain config options from the old Tuinity.yml is no longer working and/or work differently on Paper.
  • For server with large concurrent player count, if chunk loading is noticeably slower during the peak hours, try increasing max-concurrent-sends and global-max-concurrent-loads gradually to remedy the issue.
    • If you have anti-xray enabled on engine mode 2, it may contribute to chunk loading issues.
    • If you have protocallib or anything that may hold up the netty threads, it may also stall the chunk loading.

Additional notes are listed on official PaperMC docs. Click here for full details
It's not like I care to show you patch details anyway but you can find it here. - Tuinity chan


Additional Options and Quality of Life Config

These additional config are offered by Paper and is strongly recommended as they enhance the overall player experience.

lootables:
      auto-replenish: true
      restrict-player-reloot: true
      reset-seed-on-fill: true
      max-refills: -1
      refresh-min: 12h
      refresh-max: 2d

Toggle this to true if you plan to run a long-term survival server.

It replenish the chest once looted and would bring some life back to your old worlds.

  • The lootables refill feature only works with the original world-generated chest.
    • Let your player know to not break them.
  • restrict-player-reloot will stop the same player from camping and looting the chest multiple times.
    • Scenario 1: If a player loot a chest once and come back later, there will not be new loots.
    • Scenario 2: If player A loot a chest and then player B comes by later, the chest will be refilled and lootable for player A again.
  • reset-seed-on-fill will shuffle loot table seeds on each refill so the items inside the chest will always be different.
  • max-refill sets the maximum refills, a value of -1 will make it unlimited.
  • refresh-min/max defines the amount of time passed before the chest is refilled.
    • This does not require the chunk to be loaded.
  • The chest will refill regardless of the remaining items inside unless its full.
    • Scenario 1: If player A opened the chest (generated the loot) and leave the loot inside, player B that comes by later will get a set of newly generated loot plus whatever that was left by player A previously.
    • Scenario 2: if player A opened the chest and fill it up with diorite, player B who that comes by later will get nothing new (but diorite) because the chest is already full thus no new loots will be generated.

generate-random-seeds-for-all: true

Toggle this option to true will make seed cracker tool has harder time to determine your world seeds.

It is a very useful feature if you aim to migrate the unfair advantages player may have if they manage to figure out your world seed.

If you are using this feature for the first time, simply toggle the option to true and start the server. It will allow the server to generate all available features seeds. If you wish to assign each seed individually, you can do so after it is being generated for the first time.

log-player-ip-addresses: true

Paper provides an option to toggle player IP address logging.
For those who wants to protect player privacy, you can toggle this option to false.

  • This is especially useful in times where log files need to be shared with a third party auditor, maintainer, or developer for general troubleshooting.

  book-size:
    page-max: 2560
    total-multiplier: 0.98

Paper provides the options to adjust the overall size of a book. This is an useful feature to prevent bookban either on purpose or by accident (unlikely).


Per-world Spawn Limit and Other Per-world Config

Paper allows you to enforce a custom mob cap per world such as inside Nether, The End, or other custom worlds, you can create a new section under world-settings.

Additionally, all config options under world-settings category in both paper.yml and spigot.yml can be defined individually as Per-world Configs.
Please check out the formatting example below.

world-settings:
  default:
    spawn-limits:
      monster: 70
      creature: 10
      ambient: 15
      underground_water_creature: 5
      water_creature: 5 
      water_ambient: 20
  world_nether:
    spawn-limits:
      monster: 80
      creature: -1
      ambient: -1
      underground_water_creature: -1
      water_creature: -1
      water_ambient: -1
  resource_world:
    spawn-limits:
      monster: 5
      creature: 30
      ambient: -1
      underground_water_creature: -1
      water_creature: -1
      water_ambient: -1
    keep-spawn-loaded: false
 
# This section serves as an example to help you virtualize the structure.
# Other config options are omitted here.

In the above example, by having a lower monster value in resource_world and have keep-spawn-loaded: false You just made the resource world a bit safer for miners and also reduce the overhead on the server by not keeping the spawn chunk loaded because it is not actively being used.

With several clever uses of per-world config like this and the no-tick example mentioned earlier, you will be able to save some resources on the server while keeping an optimal gameplay experience for your players.

  • Paper uses proper category name here as opposed to old bukkit names for the categories.
    • creature is the same as animals in bukkit.yml
    • water_creature is the same as water-animals in bukkit.yml
  • A value of -1 means it will follow the value as defined by default. (in case of spawn-limits, by mob-cap in bukkit.yml)
  • YML file uses 2 spaces for indentations. Do not use tab key.
  • Make sure the indentation is correct in a tree-like structures. (two spaces for each step of indentation)
  • A proper yml editor will help ensure formatting isn’t borked.
  • The console will puke up an error on startup if a mistake is made. Correct them accordingly.

Paper’s own buit-in Anti-Xray

Paper has built in Anti-xray feature and if you do choice to enable it, please follow the below post carefully.

Recommended Paper Anti-Xray Settings by stonar96

Below is an example on how to enable Anti-Xray in Nether and other worlds.

world-settings:
# Past this directly before Default:
  world_nether:
    anti-xray:
      max-chunk-section-index: 7
      max-block-height: 128
      hidden-blocks:
      # See note about air above.
      - ancient_debris
      - bone_block
      - glowstone
      - magma_block
      - nether_bricks
      - nether_gold_ore
      - nether_quartz_ore
      - polished_blackstone_bricks
      replacement-blocks:
      - basalt
      - blackstone
      - gravel
      - netherrack
      - soul_sand
      - soul_soil
  # world_the_end: needs to be changed if your world is named differently.
  world_the_end:
    anti-xray:
      enabled: false

  # Paste this directly before default:
  default:
  # Other configs is omitted here. 
  # This is done to showcase how the indention should look like
  • Please double check to make sure the indention is correct, world_nether and default world should have the same amount of indention (2 spaces away from world-settings)
  • Be sure to stop and start the server again for the new config to apply. Do not use /reload
  • If you absolutely cannot figure out how to add this, here is a paper.yml file with default setting for you to download.
    (Normally, I would be strongly against downloading random file off internet but here it is…)
    • Replace the existing paper.yml and change any necessary config if you’ve altered anything previously.
  • Please note that engine mode 2 works fine on majority of servers; however, on server with high concurrent player counts (100+), usage of engine mode 2 may sometimes saturated the network pipelines as more data is being sent to players. Please consult your network admin if you think this is happening and address the issue accordingly.

Addendum

There are many things I left out and is not without a reason. Those other settings often introduce too much gameplay compromises or with minimum performance improvement on majority of small-to-medium size server. For a full list of available configs, you can check out PaperDocs.

Modern Minecraft is resource demanding and there is only so much you can optimize until you gotta ask yourself, is this still worth the effort?

There is only so much you can take out of a car to make it go faster until you are left with nothing but a steering wheel and a bare chassis, the same applies to optimizing your server.

If tweaking the above-mentioned configs is not enough to help maintain a stable TPS (18~20) on your server, I will strongly suggest looking into a direct hardware upgrade as this will be the most direct way to see any further performance improvement. See Hosting Options below for more information. 

At the time of writing, even with the latest hardware available, 60-80 players with close to vanilla default configs or 100 player with huge game player compromise is the hard ceiling. At that point, impose a reasonable max player limit on the server and start thinking about network expansions (multi-servers) and congratulation on your achievement! 


Timings Tool

Paper comes with a built-in tool to help troubleshoot the performance issues

  • Type /timings report in game or on console (without /) to generate a report.
  • To generate a meaningful timing report, you should…
    • Avoid generating timing report right after server startup as the data will be skewed.
    • Allow the timings data to be recorded for a longer duration
      (The minimum is 10 minutes but the longer the better)
    • The ideal time to generate a report is during the peak player activities or right when the server is lagging.

Giant Red Number does not always mean your server is lagging.

  • Timings page has Lag view and All view tabs. A few Red lagging tick out of a few thousand ticks overall is very much acceptable.
  • If you have trouble understand the timings report, please head to Paper Discord for additional support.

Common Mistakes

  • Gigahertz Myth
    • When selecting CPUs for your Minecraft server, do not use the clock speed rating to compare two CPUs unless they are of same model and manufacture. Please refers to Gigahertz Myth for more info.
    • In short, select the latest cpu architecture and the highest single core thread rating model available.
  • Allocate more RAM =/= better performance
    • Server performance is largely depend on your CPU not RAM.
    • Most server will run just fine with 10GB allocated regardless of player/plugin count.
    • The common saying of 1GB per players is wrong.
    • With that being said, unused RAM is wasted RAM; however, anything more than 10GB would provide you with minimum benefits.
    • Any host who claims more RAM would increase your server performance (after 10th GB) is trying to upsell you for their own profit gains. Do not fall for this trap.
  • RAM usage is not an indication of performance issue. Unless you are experiencing OOM (Out-of-Memory) or memory leaks.
    • RAM usage reading from panels/htop is very much meaningless on a properly setup JVM. We will cover this on the Flag section below.
    • Set your Xmx flag properly if you would like the JVM to use a set amount of RAM
  • High memory usage =/= Memory leak
    • It may be a symptom of memory leak but is not necessary true in most cases.
    • Generate a heap report during the suspected period when you think the leak is occurring with /paper heap dump command then feed the report through Eclipse Memory Analyzer or the like to troubleshoot the issue. You can also seek help in Paper Discord.
  • TPS is not an accurate measurement of performance.
    • Instead you should pay attention to MSPT (milliseconds per tick). Minecraft runs on a fixed rate of 20 ticks per second so as long as your MSPT is lower than 50, you will maintain 20 TPS.
    • A server could show a 20 TPS average but with a high percentage of TPS lost, the player may still experience lag in this scenario.
  • The minimum recommended thread/core count for a Minecraft server is FOUR.
    • While it is true that Main game loop is all done on 1 thread, there are many tasks that can benefit from having multiple threads such as Netty, plugins, SQL database etc.
    • It is recommended to have at least 4 thread/core for most server. If you are shopping for a host, please take this into the consideration and select your plan accordingly.

JVM Flags (A Must Have)

  • Use optimized JVM flags for Minecraft applications. Please reference to Aikar’s JVM Tuning Guide for more information.
  • Grab the above-mentioned flags easily from starmc.sh by your lovely Bluely.
  • Eusure that Xms=Xmx. This allow the JVM to take full control of the allocate RAMs and is beneficial to performance.
    (I will personally fight any host that suggest otherwise. Setting xmx=xms hinders a host’s ability to stuff as many server into a physical machine and cuts into their profit margins. See Hosting Suggestion below for more info)
  • What about ZGC, or Shenandoah?
    • In regards to ZGC, Krusic has a fantastic blogpost if you’d like to dig deeper.
    • I do not know any competent analysis on Shenandoah for Minecraft applications on hand, if you do have some resource on this topic, please contact me so I can include it here.
    • ZGC, Shenandoah and other modern collectors alike are designed for highly threaded environments which does not apply to Minecraft Applications hence why they are generally not recommended. Anyone who claim otherwise should be taken with a huge grain of salt especially if they do not have any data backing up to their claims.
    • Server startup time and idle MSPT are not useful metrics nor are they an indication of better alternative GC performance. There are tons of questionable claims using them as benchmark data point. This is a sign of incompetence and you should not trust their claims.
  • Remember the HEAP! Regardless of how you are hosting your server, the OS and the JVM itself requires RAM to function. Please reserve enough of RAM and lower your Xmx as needed.

Backup and Recovery Best Practice

Shit happens and you wouldnt wanna be stuck in the bathroom with a shitty pants, would you? It’s important to have spare pair of undies with you! Make a backup today!

  • Have a backup and recovery plan in place is essential
    • Unexpected crash or improper shutdown could cause world corruption or data lost to your server. Keeping multiple copies of backups both on-site and off-site is not only crucial but an important aspect of running a long-lasting server.
    • Regularly test your backup copies. An un-tested backup = no backup.
    • When possible, backup on OS level (Avoid using Minecraft Plugin for backups)

On Linux-based operating system

The simplest way is to stop the server and make a tarball

tar -czvf backup_date.tar.gz /[path]/
Utilize the absolute path for [path]
I.E. If you would love to save the backup file to /HOME/USER/MCbackup you will list as such.
tar -czvf backup_date.tar.gz /HOME/USER/MCbackup

For more advanced user, set up rsnapshot utility

Utilize Rsnapshot with Rsync to keep a record of all fire changes and automate the off-site backup process

On Windows operating system

Right click on your Minecraft root folder > Send to > Compressed (zipped) folder
  • Offload the tarball / zip file onto an external sites in case your datacenter caught on fire.
  • You can in theory keep the server running with save-off during backup process. DO REMEMBER to turn it back on once the backup task is complete.

Quality of Life Plugins & Tools

Here is my personally curated list of plugins where it would be beneficial for every server to have.

Essential Plugins

Disclaimer: I am not sponsored by any individual or groups on the making of this list. This list is purely made with love with my personal experience with them <3

  • Luckperm
    • A must-have modern permission plugin that provides you with finer permission control without the risk of giving out the OP permission to your staff team.
  • Essentialsx Family
    • Essentialsx is a family of plugins that provide you with several essential features for your server.
      (Please read and install only the one you need not every single one of them)
  • Essentialsx-Discord
    • A lightweight bridge plugin that brings your MC drama from in-game chat to Discord.
    • Installation Guide
  • Chunky
    • World pre-generation plugin.
  • ChunkyBorder
    • Worldborder plugin with more feature than vanilla worldborder.
  • PureTickets
    • A mod/support ticket system to manage your server drama.
  • EntityDetection
    • A simple plugin to display entity location on the server.
    • A helpful tool to locate problematic entities and illegal villager orgy party.
  • Vanish no packet
    • Allow you to Vanish with style. It’s free and open source!
  • Openinv
    • Allow you to open any player inventory even if they are not currently online.
  • MiniMOTD
    • Customize MOTD and server icons.
  • TabTPS
    • The originalâ„¢ TPS bar integration with pretty RGB.
  • AnnouncerPlus
    • Powerful fully customizable announcer plugin.
  • Wandering Trades
    • Customize Wandering Trader.
  • AntiRaidFarm
    • A simple plugin to disable RaidFarm.
  • Maintenance
    • Enable/disable maintenance mode.
  • VanillaTweaks
    • Vanillatweaks datapack but is a plugin.
  • TressAssist
    • The only tree faller plugin that dont take the server down with it.
  • WorldEdit
    • The classic world edit plugin.
  • WorldGuard
    • Who doenst know Worldguard??
  • Farm Control
    • The solution to overpopulated farms.
  • MobLimit
    • Similar to Farm Control mentioned above.
      (You will only need one or the other)
  • Insights
    • An anti-Redstone griefing and block limitor plugin.
    • An useful tool to locate potential lag machine.
  • Spark
    • A profiler plugin that provides you insights on your server.
      (It is a perfect aid in addition to Timings to troubleshoot possible issues within your server)
  • BlueMap
    • A map plugin that provides 3D render of your server. (Warning, this plugin is very resource intensive)
    • You can check out IOE showcase here if you want to get an idea on how it looks.
  • VivaVersion (also known as ViaVersion)
    • An useful plugin during each major Minecraft updates.
      You can config this plugin to allow players from newer version of Minecraft to join the server while you wait for the stable Paper version to be published.
  • AntiBookBan
    • A simple plugin to disallow non-ASCII characters in book thus preventing bookban exploits.
  • Prism
    • A grief management plugin that features rollback, restores, and block history.
  • CoreProtect
    • Similar to Prism, yet another grief management plugin.
      (You will only need one or the other)
  • OreAnnouncer
    • An alternative to anti-xray, this plugin notify you on block mined.
  • Quantum Random Teleport
    • A modern random teleport plugin.
  • Random Teleport
    • Another random teleport plugin.
  • ChestShop
    • Simple chest shop plugin
  • Shop
    • Another simple chest shop plugin

A good plugin can bring in additional functionalities and improvements to your server; on the flip side, a poorly made plugin could single-handedly tank the performance or even cause permanent damage to your server. Please do your due diligence by looking into the history of the developer/organization behind the plugin prior to installation and properly test them before pushing them live to production.

Useful Tools

  • MCA Selector
    • A tool to view, trim, and alter your chunk data offline.
    • Please ensure that you have a proper backup before you perform any action with this tool.

Moreover, there are client side mods that aim to improve vanilla gameplayer experience and is highly recommended for players who may want to have the best gameplay experiences possible.
However, it does not align with the topic of this blog post, instead, you can check it out here [Minecraft Client Optimization mods]


Things to Avoid

  • Avoid MobStacker plugin
    • Mobstacking is an inherently flawed idea. Spawning mob consumes server resources, with mobstacking enabled, the server would never reach mob cap and could potentially be stuck in the endless loop of spawning hell.
    • Combined with seemingly zero decently coded stacker plugins, stacking mob should be avoided at all cost.
  • Avoid lag removing or performance enhancing plugin.
    • Fix the root cause of the performance problem instead of masking it.
    • Plugins such as ClearLagg or EntityTrackerFixer (ETF) introduce gameplay inconsistencies, create unnecessary works for already existing tasks (such as clearing ground items, and untracking entities), and would sometimes cause permanent damages to your world (ETF would remove AI from entities causing them to have permanent brain damage even after the plugin is removed).
  • Do NOT allow your players to relocate spawners
    • Being able to silktouch spawner is often requested by players; however, it is not a great idea considering spawner is basically a built-in lag machine when enough of them are gathered together. For the sake of server performance, do not allow your player to relocate spawners.
  • Do NOT use datapack with repeat/recurrent functions
    • Datapack with such functions will impose a performance hit and should be avoided at all cost.
    • Find plugin replacement of the datapack features you wish to have.
  • Do NOT source your plugin from BlackSpigot, MCM, a random individual, or any other unknown sources
    • You wouldnt get your breakfast sausage from a random stranger on the backside of your local gas station, would you? Same thing applies to sourcing your plugins.
    • Obtain your plugins from reputable sites and practice your due diligence to audit the code base or the developer themselves.
    • To take it lightly, your server may take a huge performance hit due to a poorly coded plugin, or worse be invaded by griefers via built-in backdoors, even worse, your server itself may be taken over for other malicious activities.
  • Do NOT auto-update your paper.jar
    • Paper development cycle does not include a proper release/beta versioning scheme so occasionally a bad build may slip through the crack on to release.
    • Automation provides convenience but you should not blindly download the latest Paper jar for use in the production environment.
  • The Famous Minecraft List of Shames by the upside down man Kneny


Hosting Options

Disclaimer: I am not sponsored by any individual or groups on the making of this list. This list is purely made with love with my personal experience and community inputs

There are several available options when it comes to hosting a Minecraft servers. Please read and understand the limitations of each. Below is a list from the most powerful option to potatos.

  • Dedicated Server (Baremetal) – A whole dedicated machine all to yourself.
    • This is the most expensive option and requires you to have basic understanding of Linux admin skills
    • Ideal for server with over 50 players concurrently
  • Shared Host – A managed service where you are sharing resource with other Minecraft servers
    • Bloomhost or DedicatedMC are recommended.
    • Ideal for server with 10~50 players depends on the plan you select.
    • The two above mentioned hosts are widely suggested by many as they utilize Aikar’s Flag by default and allow your JVM instance to claim the RAM in its entirety. It is by no mean a guarantee for the performance but it serves as an indication that they are probably not overselling their machine.
  • Oracle Cloud Free Tier – Free and very fast cloud instance with a catch.
    • This offer may not be available for your region due to the recent popularity spike.
      However, it never hurts to try your luck.
    • Read this blog post carefully for more info
    • Ideal for server with ~20 players concurrently with the ARM based A1 instance.
      (I’ve personally own and tested one and I can vouch for its performance. It is capable to handle a small survival server without issue)
    • If you do opt for this hosting option, please note that your instance will/may be disabled on 60th days from the beginning of the trial. You can delete the existing and now-disabled instance then remake a new one with a boot volume backup (given that the region you are on still has space available for free-tier). MAKE SURE YOU HAVE A BOOT VOLUME BACKUP READY FOR THIS!
  • VPS – Virtual Private Server
    • It may sounds like a good deal on paper but VPS is often not as great of value as the above mentioned Shared Host as the hardware tend to be dated and the whole VPS industry is more geared toward webhosting and other less CPU intensive workloads.
    • Ideal for… ugh your mileage varies. If you still prefer this option, find a host that specialized in high-end game server hosting instead of the general purpose one.
  • Budget Host – A cheaper alternative of shared host with much lower performance.
    • Similar to shared host above but is a lot cheaper. They turn a profit by staffing as many servers as physically possible into one physical machine (This is called overselling)
    • Those type of hosts often spend the most on advertising and have extensive teams on social media to promote their service. Huge discounts or coupons are often offered to drive sales.
    • They often prey on the uneducated users and here is a few easy ways to identify them in the wild.
      • If the CPU model is not clearly labeled on the plan.
      • If they are advertising plans based on maximum player count.
      • If they are selling RAM by the GB per dollar pass 10th GB.
      • If they offer unlimited storage.
      • If they have discount deal all year round.
      • If Xms=128M is present in your JVM flags
        (You can locate this info on the timings report)
    • Ideal for 5~25 players.
      • Due to common overselling practice, the server may perform poorly during the peak hours where the machine may struggle to handle the workload.
      • Your server may also suffer sudden performance drop due to no fault of your own but simply being located in an overcrowd environment where another Minecraft server may be overloading the machine.
  • Summer Host – Just like Budget Host but even worse in every aspect
    • The term “Summer Host” comes from the fresh/new hosting companies that appear during the summer school break where the demand for Minecraft server peaks. Majority of the summer host will disappear or become inactive once the demands declines, only to be resurrected next year with a brand new name.
    • Please read this comically accurate SummerHost page for more info.
    • Ideal for server with 5~10 players.
    • You should avoid this type of host at all cost as they may shut down without warning and your valuable Minecraft world may be lost forever.
  • Free Host – Minehut and Aternos
    • If you are not paying for the product you are the product
      • Through clever marketing, they are able to offer free server with very limited resource to everyone.
      • They profit from the massive amount of userbase they hold and outsource the risk of starting a server to those who dare to pay them for premium plans.
    • Both Minehut and Aternos impose heavy restrictions to their service such as JVM flags, yml configs, plugins, and offer no ability to transfer the file out. You are buying into their ecosystem and you are the product they are selling.
    • Ideal for… if you are 12 year old with no credit card or bank account and cannot convince your parent to rent a server for you.
  • Self-host – Hosting at home
    • If you could ignore the potential security implications of exposing your home IP to the public and the risk of being DDOS’d by your friends, this is a workable option. However, it is strongly discouraged.
    • If you still want to give it a try, check out Syscraft’s helpful Guide by Larry on how to start.
    • Ideal for (heavily dependent on your hardware)
  • Raspberry pi
    • A perfect solution for those who prefer pain and sufferings. In truth, A Raspberry Pi is just not powerful enough to run modern Minecraft version without making a tons of gameplay compromises.
    • Ideal for server with 1~5 players.

Domain and Service Record (SRV)

If you own a domain, you can set up a service record (SRV) to have a prettier and easier to remember server address.

Instead of having 192.168.1.1:25555 displayed as your server address, you can get minecraft.yourdomain.com

To do this, you will need an A record and an SRV record.

In this scenario www.yourdomain.com is your domain and you want to create mc.yourdomain.com as your server address instead of 192.168.1.1:25555

Step 1: Create an A record that pointed the hostname mc.yourdomain.com to your server’s public IP address

Step 2: Create a SRV record with hostname _minecraft._tcp.mc.yourdomain.com

There will be options to set up priority, weight, port, and target.

You will set them as 0, 0, 25555, mc.yourdomain.com accordingly

  • If you are running Minecraft on the default port (25565), only an A record is needed.
    (The above example is provided for server that is on a shared host or is running on non-default ports)
  • Please note that DNS change takes time to populate and the resulting link may not work right away. Be patient.

Closing Notes

Wow you made it this far, I hope you did not skip anything. The original idea of this guide is to make it as simple as possible for beginners who just step their foot onto the Minecraft server hosting. In the writing process, I tried to simplify things, please do let me know if something can be explained better or improved. I would love to keep this guide as accurate and as up-to-date as possible so if you do find any mistake, please let me know either at Island of EterNity or PaperMC Discord @EterNity#0001 or you can email me at [email protected]


Helpful Links

DO NOT LEFT CLICK THIS IMAGE OR LEFT CLICK ANYTHING AFTER!