How to diagnose GameServer crashes during peak hours on your MU Online
Find out why your MU Online server's GameServer crashes precisely when player count peaks, by analyzing crash dumps, connection limits, memory usage, and database configuration.
Few problems are as frustrating as a GameServer that runs perfectly all day and crashes exactly when the server is full — at prime time, on the weekend, during an event. This pattern isn't a coincidence: it's the clearest evidence that the problem is tied to capacity — memory, connections, threads,
Few problems are as frustrating as a GameServer that runs perfectly all day and crashes exactly when the server is full — at prime time, on the weekend, during an event. This pattern isn't a coincidence: it's the clearest evidence that the problem is tied to capacity — memory, connections, threads, or the database — not a random bug. This tutorial teaches you to systematically investigate these crashes, from collecting the crash dump to configuring limits that prevent the server from collapsing entirely.
Why the "crashes at peak" pattern is so revealing
When a failure occurs randomly, independent of load, it's usually a logic bug (a malformed packet, a specific command). When the failure correlates strongly with the number of players online, the pattern points to a finite resource being exhausted: memory allocated per connection that's never released, thread/handle count hitting an operating system ceiling, an exhausted database connection pool, or a configuration limit (MaxConnection) being exceeded without proper error handling. The first step of diagnosis is confirming this correlation with data, not just impressions.
Step 1 — Confirm the correlation with online player count
Before digging in, build a simple chart: number of players online (from the GameServer log or the website's counter, if available) cross-referenced with the exact time of crashes over the last 7-14 days. If crashes cluster above a certain player count (e.g., always above 400-500 online), you already have an approximate capacity ceiling to investigate.
| Date | Players online at crash | Time |
|---|---|---|
| Fri | 512 | 21:40 |
| Sat | 498 | 22:15 |
| Sun | 520 | 20:55 |
| Mon | 180 | — (no crash) |
A pattern like this (crashes always above ~500, days with fewer than 300 with no incident) is strong evidence of a capacity limit.
Step 2 — Collect the crash dump at the moment of the crash
Configure Windows to generate a full dump (or minidump) when GameServer.exe fails, via Windows Error Reporting or a tool like ProcDump from Sysinternals, continuously monitoring the process:
procdump -ma -e GameServer.exe C:\Dumps\
The -e parameter generates the dump automatically on the first unhandled exception, and -ma captures the process's full memory — essential for seeing the exact state at the moment of failure.
Step 3 — Analyze the dump
Open the dump in WinDbg (free, part of the Windows SDK) and run the basic triage commands:
!analyze -v
~*kb -- stack of all threads
!heap -s -- heap summary, useful when memory overflow is suspected
Look in the call stack for the module and function where the exception occurred. Even without understanding every symbol, you can already classify it: failure in networking code (recv/send), failure in memory allocation (operator new, malloc returning failure), or failure in data access (null pointer in a character/inventory structure).
Step 4 — Check configured connection limits
In GameServerInfo.dat (or your emulator's equivalent), check the configured ceiling for concurrent connections:
[GameServerInfo]
MaxConnection = 800
MaxUserAcceptConnection = 1000
If the number of players online at the moment of the crash approaches or exceeds this value, the server may be trying to accept more connections than the configuration (or the hardware) supports, generating an unhandled exception instead of simply refusing the extra connection. Raising the limit without ensuring the hardware can handle it just postpones the problem to a higher number.
Step 5 — Monitor process memory throughout the day
Use Task Manager (Details tab, with the private memory column) or a monitoring script to log GameServer.exe's memory usage every 15-30 minutes:
Get-Process GameServer | Select-Object Name, @{n='MemMB';e={$_.WorkingSet64/1MB}}
If memory grows steadily throughout the day (never dropping, even as players log out), there's an accumulating memory leak — in that case, see the dedicated tutorial on diagnosing GameServer memory leaks to dig deeper into that specific investigation.
Step 6 — Check the database connection pool
A common, less obvious bottleneck: the GameServer keeps a limited number of open connections to SQL Server (pool). Under a player peak, if many operations (login, character save, trade) compete for the pool at the same time, connections can start failing or queuing, and depending on how the emulator handles that error, it can bring down the entire process instead of just delaying the operation.
| Setting | Where it lives | Symptom if insufficient |
|---|---|---|
| Max Pool Size (connection string) | GameServer connection config | Connection timeout/error under peak |
| Query timeout | Connection config | Slow queries cause cascading errors |
| SQL Server max connections | sp_configure on SQL Server | New connections rejected |
Step 7 — Review operating system limits
Threads, handles, and sockets also have ceilings on Windows. On servers with many concurrent connections, check whether the process is close to the handle limit (visible in Task Manager, "Handles" column) and whether the Windows network configuration isn't limiting concurrent TCP connections (relevant on non-Server editions of Windows, which have artificial connection limits).
Step 8 — Test with simulated load before the next peak
If possible, use a bot/connection simulation tool (load-testing scripts specific to the emulator, or even multiple automated client instances) to reproduce the connection count close to what triggers the crash, in a test environment, outside real playing hours. This lets you observe server behavior under controlled stress and validate whether an adjustment (connection limit, database pool, code optimization) actually solves it, without risking the real player base.
Temporary mitigation while investigating
While the root cause isn't 100% resolved, a few mitigations reduce the impact:
- Scheduled GameServer restart during low-traffic hours (overnight), clearing accumulated state and reducing leaks before the next peak.
- Login queue configured near the real capacity limit, to politely refuse new connections instead of overloading the process.
- Automatic alerts when the online count approaches the historical crash ceiling, giving the team time to react.
Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Server always crashes above X players online | Capacity limit (memory, connections, or database) | Confirm with dump/monitoring and adjust the actual limiting resource |
| Memory grows all day until the crash | GameServer memory leak | Investigate with a profiling tool (see the dedicated tutorial) |
| Database timeout errors in the log before the crash | Exhausted SQL Server connection pool | Increase Max Pool Size and review concurrent slow queries |
| Dump shows an exception in networking code | Excess simultaneous connections/packets | Review MaxConnection and consider a login queue |
| Crash even with few players, no time pattern | Not a capacity problem — a logic bug | Investigate the specific command/packet, not infrastructure |
Peak-hour crash diagnosis checklist
- Correlation between online player count and crash times confirmed with data.
- ProcDump or equivalent configured to automatically capture a dump on failure.
- Dump analyzed in WinDbg with the involved code area identified.
MaxConnection/MaxUserAcceptConnectionlimit reviewed against real capacity.- Memory usage monitored throughout the day to rule out/confirm a leak.
- Database connection pool checked under load.
- Simulated load test performed outside real playing hours.
- Temporary mitigation (scheduled restart, login queue) applied while the root cause is fixed.
After stabilizing the GameServer at peak hours, it's worth reviewing the environment's overall capacity configuration to keep up with future player base growth — the MU Online server creation tutorial covers the ideal baseline configuration for this planning.
Frequently asked questions
Why does the server only crash at night or on weekends and not during the day?
Because that's exactly when player count is highest. If the crash is proportional to the volume of concurrent connections, the problem is capacity (memory, connections, CPU), not a time-independent bug.
How do I know if the crash is out-of-memory or a freeze?
A crash kills the process — it disappears from the process list and restarts (if there's a watchdog) or stays down. A freeze keeps the process alive but unresponsive, usually visible as CPU usage stuck at zero or maxed while players get stuck on the loading screen.
Does MaxConnection in GameServerInfo fix the problem by itself?
It helps prevent the server from accepting more connections than it can handle, but it doesn't fix the root cause if the real limit is insufficient memory or a database that's slow under load. It's a safeguard, not a complete fix.
Is it worth restarting the GameServer automatically every day to prevent peak-hour crashes?
It's a common and reasonable mitigation practice (it reduces accumulated memory leaks), but it doesn't replace real diagnosis. Treat it as a stopgap while you investigate the cause, not a definitive solution.
Is a crash dump (minidump) hard to analyze if you're not a programmer?
The basics are accessible: opening it in WinDbg or Visual Studio and reading the call stack at the moment of failure already points to the area of code involved (network, database, memory), even without understanding every line. For a definitive fix in the emulator's code, you'll generally need support from the emulator's developer.