From 2e18fe710ceb8e4f8f067041d18de0560359eecd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 14 Jul 2018 18:07:37 +0100 Subject: [PATCH] MemoryManager: Shut down idle workers during GC to reclaim memory workers can be a major memory hog, especially if you have lots of them. --- src/pocketmine/MemoryManager.php | 3 +++ src/pocketmine/scheduler/AsyncPool.php | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/pocketmine/MemoryManager.php b/src/pocketmine/MemoryManager.php index 38f56ec47..34cc31f52 100644 --- a/src/pocketmine/MemoryManager.php +++ b/src/pocketmine/MemoryManager.php @@ -243,6 +243,9 @@ class MemoryManager{ if($this->garbageCollectionAsync){ $pool = $this->server->getAsyncPool(); + if(($w = $pool->shutdownUnusedWorkers()) > 0){ + $this->server->getLogger()->debug("Shut down $w idle async pool workers"); + } foreach($pool->getRunningWorkers() as $i){ $pool->submitTaskToWorker(new GarbageCollectionTask(), $i); } diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index dbdb1de9d..f669b00bd 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -317,6 +317,19 @@ class AsyncPool{ $this->collectWorkers(); } + public function shutdownUnusedWorkers() : int{ + $ret = 0; + foreach($this->workerUsage as $i => $usage){ + if($usage === 0){ + $this->workers[$i]->quit(); + unset($this->workers[$i], $this->workerUsage[$i]); + $ret++; + } + } + + return $ret; + } + /** * Cancels all pending tasks and shuts down all the workers in the pool. */