mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-12 15:08:27 +02:00
For some unknown reason, Minecraft is sleeping 10ms between every single chunk being saved to disk. Under high chunk load/unload activity (lots of movement / teleporting), this causes the chunk unload queue to build up in size. This has multiple impacts: 1) Performance of the unload queue itself - The save thread is pretty ineffecient for how it accesses it By letting the queue get larger, checking and popping work off the queue can get less performant. 2) Performance of chunk loading - As with #1, chunk loads also have to check this queue when loading chunk data so that it doesn't load stale data if new data is pending write to disk. 3) Memory Usage - The entire chunk has been serialized to NBT, and now sits in this queue. This leads to elevated memory usage, and then the objects used in the serialization sit around longer than needed, resulting in promotion to Old Generation instead of dying young. If there is work to do, then the thread should be doing its work, and only sleep when it is done.
42 lines
1.9 KiB
Diff
42 lines
1.9 KiB
Diff
From e2baf643e39f01e43476500f56f49ee1e284a1fb Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Wed, 9 Sep 2015 21:09:58 -0400
|
|
Subject: [PATCH] Don't sleep between chunk saves
|
|
|
|
For some unknown reason, Minecraft is sleeping 10ms between every single chunk being saved to disk.
|
|
Under high chunk load/unload activity (lots of movement / teleporting), this causes the chunk unload queue
|
|
to build up in size.
|
|
|
|
This has multiple impacts:
|
|
1) Performance of the unload queue itself - The save thread is pretty ineffecient for how it accesses it
|
|
By letting the queue get larger, checking and popping work off the queue can get less performant.
|
|
2) Performance of chunk loading - As with #1, chunk loads also have to check this queue when loading
|
|
chunk data so that it doesn't load stale data if new data is pending write to disk.
|
|
3) Memory Usage - The entire chunk has been serialized to NBT, and now sits in this queue. This leads to
|
|
elevated memory usage, and then the objects used in the serialization sit around longer than needed,
|
|
resulting in promotion to Old Generation instead of dying young.
|
|
|
|
If there is work to do, then the thread should be doing its work, and only sleep when it is done.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/FileIOThread.java b/src/main/java/net/minecraft/server/FileIOThread.java
|
|
index 198b00f..c9b3bf4 100644
|
|
--- a/src/main/java/net/minecraft/server/FileIOThread.java
|
|
+++ b/src/main/java/net/minecraft/server/FileIOThread.java
|
|
@@ -39,11 +39,12 @@ public class FileIOThread implements Runnable {
|
|
++this.d;
|
|
}
|
|
|
|
+ /* // Spigot start - don't sleep in between chunks so we unload faster.
|
|
try {
|
|
Thread.sleep(this.e ? 0L : 10L);
|
|
} catch (InterruptedException interruptedexception) {
|
|
interruptedexception.printStackTrace();
|
|
- }
|
|
+ } */ // Spigot end
|
|
}
|
|
|
|
if (this.b.isEmpty()) {
|
|
--
|
|
2.1.4
|
|
|