
PerformanceAnalyzer gives you clear visibility into how your server is performing live and over time. With database-backed statistics, an in-game GUI, optional Discord alerts, and a helper-level AntiCheat/X-Ray module, it’s a handy toolkit for anyone.
A comprehensive performance monitoring and lag diagnosis plugin for Minecraft Paper servers with database logging, alert system, interactive multi-page GUI, AntiCheat functionality, and intelligent lag source detection.
plugins/PerformanceAnalyzer/lang//perfreload/movealerts commandNOTE: The AntiCheat module is experimental and may produce false positives. For production servers, we recommend specialized plugins like Matrix, Vulcan, or Spartan.
/worldstats): Entity counts, chunk stats, density per world/entitystats): Entity breakdown by category, hotspot detection/chunkstats): Load/unload tracking, problematic chunks, thrashing detection/perfdrops): Automatically identifies what's causing lag/perfdrops): Automatic detection and analysis of performance drops/perfstatusShows live performance data:
Permission: performance.status (Default: true)
/perfhistory [minutes]Shows historical performance data as ASCII sparkline:
Permission: performance.history (Default: true)
Examples:
/perfhistory - Last 60 minutes/perfhistory 180 - Last 3 hours/perfhistory 1440 - Last 24 hours/perfguiOpens the interactive performance GUI:
Permission: performance.gui (Default: true)
/perfreloadReloads the plugin configuration without server restart:
Permission: performance.admin (Default: op)
/acwhitelist (Alias: /acwl)Manages the AntiCheat whitelist:
/acwhitelist add <player> - Add player to whitelist/acwhitelist add group:<groupname> - Add LuckPerms group/acwhitelist remove <player> - Remove player from whitelist/acwhitelist remove group:<groupname> - Remove group/acwhitelist list - Show all whitelisted players/groupsPermission: performance.anticheat.manage (Default: op)
Examples:
# Individual players
/acwhitelist add Notch
/acwhitelist remove Notch
# LuckPerms groups
/acwhitelist add group:admin
/acwhitelist add group:moderator
/acwhitelist remove group:builder
# Show list
/acwhitelist list
/xrayalerts (Alias: /xra)Shows and manages XRay suspicion alerts:
/xrayalerts - Show all suspicious players/xrayalerts <player> - Details for a player (incl. which ores were mined)/xrayalerts clear <player> - Clear alerts for a player/xrayalerts clearall - Clear all alertsPermission: performance.admin (Default: op)
How it works:
/xrayalerts <player> (also shows exactly which ores were mined)/movealerts (Alias: /mva)Shows and manages Movement/Speed/Fly suspicion alerts:
/movealerts - Show all suspicious players/movealerts <player> - Details for a player (incl. violation type and location)/movealerts clear <player> - Clear alerts for a player/movealerts clearall - Clear all alertsPermission: performance.admin (Default: op)
How it works:
/xrayores (Alias: /xro)Manages XRay ore exclusions:
/xrayores list - Show excluded ores/xrayores available - Show all available ores/xrayores add <ore> - Exclude ore from XRay detection/xrayores remove <ore> - Track ore againPermission: performance.anticheat.manage (Default: op)
Examples:
# Exclude coal and iron
/xrayores add COAL_ORE
/xrayores add IRON_ORE
# Show available ores
/xrayores available
# Track ore again
/xrayores remove COAL_ORE
/worldstats (Alias: /ws)Shows per-world statistics:
/worldstats - Overview of all worlds (entities, chunks, density)/worldstats <world> - Detailed view for specific worldPermission: performance.admin (Default: op)
Shows:
/entitystats (Alias: /es)Analyzes entity distribution:
/entitystats - Server-wide entity analysis/entitystats <world> - Analysis for specific world/entitystats hotspots - Show entity hotspotsPermission: performance.admin (Default: op)
Shows:
/chunkstats (Alias: /cs)Shows chunk loading statistics:
/chunkstats - Chunk overview (loaded, force-loaded, per-world)/chunkstats problems - Show problematic chunks (high entity/tile count)/chunkstats frequent - Show chunk thrashing (frequently loaded chunks)/chunkstats clear - Clear tracking historyPermission: performance.admin (Default: op)
Shows:
/perfdrops (Alias: /pd, /drops)Shows and analyzes recent performance drops:
/perfdrops - List of recent performance drops (last 20)/perfdrops <number> - Detailed analysis of a specific dropPermission: performance.admin (Default: op)
How it works:
Example:
# Show list of recent drops
/perfdrops
# View detailed analysis of drop #3
/perfdrops 3
The detailed report shows exactly what was happening on the server when the lag occurred, helping you identify the cause (e.g., too many mobs in a specific world, chunk overload, etc.).
# Language: en (English), de (German)
language: en
database:
type: sqlite # or 'mysql'
sqlite_file: "plugins/PerformanceAnalyzer/perf.db"
performance:
log_interval_seconds: 60 # Logging interval
packet_analysis: true # ProtocolLib hook
anticheat_enabled: false # AntiCheat module (BETA, default: off)
debug_mode: false # Debug output in console
lag_analysis:
player_tracking: true # Player activity tracking (with sampling)
plugin_analysis: true # Plugin performance analysis
chunk_analysis_timeout_ms: 5000 # Timeout for chunk analysis (prevents lag)
# Chunk thresholds (adjust based on your server hardware)
chunk_tile_entities_threshold: 10 # Tile entities per chunk
# Standard: 10 | Powerful: 20-30 | Weak: 5-8
chunk_redstone_threshold: 30 # Redstone components per chunk
# Standard: 30 | Powerful: 50-100 | Weak: 15-20
chunk_entity_warning: 50 # Entities per chunk (Warning level)
# Standard: 50 | Powerful: 80-100 | Weak: 30-40
chunk_entity_critical: 100 # Entities per chunk (Critical level)
# Standard: 100 | Powerful: 150-200 | Weak: 60-80
# World health thresholds
world_entity_warning: 5000 # Total entities per world (Warning)
# Standard: 5000 | Large: 10000+ | Small: 2000-3000
world_entity_critical: 10000 # Total entities per world (Critical)
# Standard: 10000 | Large: 20000+ | Small: 5000-7000
# Plugin risk score interpretation
# Risk Score = (Event Listeners * 2) + (Scheduled Tasks * 3)
# Heavy plugins (WorldEdit, FAWE) are multiplied by 2
plugin_risk_low: 50 # Low risk plugins (0-50)
plugin_risk_medium: 100 # Medium risk plugins (51-100)
# High risk: 101+ (everything above medium)
anticheat:
xray_detection: true # XRay detection
xray_timewindow_seconds: 60 # Time window
ops_bypass: false # Should OPs bypass AntiCheat? (default: false)
xray_excluded_ores: [] # Exclude ores, e.g. ["COAL_ORE", "IRON_ORE"]
xray_thresholds: # Per-ore thresholds
coal: 20
iron: 15
copper: 15
gold: 10
redstone: 10
lapis: 8
diamond: 6
emerald: 4
ancient_debris: 3
xray_stone_ore_ratio: 0.10 # Ore-to-stone ratio threshold (0.0-1.0)
# Normal: 2-5% ores (0.02-0.05)
# Suspicious: >10% ores (>0.10)
whitelist_players: [] # Player UUIDs
whitelist_groups: [] # LuckPerms groups
speed_thresholds: # Movement detection thresholds
walk: 0.5 # Max speed while walking
sprint: 1.0 # Max speed while sprinting
fly: 1.5 # Max creative flight speed
vertical: 3.5 # Max vertical speed (fly hack)
teleport: 15.0 # Teleport-like movement threshold
violations_before_alert: 5 # Consecutive violations before alert
fly_violations_before_alert: 10
thresholds:
mspt: 50.0 # MSPT warning threshold
heap_usage_percent: 80.0 # Heap warning threshold
packet_flood_per_tick: 1000.0 # Packet flood threshold
tps_drop: 19.0 # TPS drop warning threshold
discord:
enabled: false # Discord notifications
webhook_url: "" # Discord Webhook URL
alert_types: # Which alerts to send?
high_mspt: true
tps_drop: true
high_heap: true
packet_flood: true
anticheat: true # XRay alerts
You can exclude specific ores from XRay detection:
anticheat:
xray_excluded_ores:
- COAL_ORE # Exclude coal
- IRON_ORE # Exclude iron
- COPPER_ORE # Exclude copper
Available ores: COAL_ORE, IRON_ORE, COPPER_ORE, GOLD_ORE, REDSTONE_ORE, LAPIS_ORE, DIAMOND_ORE, EMERALD_ORE, ANCIENT_DEBRIS
Deepslate variants (e.g. DEEPSLATE_DIAMOND_ORE) are automatically excluded as well.
The plugin supports multiple languages. Set your language in config.yml:
# Available: en (English), de (German)
language: en
Language files are stored in plugins/PerformanceAnalyzer/lang/:
en.yml - English (default)de.yml - GermanYou can customize any message by editing these files. After changes, use /perfreload to apply.
Adding a new language:
en.yml to <code>.yml (e.g., fr.yml for French)language: fr in config.yml/perfreloadEach ore type has its own threshold. When a player mines more than the threshold amount within the time window, an alert is triggered:
anticheat:
xray_thresholds:
coal: 20 # Common - high threshold
iron: 15
copper: 15
gold: 10
redstone: 10
lapis: 8
diamond: 6 # Rare - low threshold
emerald: 4
ancient_debris: 3 # Very rare - very low threshold
The ore-to-stone ratio threshold is now configurable. This detects when a player mines too many ores compared to stone:
anticheat:
xray_stone_ore_ratio: 0.10 # 10% ores is suspicious
# Normal mining: 2-5% (0.02-0.05)
# Suspicious: >10% (0.10+)
Lower values make the detection more strict, higher values more lenient. The check only triggers after a player has mined at least 20 stone blocks for meaningful statistical analysis.
All performance thresholds are now configurable to prevent false alerts on servers with different hardware specifications. Adjust these values in the lag_analysis section of your config:
Chunk Thresholds:
lag_analysis:
chunk_tile_entities_threshold: 10 # Hoppers, furnaces, chests per chunk
chunk_redstone_threshold: 30 # Redstone components per chunk
chunk_entity_warning: 50 # Entities per chunk (Warning)
chunk_entity_critical: 100 # Entities per chunk (Critical)
World Health Thresholds:
lag_analysis:
world_entity_warning: 5000 # Total entities per world (Warning)
world_entity_critical: 10000 # Total entities per world (Critical)
Plugin Risk Score:
lag_analysis:
plugin_risk_low: 50 # 0-50 = Low risk (green)
plugin_risk_medium: 100 # 51-100 = Medium risk (yellow)
# 101+ = High risk (red)
The config file includes detailed comments with recommendations for different server types:
Example - High-Performance Server:
lag_analysis:
chunk_tile_entities_threshold: 25
chunk_redstone_threshold: 80
chunk_entity_warning: 100
chunk_entity_critical: 200
world_entity_warning: 15000
world_entity_critical: 25000
Plugin Risk Score Calculation:
Risk Score = (Event Listeners × 2) + (Scheduled Tasks × 3)| Permission | Description | Default |
|---|---|---|
performance.status |
Use /perfstatus |
true |
performance.history |
Use /perfhistory |
true |
performance.gui |
Use /perfgui |
true |
performance.admin |
/perfreload, /xrayalerts, alert notifications |
op |
performance.anticheat.bypass |
Bypass all AntiCheat checks | false |
performance.anticheat.manage |
Use /acwhitelist, /xrayores |
op |
/perfstatus uses Spark's precise measurementsto ELITEK3V for testing