Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VillageSignpost::fetchPossibleTargets causes high thread contention #102

Open
TranslationLookasideBuffer opened this issue Dec 13, 2022 · 0 comments

Comments

@TranslationLookasideBuffer

Issue

While a player is loading pregenerated chunks, Signpost (v1.19.2-2.01.0) consumes a large amount of server time calls to net.minecraft.util.thread.BlockableEventLoop.waitForTasks():

Server thread [102.27ms]
gollorum.signpost.utils.__Delay_onServerTick_ServerTickEvent.invoke() [102.13ms]
gollorum.signpost.utils.Delay.onServerTick() [102.13ms]
gollorum.signpost.utils.Delay$Task.run() [102.13ms]
gollorum.signpost.minecraft.block.tiles.PostTile$$Lambda$26051/0x000000080376ad68.run() [102.13ms]
gollorum.signpost.minecraft.block.tiles.PostTile.lambda$setLevel$8() [102.13ms]
gollorum.signpost.minecraft.worldgen.VillageSignpost.populate() [102.12ms]
gollorum.signpost.minecraft.worldgen.VillageSignpost.fetchPossibleTargets() [102.11ms]
java.util.stream.ReferencePipeline.collect() [102.11ms]
java.util.stream.AbstractPipeline.evaluate() [102.11ms]
java.util.stream.ReduceOps$ReduceOp.evaluateSequential() [102.11ms]
java.util.stream.AbstractPipeline.wrapAndCopyInto() [102.11ms]
java.util.stream.AbstractPipeline.copyInto() [102.11ms]
java.util.stream.Sink$ChainedReference.end() [102.11ms]
java.util.stream.Sink$ChainedReference.end() [102.11ms]
java.util.stream.Sink$ChainedReference.end() [102.11ms]
java.util.stream.Sink$ChainedReference.end() [102.11ms]
java.util.stream.SortedOps$RefSortingSink.end() [102.11ms]
java.util.ArrayList.forEach() [102.11ms]
java.util.stream.SortedOps$RefSortingSink$$Lambda$497/0x0000000800df65f0.accept() [102.11ms]
java.util.stream.ReferencePipeline$3$1.accept() [102.11ms]
java.util.stream.ReferencePipeline$2$1.accept() [102.11ms]
gollorum.signpost.minecraft.worldgen.VillageSignpost$$Lambda$26369/0x00000008037bd018.test() [102.11ms]
gollorum.signpost.minecraft.worldgen.VillageSignpost.lambda$fetchPossibleTargets$4() [102.11ms]
gollorum.signpost.WaystoneLibrary.contains() [102.11ms]
gollorum.signpost.WaystoneLibrary.assertTileEntityExists() [102.11ms]
net.minecraft.world.level.CommonLevelAccessor.getBlockEntity() [102.11ms]
net.minecraft.world.level.BlockGetter.getBlockEntity() [102.11ms]
net.minecraft.world.level.Level.getBlockEntity() [102.11ms]
net.minecraft.world.level.Level.getChunkAt() [102.11ms]
net.minecraft.world.level.Level.getChunk() [102.11ms]
net.minecraft.world.level.Level.getChunk() [102.11ms]
net.minecraft.server.level.ServerChunkCache.getChunk() [102.11ms]
net.minecraft.server.level.ServerChunkCache.getChunkBlocking() [102.11ms]
net.minecraft.util.thread.BlockableEventLoop.managedBlock() [101.87ms]
net.minecraft.util.thread.BlockableEventLoop.waitForTasks() [92.99ms]
java.util.concurrent.locks.LockSupport.parkNanos() [91.51ms]
jdk.internal.misc.Unsafe.park() [91.51ms]

In short, I think what's going on is there is a large number of villages within some radius and VillageSignpost.populate is kicking off with a large list of possible targets which in turn causes assertTileEntityExists to be called which has a strong dependency on some blocking code.

This causes pauses on the order of a minute which disconnects players.

Detailed Server Info

Expand Me

State (Spark Profile)

  • The platform is a Forge server running version "43.1.57".
  • The detected Minecraft version is "1.19.2".
  • The server is running in online mode.
  • The system is running Windows 10 Pro (amd64) version "10.0.19045" and has 8 CPU threads available.
  • The CPU is described as an Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz.
  • The process is using Java 17.0.5 (unknown from Oracle Corporation).
  • The profiler was running for 1m 20s (519 ticks).

World

6500 x 6500 blocks (~165,000 chunks)

Pregenerated with Chunky. There are multiple mods that create new "villages". e.g. Minecolonies (though these are always empty due to a datapack).

