mirror of
https://github.com/pyrohost/pyrodactyl.git
synced 2026-04-06 04:01:58 +02:00
feat: Add server overhead memory allocation to prevent OOM crashes (#317)
* feat: native overhead memory configuration for servers * fix: combine memory limit and overhead memory for wings
This commit is contained in:
@@ -144,7 +144,7 @@ class ServersController extends Controller
|
||||
try {
|
||||
$this->buildModificationService->handle($server, $request->only([
|
||||
'allocation_id', 'add_allocations', 'remove_allocations',
|
||||
'memory', 'swap', 'io', 'cpu', 'threads', 'disk',
|
||||
'memory', 'overhead_memory', 'swap', 'io', 'cpu', 'threads', 'disk',
|
||||
'database_limit', 'allocation_limit', 'backup_limit', 'oom_disabled',
|
||||
]));
|
||||
} catch (DataValidationException $exception) {
|
||||
|
||||
@@ -37,6 +37,7 @@ class StoreServerRequest extends ApplicationApiRequest
|
||||
// Resource limitations
|
||||
'limits' => 'required|array',
|
||||
'limits.memory' => $rules['memory'],
|
||||
'limits.overhead_memory' => $rules['overhead_memory'],
|
||||
'limits.swap' => $rules['swap'],
|
||||
'limits.disk' => $rules['disk'],
|
||||
'limits.io' => $rules['io'],
|
||||
@@ -82,6 +83,7 @@ class StoreServerRequest extends ApplicationApiRequest
|
||||
'startup' => array_get($data, 'startup'),
|
||||
'environment' => array_get($data, 'environment'),
|
||||
'memory' => array_get($data, 'limits.memory'),
|
||||
'overhead_memory' => array_get($data, 'limits.overhead_memory', 0),
|
||||
'swap' => array_get($data, 'limits.swap'),
|
||||
'disk' => array_get($data, 'limits.disk'),
|
||||
'io' => array_get($data, 'limits.io'),
|
||||
|
||||
@@ -20,6 +20,7 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
|
||||
|
||||
'limits' => 'sometimes|array',
|
||||
'limits.memory' => $this->requiredToOptional('memory', $rules['memory'], true),
|
||||
'limits.overhead_memory' => $this->requiredToOptional('overhead_memory', $rules['overhead_memory'], true),
|
||||
'limits.swap' => $this->requiredToOptional('swap', $rules['swap'], true),
|
||||
'limits.io' => $this->requiredToOptional('io', $rules['io'], true),
|
||||
'limits.cpu' => $this->requiredToOptional('cpu', $rules['cpu'], true),
|
||||
@@ -31,6 +32,7 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
|
||||
//
|
||||
// @see https://github.com/pterodactyl/panel/issues/1500
|
||||
'memory' => $this->requiredToOptional('memory', $rules['memory']),
|
||||
'overhead_memory' => $this->requiredToOptional('overhead_memory', $rules['overhead_memory']),
|
||||
'swap' => $this->requiredToOptional('swap', $rules['swap']),
|
||||
'io' => $this->requiredToOptional('io', $rules['io']),
|
||||
'cpu' => $this->requiredToOptional('cpu', $rules['cpu']),
|
||||
|
||||
@@ -27,6 +27,7 @@ use Pterodactyl\Exceptions\Http\Server\ServerStateConflictException;
|
||||
* @property bool $skip_scripts
|
||||
* @property int $owner_id
|
||||
* @property int $memory
|
||||
* @property int $overhead_memory
|
||||
* @property int $swap
|
||||
* @property int $disk
|
||||
* @property int $io
|
||||
@@ -87,6 +88,7 @@ use Pterodactyl\Exceptions\Http\Server\ServerStateConflictException;
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereImage($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereIo($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereMemory($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereOverheadMemory($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereName($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereNestId($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Server whereNodeId($value)
|
||||
@@ -155,6 +157,7 @@ class Server extends Model
|
||||
'description' => 'string',
|
||||
'status' => 'nullable|string',
|
||||
'memory' => 'required|numeric|min:0',
|
||||
'overhead_memory' => 'sometimes|numeric|min:0',
|
||||
'swap' => 'required|numeric|min:-1',
|
||||
'io' => 'required|numeric|between:10,1000',
|
||||
'cpu' => 'required|numeric|min:0',
|
||||
@@ -180,6 +183,7 @@ class Server extends Model
|
||||
'skip_scripts' => 'boolean',
|
||||
'owner_id' => 'integer',
|
||||
'memory' => 'integer',
|
||||
'overhead_memory' => 'integer',
|
||||
'swap' => 'integer',
|
||||
'disk' => 'integer',
|
||||
'io' => 'integer',
|
||||
|
||||
@@ -46,7 +46,7 @@ class BuildModificationService
|
||||
|
||||
// If any of these values are passed through in the data array go ahead and set
|
||||
// them correctly on the server model.
|
||||
$merge = Arr::only($data, ['oom_disabled', 'memory', 'swap', 'io', 'cpu', 'threads', 'disk', 'allocation_id']);
|
||||
$merge = Arr::only($data, ['oom_disabled', 'memory', 'overhead_memory', 'swap', 'io', 'cpu', 'threads', 'disk', 'allocation_id']);
|
||||
|
||||
$server->forceFill(array_merge($merge, [
|
||||
'database_limit' => Arr::get($data, 'database_limit', 0) ?? null,
|
||||
|
||||
@@ -53,7 +53,7 @@ class ServerConfigurationStructureService
|
||||
'invocation' => $server->startup,
|
||||
'skip_egg_scripts' => $server->skip_scripts,
|
||||
'build' => [
|
||||
'memory_limit' => $server->memory,
|
||||
'memory_limit' => $server->memory + $server->overhead_memory,
|
||||
'swap' => $server->swap,
|
||||
'io_weight' => $server->io,
|
||||
'cpu_limit' => $server->cpu,
|
||||
@@ -112,6 +112,7 @@ class ServerConfigurationStructureService
|
||||
'env' => $this->environment->handle($server),
|
||||
'oom_disabled' => $server->oom_disabled,
|
||||
'memory' => (int) $server->memory,
|
||||
'overhead_memory' => (int) $server->overhead_memory,
|
||||
'swap' => (int) $server->swap,
|
||||
'io' => (int) $server->io,
|
||||
'cpu' => (int) $server->cpu,
|
||||
|
||||
@@ -148,6 +148,7 @@ class ServerCreationService
|
||||
'skip_scripts' => Arr::get($data, 'skip_scripts') ?? isset($data['skip_scripts']),
|
||||
'owner_id' => Arr::get($data, 'owner_id'),
|
||||
'memory' => Arr::get($data, 'memory'),
|
||||
'overhead_memory' => Arr::get($data, 'overhead_memory', 0),
|
||||
'swap' => Arr::get($data, 'swap'),
|
||||
'disk' => Arr::get($data, 'disk'),
|
||||
'io' => Arr::get($data, 'io'),
|
||||
|
||||
@@ -62,6 +62,7 @@ class ServerTransformer extends BaseTransformer
|
||||
'suspended' => $server->isSuspended(),
|
||||
'limits' => [
|
||||
'memory' => $server->memory,
|
||||
'overhead_memory' => $server->overhead_memory,
|
||||
'swap' => $server->swap,
|
||||
'disk' => $server->disk,
|
||||
'io' => $server->io,
|
||||
|
||||
@@ -55,6 +55,7 @@ class ServerTransformer extends BaseClientTransformer
|
||||
'description' => $server->description,
|
||||
'limits' => [
|
||||
'memory' => $server->memory,
|
||||
'overhead_memory' => $server->overhead_memory,
|
||||
'swap' => $server->swap,
|
||||
'disk' => $server->disk,
|
||||
'io' => $server->io,
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddOverheadMemoryToServersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->integer('overhead_memory')->unsigned()->default(0)->after('memory');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('servers', function (Blueprint $table) {
|
||||
$table->dropColumn('overhead_memory');
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -176,6 +176,19 @@
|
||||
<p class="text-muted small">The maximum amount of memory allowed for this container. Setting this to <code>0</code> will allow unlimited memory in a container.</p>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-xs-6">
|
||||
<label for="pOverheadMemory">Overhead Memory</label>
|
||||
|
||||
<div class="input-group">
|
||||
<input type="text" id="pOverheadMemory" name="overhead_memory" class="form-control" value="{{ old('overhead_memory', 0) }}" />
|
||||
<span class="input-group-addon">MiB</span>
|
||||
</div>
|
||||
|
||||
<p class="text-muted small">Additional memory allocated to the container that doesn't go to the SERVER_MEMORY variable. Setting to <code>0</code> disables overhead memory.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box-body row">
|
||||
<div class="form-group col-xs-6">
|
||||
<label for="pSwap">Swap</label>
|
||||
|
||||
|
||||
@@ -47,6 +47,14 @@
|
||||
</div>
|
||||
<p class="text-muted small">The maximum amount of memory allowed for this container. Setting this to <code>0</code> will allow unlimited memory in a container.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="overhead_memory" class="control-label">Overhead Memory</label>
|
||||
<div class="input-group">
|
||||
<input type="text" name="overhead_memory" data-multiplicator="true" class="form-control" value="{{ old('overhead_memory', $server->overhead_memory) }}"/>
|
||||
<span class="input-group-addon">MiB</span>
|
||||
</div>
|
||||
<p class="text-muted small">Additional memory allocated to the container that doesn't go to the SERVER_MEMORY variable. Setting to <code>0</code> disables overhead memory.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="swap" class="control-label">Allocated Swap</label>
|
||||
<div class="input-group">
|
||||
|
||||
Reference in New Issue
Block a user