VillageSignpost::fetchPossibleTargets causes high thread contention
TranslationLookasideBuffer opened this issue ยท 0 comments
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)