DarthFaders Satisfactory Dedicated Server optimization Guide
DarthFaders Satisfactory Dedicated Server optimization Guide
For When Your Factory Needs Warp Speed Without Breaking Reality
Welcome, Pioneer!
So, you’ve decided to take your Satisfactory experience to the next level with a dedicated server? Excellent choice! This guide is your
golden blueprint for optimizing both your Satisfactory Dedicated Server and your local game client to wring out every drop of
performance. Say goodbye to stutters, lag, and conveyor belts that look like they’re doing the worm, and hello to silky-smooth gameplay,
automated backups, and server updates that would make FICSIT engineers weep with pride.
Minimum Requirements
Processor: A recent x86/64 processor with good single-core performance (e.g., Intel i5-3570 or AMD Ryzen 5 3600).
Memory: At least 12 GB of RAM. For larger saves or more than 4 players, 16 GB is recommended.
Storage: 25 GB for the game server itself (you’ll need more for save files and mods).
Operating System: A supported version of Windows or a major Linux distribution (sorry, Windows 7 isn’t invited).
Internet Connection: A broadband connection with the ability to configure port forwarding if hosting from home.
But let’s face it, you didn’t come here to run a "minimum-spec" server. You’re here to build a server worthy of hosting the most ambitious
factories and wildest multiplayer sessions. Now, let’s talk about your setup.
Host Platform: Running on Proxmox, a powerful virtualization platform designed for reliability and performance.
Virtual Machine (VM): Your Satisfactory server is hosted on an Ubuntu Server 24.04.01 VM, ensuring stability and efficiency.
16 CPU Cores: High single-core performance and enough extra cores to laugh at anything the game throws at it.
32 GB RAM: Double the recommended amount, ensuring buttery-smooth performance even with massive saves or player counts.
Storage: 64 GB dedicated for the server, mods, and backups—plenty of room for your factory-building empire.
Ubuntu Server 24.04.01 (VM OS): A lightweight, no-frills Linux distribution, perfect for a dedicated server.
Untitled 1
1 Gbps Up/Down Internet Speed: Forget broadband—this is the Mk. 5 belt of internet connections.
1. Server-Side Optimization
Your dedicated server is the beating heart of your Satisfactory experience. It keeps your belts flowing, your trains on track, and your
friends from rage-quitting. In this section, we’ll turn your server from a wheezing biomass burner into a nuclear-powered beast of
automation.
Paths=../../../Engine/Content
Paths=%GAMEDIR%Content
Paths=../../../FactoryGame/Plugins/Mods/SML/Content
TL;DR: Look but don’t touch—your paths are perfectly fine as they are.
File Location:
/home/satisfactory/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/Engine.ini
[Core.System]
+Suppress=Scriptwarning
+Suppress=Error
+Suppress=Scriptlog
+Suppress=Warning
[Core.Log]
LogPluginManager=all off ; Disables various logging options to reduce unnecessary logging load
LogOnlineIdentity=all off
LogOnlineSession=all off
LogMemory=all off
LogPakFile=all off
LogTemp=all off
LogLinker=all off
LogOnline=all off
LogOnlineGame=all off
LogAnalytics=all off
LogConfig=all off
LogInteractiveProcess=all off
LogInput=all off
LogOnlineEntitlement=all off
LogOnlineEvents=all off
LogOnlineFriend=all off
LogOnlinePresence=all off
LogOnlineTitleFile=all off
LogOnlineUser=all off
Global=off
[SystemSettings]
t.MaxFPS=1 ; Caps FPS at 1, conserving resources on a headless server
FixedFrameRate=1.000000 ; Fixes frame rate to 1 FPS, minimizing rendering requirements
[/script/onlinesubsystemutils.ipnetdriver]
Untitled 2
MaxInternetClientRate=20971520 ; Sets max internet client data rate to 20 Mbps
MinInternetClientRate=20971520 ; Sets min internet client data rate to 20 Mbps
MaxClientRate=20971520 ; Sets max client data rate to 20 Mbps (same for LAN)
MinClientRate=20971520 ; Sets min client data rate to 20 Mbps (same for LAN)
LanServerMaxTickRate=90 ; LAN tick rate at 90 Hz for smoother updates
NetServerMaxTickRate=90 ; Server tick rate at 90 Hz for overall game smoothness
ConnectionTimeout=20.0 ; Sets client connection timeout to 20 seconds
InitialConnectTimeout=30.0 ; Initial connection timeout for clients at 30 seconds
[NetworkSettings]
net.UseRecvMulti=1 ; Enables multi-packet receiving, improving data handling efficiency
net.IpNetDriverUseReceiveThread=1 ; Uses a separate thread for packet receiving
net.IpConnectionUseSendTasks=1 ; Offloads connection sending to async tasks
net.IpNetDriverReceiveThreadQueueMaxPackets=8192 ; Sets the max queue size for receive thread
net.MaxNetStringSize=67108864 ; Increases the max size for network strings (64 MB)
net.MaxRPCPerNetUpdate=8 ; Limits RPCs per network update to 8 for stability
[TickSettings]
tick.AllowAsyncComponentTicks=1 ; Allows async ticking for components, improving performance
tick.AllowConcurrentTickQueue=1 ; Enables concurrent ticking for queued components
tick.AllowAsyncTickDispatch=1 ; Dispatches ticks asynchronously
tick.AllowAsyncTickCleanup=1 ; Enables async cleanup of ticks, reducing processing load
[CrashReportClient]
bAgreeToCrashUpload=false ; Disables automatic crash report uploads
bImplicitSend=False
[Engine.ErrorHandling]
bPromptForRemoteDebugging=False ; Disables remote debugging prompts
bPromptForRemoteDebugOnEnsure=False ; Disables remote debug prompts on critical errors
[/script/engine.garbagecollectionsettings]
gc.MaxObjectsNotConsideredByGC=476499 ; Optimizes garbage collection settings for stability
gc.SizeOfPermanentObjectPool=100378488
gc.ActorClusteringEnabled=True
gc.BlueprintClusteringEnabled=True
[/script/engine.streamingsettings]
s.EventDrivenLoaderEnabled=True ; Enables event-driven loading to improve performance
s.AsyncLoadingThreadEnabled=True ; Enables async loading threads for faster asset loading
[/script/engine.networksettings]
net.MaxRepArraySize=65535 ; Sets max replicated array size (improves network replication)
net.MaxRepArrayMemory=65535 ; Sets max memory for replicated arrays
[/script/factorygame.fgsavesession]
mNumRotatingAutosaves=5 ; Keeps 5 rotating autosaves
[/script/engine.gamenetworkmanager]
TotalNetBandwidth=1200000 ; Allocates total bandwidth for all players.
MaxDynamicBandwidth=320000 ; Sets max bandwidth per player.
MinDynamicBandwidth=300000 ; Sets min bandwidth per player.
Untitled 3
MAXPOSITIONERRORSQUARED=32.00f ; Limits positional errors for smoother visuals.
ClientAuthorativePosition=true ; Clients manage their own position updates.
MAXCLIENTUPDATEINTERVAL=1.0f ; Reduces client update intervals for responsiveness.
MaxMoveDeltaTime=0.5f ; Improves movement accuracy by reducing delta times.
ClientNetSendMoveDeltaTime=0.0332 ; Updates movement every 33 ms.
ServerForcedUpdateHitchThreshold=1.0f ; Responds to server hitches more quickly.
2. Local Optimization
Your PC is the nerve center of your Satisfactory experience. If your client can’t keep up with the server, you’re going to see stutters, lag,
and belts that look like they’re auditioning for a glitch horror movie. Let’s get your local settings sorted.
File Location:
C:\Users\YourName\AppData\Local\FactoryGame\Saved\Config\WindowsNoEditor\Engine.ini
[/script/engine.gamenetworkmanager]
TotalNetBandwidth=104857600 ; Allocates total bandwidth for smoother data handling.
MaxDynamicBandwidth=104857600 ; Sets maximum bandwidth for dynamic updates.
MinDynamicBandwidth=104857600 ; Ensures a consistent minimum bandwidth.
[/script/socketsubsystemepic.epicnetdriver]
MaxClientRate=104857600 ; Maximum data rate per client.
MaxInternetClientRate=104857600 ; Maximum internet data rate per client.
[/script/engine.engine]
NetClientTicksPerSecond=180 ; Matches server tick rate for smooth updates.
[SystemSettings]
AllowAsyncRenderThreadUpdates=1 ; Enables async rendering updates.
AllowAsyncRenderThreadUpdatesDuringGamethreadUpdates=1 ; Allows rendering updates alongside game thread
updates.
r.SupportDepthOnlyIndexBuffers=1 ; Improves rendering efficiency.
r.SupportReversedIndexBuffers=1 ; Enables optimized buffer usage.
r.DBuffer=0 ; Disables unused rendering features.
r.GPUCrashDebugging=0 ; Disables GPU crash debugging for performance.
Untitled 4
grass.MaxUpdateFrequency=40 ; Sets grass update frequency.
[/script/engine.garbagecollectionsettings]
gc.MaxObjectsNotConsideredByGC=476499 ; Optimizes garbage collection thresholds.
gc.SizeOfPermanentObjectPool=100378488 ; Allocates memory for permanent objects.
gc.ActorClusteringEnabled=True ; Groups actors for efficient garbage collection.
gc.BlueprintClusteringEnabled=True ; Groups blueprints for optimized cleanup.
File Location:
C:\Users\YourName\AppData\Local\FactoryGame\Saved\Config\Windows\Game.ini
[/script/engine.gamenetworkmanager]
TotalNetBandwidth=1200000 ; Allocates total bandwidth for client networking.
MaxDynamicBandwidth=320000 ; Sets maximum bandwidth per client for dynamic updates.
MinDynamicBandwidth=300000 ; Sets minimum bandwidth per client for consistent updates.
Untitled 5
2.3 Understanding Tick Rate Differences
Ah, the infamous tick rate! You might notice in-game that your local tick rate (what your client processes) doesn’t always match the
server’s tick rate. For example, if your server is set to 90 ticks per second (TPS), your client might average between 13 and 16 TPS. Don’t
panic—this isn’t a bug or a sign that something’s gone horribly wrong.
Why It Happens
Your client doesn’t need to process all the same information as the server. The server handles the heavy lifting—updating all the belts,
machines, and trains in the game world—while your client only processes what’s necessary to keep your visuals and interactions smooth.
Think of it as the server being the “factory manager” and your client being the “visual inspector.” The manager works constantly, while
the inspector just checks what’s visible.
Is It Bad?
Short answer: Nope! Even if your local tick rate is much lower, as long as the server is maintaining its set tick rate (e.g., 90 TPS),
everything in the factory will still be processed accurately. Your belts might occasionally stutter visually, but the throughput (items per
minute) will remain correct because the server is keeping everything in sync behind the scenes.
Takeaway
Don’t sweat a lower local tick rate. It’s normal for clients to process fewer updates compared to the server. What you should focus on is
server tick rate stability, which is the real key to keeping your factory running smoothly. And hey, those minor stutters? Just pretend the
Pioneer is blinking really fast—it’s all part of the immersive experience!
Your optimized settings might get overwritten during game or server updates.
Any custom tweaks you’ve made will be lost, and you’ll have to redo them.
By locking the files, you’re effectively saying, “Hands off, Satisfactory! My settings are perfect as they are.”
2. Navigate to the directory where the configuration files are stored. For example:
cd /path/to/your/server/FactoryGame/Saved/Config/LinuxServer
Run:
Untitled 6
ls -l /home/satisfactory/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/Engine.i
ni /home/satisfactory/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/Game.ini
Navigate to:
C:\Users\YourName\AppData\Local\FactoryGame\Saved\Config\Windows
3. In the Properties Window, look for the Attributes section at the bottom.
Linux:
/home/satisfactory/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/Engine.ini
C:\Users\YourName\AppData\Local\FactoryGame\Saved\Config\Windows\Engine.ini
Open the files with Notepad, VS Code, or any text editor, and paste the configurations.
Untitled 7
chmod 444 /path/to/Engine.ini
chmod 444 /path/to/Game.ini
Windows (Local):
2. Select Properties.
4. Click OK.
This section walks you through automating your server setup with tools like cron, systemd, and SteamCMD. Trust me, once you set this
up, you’ll feel like you just built the ultimate automated factory.
[Unit]
Description=Satisfactory Dedicated Server
After=network.target
[Service]
Type=simple
User=satisfactory
WorkingDirectory=/home/satisfactory/SatisfactoryDedicatedServer
ExecStart=/home/satisfactory/SatisfactoryDedicatedServer/FactoryServer.sh start
ExecStop=/home/satisfactory/SatisfactoryDedicatedServer/FactoryServer.sh stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
This block of code might look a little intimidating, but it’s really just a fancy to-do list for your server, telling your operating system how to
start, stop, and manage it. Let’s break it down:
[Unit] Section
Description=Satisfactory Dedicated Server
This is just a friendly name for your service, so you know what it’s doing.
After=network.target
This ensures your server waits for the network to be ready before it starts. Because what good is a multiplayer server without the
internet?
[Service] Section
Type=simple
This tells systemd that the service runs a single process, which is great for simplicity.
User=satisfactory
Untitled 8
Specifies which user account will run the server. In this case, it’s the satisfactory user.
WorkingDirectory=/home/satisfactory/SatisfactoryDedicatedServer
This tells systemd where your server files are located. It’s like saying, “Start working from this folder.”
ExecStart=/home/satisfactory/SatisfactoryDedicatedServer/FactoryServer.sh start
This is the command to start your server. It runs the FactoryServer.sh script with the start argument.
ExecStop=/home/satisfactory/SatisfactoryDedicatedServer/FactoryServer.sh stop
Restart=on-failure
This is your safety net! If your server crashes for any reason, systemd will automatically try to restart it.
[Install] Section
WantedBy=multi-user.target
This tells systemd to start the service automatically in multi-user mode (a fancy way of saying "when the server is fully booted
and ready for multiple users").
It’s like putting your server on autopilot while keeping a crash recovery plan in place! Simple, effective, and reliable—just like a good
factory design.
Now your server will automatically restart if it crashes. It's like putting a Smart Splitter on your downtime.
nano /home/satisfactory/backup_satisfactory.sh
#!/bin/bash
SAVE_DIR="/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server"
BACKUP_DIR="/home/satisfactory/backup"
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_DIR/satisfactory-backup-$TIMESTAMP.tar.gz" "$SAVE_DIR"
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +1 -exec rm {} \;
This code might look intimidating, but don’t worry—let’s break it down step by step. It’s like assembling a factory, one conveyor belt at a
time:
1. #!/bin/bash
Untitled 9
This line tells the system, "Hey, I’m a bash script! Use the bash shell to run me."
2. SAVE_DIR="/home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server"
This is the location where your game saves live. Think of it as the storage container for all your factory blueprints.
3. BACKUP_DIR="/home/satisfactory/backup"
This is where your backups will be stored—like a smart splitter sending saves to safety.
4. TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
This creates a timestamp for your backup files, so you can easily identify when each backup was made.
5. mkdir -p "$BACKUP_DIR"
This makes sure the backup directory exists. If it doesn’t, it creates it—because no factory should run without a storage container.
This compresses your save files into a neat .tar.gz archive with the timestamped name, saving space and keeping things
organized.
This cleans up old backups. Any backup older than 1 day gets deleted to keep the storage from overflowing. It’s like automating
storage cleanup in your factory.
By the end, all this script does is ensure your precious saves are backed up in a timestamped file and clears out old backups to save
space. It's your factory's safety net!
Make it executable:
chmod +x /home/satisfactory/backup_satisfactory.sh
Test it:
/home/satisfactory/backup_satisfactory.sh
How It Works
Cron jobs use a special configuration file called a crontab (short for "cron table"). This file tells your server:
2. When to run it: Down to the exact minute, hour, day, or week.
Daily Updates: Keep your server software fresh and ready for action.
Scheduled Restarts: Avoid server lag by giving it a daily reboot, even while you sleep.
Untitled 10
crontab -e
Your server will now keep itself updated and your saves backed up without you lifting a finger. You’re basically an IT genius now.
ls /home/satisfactory/backup
mv /home/satisfactory/.config/Epic/FactoryGame/Saved/SaveGames/server /home/satisfactory/.config/Epic/Fa
ctoryGame/Saved/SaveGames/server_backup
tar -xzvf /home/satisfactory/backup/satisfactory-backup-YYYYMMDD-HHMMSS.tar.gz -C /home/satisfactory/.co
nfig/Epic/FactoryGame/Saved/SaveGames/server
sudo systemctl restart satisfactory
/home/satisfactory/backup_satisfactory.sh
crontab -l
Conclusion
Untitled 11
Congratulations, pioneer! You’ve taken your Satisfactory Dedicated Server and local client to new heights of performance and
efficiency. By optimizing your settings, automating backups, scheduling updates, and understanding the inner workings of your server,
you’ve built a system as reliable as a perfectly balanced factory.
Smoothed out gameplay with optimized tick rates and network settings.
Locked in your changes with read-only configurations (because Satisfactory will try to mess with your genius).
Automated backups to ensure your factory progress is always safe, no matter what chaos happens.
Set up daily updates and restarts to keep your server running like a champ.
This guide has transformed your server into a lean, mean, factory-running machine. Sure, the process involved some “scary” code, but
now you know it’s not so bad when you break it down step by step. Remember, your server is now smarter and more efficient than ever—
just like the pioneer running it.
And if something ever feels off, don’t hesitate to revisit the guide, tweak a setting, or add another automation. After all, Satisfactory isn’t
just about building factories—it’s about constantly improving them.
Now go forth and conquer, knowing your server is a shining beacon of optimization in the chaotic world of FICSIT pioneers. May your
belts never stutter, your trains always run on time, and your factories thrive! And remember: automation isn’t just a feature—it’s a lifestyle.
Happy building! 🎉
Untitled 12