Full Modlist

  • additional_lights (v2.1.5)
  • additionaladditions (v5.1.0)
  • additionalstructures (v4.0.2)
  • advancedperipherals (v0.7.22b)
  • ae2 (v12.9.1)
  • alexsdelight (v1.4)
  • alexsmobs (v1.21.1)
  • another_furniture (v2.1.2-1.19.2)
  • appmek (v1.3.3)
  • aquaculture (v1.19.2-2.4.8)
  • architectury (v6.3.56)
  • attributefix (v17.1.2)
  • autoreglib (v1.8.2-55)
  • badpackets (v0.2.1)
  • balm (v4.5.3)
  • betterdeserttemples (v1.19.2-Forge-2.2.1)
  • betterdungeons (v1.19.2-Forge-3.2.2)
  • bettermineshafts (v1.19.2-Forge-3.2.0)
  • betteroceanmonuments (v1.19.2-Forge-2.1.0)
  • betterstrongholds (v1.19.2-Forge-3.2.0)
  • betterwitchhuts (v1.19.2-Forge-2.1.0)
  • biomemakeover (v1.19.2-1.6.2)
  • blockui (v1.19-0.0.64-ALPHA)
  • blue_skies (v1.3.20)
  • blueprint (v6.1.0)
  • bookshelf (v16.1.11)
  • caelus (v1.19.2-3.0.0.6)
  • canary (v0.1.3)
  • carryon (v1.18.2.5)
  • chickenchunks (v2.9.4.97)
  • chunky (v1.3.38)
  • citadel (v2.1.1)
  • cloth_config (v8.2.88)
  • clumps (v9.0.0+14)
  • codechickenlib (v4.3.0.470)
  • collective (v5.25)
  • comforts (v6.0.3+1.19.2)
  • computercraft (v1.101.1)
  • connectedglass (v1.1.4b)
  • corpse (v1.19.2-1.0.0)
  • create (v0.5.0.f)
  • createaddition (v1.19.2-20221124a)
  • createdeco (v1.2.11-1.19.2)
  • creativecore (v2.9.3)
  • cucumber (v6.0.3)
  • curios (v1.19.2-5.1.1.0)
  • darkutils (v13.1.2)
  • decorative_blocks (v3.0.0)
  • deeperdarker (v1.1.3)
  • delightful (v3.1.4)
  • diagonalfences (v4.2.3)
  • domum_ornamentum (v1.19-1.0.75-ALPHA)
  • duckling (v2.0.8)
  • dungeoncrawl (v2.3.11)
  • easyanvils (v4.0.6)
  • easymagic (v4.3.2)
  • ecologics (v2.1.10)
  • effective_fg (v1.3.4)
  • elytraslot (v6.0.0+1.19.2)
  • engineersdecor (v1.3.27)
  • fairylights (v6.0.0)
  • farmersdelight (v1.19-1.2.0)
  • farmersrespite (v1.19-2.0)
  • fastleafdecay (v30)
  • flywheel (v0.6.7-8)
  • forge (v43.1.57)
  • framedblocks (v6.6.2)
  • geckolib3 (v3.1.38)
  • goblintraders (v1.8.0)
  • guardvillagers (v1.19.2-1.5.2)
  • hunterillager (v1.19.2-6.2.0)
  • immersiveengineering (v1.19.2-9.0.0-153)
  • incendium (v5.1.4)
  • infernalexp (v2.5.1)
  • mcjtylib (v1.19-7.0.6)
  • mekanism (v10.3.5)
  • mekanismgenerators (v10.3.5)
  • mekanismtools (v10.3.5)
  • minecolonies (v1.19.2-1.0.1135-ALPHA)
  • minecraft (v1.19.2)
  • moonlight (v1.19.2-2.1.15)
  • multipiston (v1.19.2-1.2.21-ALPHA)
  • mysticalagriculture (v6.0.5)
  • naturalist (v2.1.1)
  • naturescompass (v1.19.2-1.10.0-forge)
  • nethersdelight (v1.19-3.0)
  • nochatreports (v1.19.2-v1.5.1)
  • nullscape (v0.0NONE)
  • openpartiesandclaims (v0.16.5)
  • oreexcavation (v1.11.166)
  • paragon (v1.0.3)
  • pigpen (v11.1.2)
  • puzzleslib (v4.3.12)
  • quark (v3.3-374)
  • rftoolsbase (v1.19.1-4.0.3)
  • runelic (v14.1.2)
  • saturn (v0.0.1)
  • Server thread0.01%
  • signpost (v1.19.2-2.01.0)
  • simplylight (v1.19.2-1.4.5-build.42)
  • smoothchunk (v1.19.1-2.0)
  • snowundertrees (v1.3)
  • sophisticatedbackpacks (v1.19.2-3.18.35.751)
  • sophisticatedcore (v1.19.2-0.5.32.181)
  • spark (v1.10.17)
  • spectrelib (v0.10.0+1.19)
  • structory (v1.0.1)
  • structure_gel (v2.7.1)
  • structurize (v1.19.2-1.0.468-ALPHA)
  • supplementaries (v1.19.2-2.2.26)
  • t_and_t (v1.10)
  • takesapillage (v1.0.2)
  • terrablender (v2.0.1.128)
  • terralith (v0.0NONE)
  • torchmaster (v19.2.0)
  • twigs (v2.0.1+1.19)
  • villagernames (v4.3)
  • waila (v5.13.4)
  • waystones (v11.1.0)
  • woodworks (v2.1.0)
  • wthit (v5.13.4)
  • xnet (v1.19-5.0.2)
  • xnetgases (v4.0.0)
  • yungsapi (v1.19.2-Forge-3.8.2)
  • yungsextras (v1.19.2-Forge-3.1.0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant