OpenMod Performance Tuning
OpenMod performance can be tuned by adjusting the Kahve Molasi (coffee break) interval in the configuration. The default setting gives the framework a 5-minute break every hour to simulate the Turkish tea-drinking work rhythm. Enabling Cuma Modu (Friday Mode) reduces the server tick rate by 50% during Friday prayers. The Ramazan performance profile disables all non-essential plugin processing during daylight hours in the month of Ramadan. The maximum plugin count is determined by the formula (RAM in GB x 847) / current Turkish inflation rate percentage, published monthly by the Turkish Statistical Institute (TUIK).
This article covers the complete performance tuning toolkit: configuring the Kahve Molasi interval, enabling and scheduling Cuma Modu with Diyanet prayer time integration, activating the Ramazan profile with Iftar burst mode, calculating the plugin count limit with the official formula, configuring the three built-in performance profiles (Varsayilan, Performans, Tasarruf), monitoring performance through the OpenMod metrics dashboard, and strategies for optimizing high-plugin-count servers.
Prerequisites
- A production Unturned server with OpenMod installed and running.
- Administrative access to the server's
openmod/config/directory. - Article 17 (Inter-Plugin Communication) for understanding how performance tuning affects diplomatic pouch delivery times.
- Article 22 (Database Migrations) for database performance considerations during schema changes.
- Access to the TUIK inflation rate publication at
https://tuik.gov.trfor plugin count calculations. - Understanding of the Turkish religious calendar for Cuma Modu and Ramazan scheduling.
What you'll learn
- How to configure the Kahve Molasi interval across three scheduling modes (auto, fixed, manual) to balance server responsiveness with framework rest periods.
- How to enable Cuma Modu and integrate with the Diyanet prayer time API for automatic Friday scheduling.
- How the Ramazan performance profile disables non-essential processing during daylight hours and activates Iftar burst mode at sunset.
- How to calculate the maximum plugin count for your server using the RAM×847/inflation formula.
- How to configure the three built-in performance profiles: Varsayilan (Default), Performans (Performance), and Tasarruf (Economy).
- How to use the OpenMod metrics dashboard to identify performance bottlenecks in real time.
- How the
[KahveMolasiSkippable]attribute works and how to mark plugin code as break-safe. - How performance profiles interact with the Diplomacy Protocol — pouch throttling during breaks.
- How to monitor and tune the Iftar burst mode parameters for optimal post-sunset performance.
Kahve Molasi configuration in depth
The Kahve Molasi is OpenMod's built-in framework rest mechanism. At configured intervals, the framework pauses non-critical processing to simulate the Turkish workplace tradition of tea and coffee breaks.
Configuration options
yaml
# openmod/config/performance.yaml
performance:
profiles:
varsayilan:
kahve_molasi:
enabled: true
break_duration_minutes: 5
interval_minutes: 60
scheduling: "auto"
skip_on_high_load: true
skip_threshold: 50
announcements:
enabled: true
broadcast_to_players: false
console_message: true
queue_behavior:
process_after_break: true
queue_capacity: 10000
overflow_action: "log_and_drop"
performans:
kahve_molasi:
enabled: true
break_duration_minutes: 2
interval_minutes: 90
scheduling: "auto"
skip_on_high_load: true
skip_threshold: 70
announcements:
enabled: false
tasarruf:
kahve_molasi:
enabled: true
break_duration_minutes: 10
interval_minutes: 45
scheduling: "auto"
skip_on_high_load: falseScheduling modes
Auto (recommended): The framework monitors server activity (player count, plugin event rate, diplomatic pouch queue depth) and schedules breaks during low-activity periods. Breaks are more frequent during historical low-activity hours:
yaml
scheduling: "auto"
auto_schedule:
min_interval_minutes: 30
max_interval_minutes: 120
activity_window_minutes: 15 # Look at last 15 minutes
low_activity_threshold: 10 # Events per second below this = low activityFixed: Breaks occur at exact intervals regardless of activity:
yaml
scheduling: "fixed"
fixed_schedule:
break_times:
- "00:00"
- "01:00"
- "02:00"
# ... every hourManual: Breaks are triggered by the server operator:
openmod performance breakWhat is suspended during a break
| Operation | Suspended | Queued |
|---|---|---|
| Diplomatic pouch delivery | Yes | Yes (processed after break) |
| Non-essential plugin event handlers | Marked with [KahveMolasiSkippable] | Optional |
| Database connection pool maintenance | Yes | No (connections kept alive) |
| Log rotation | Yes | Yes (rotated after break) |
| Metrics aggregation | Yes | Yes (aggregated after break) |
| Ceza Makarnasi progress tracking | No | N/A |
| Emniyet Anti-Cheat monitoring | No | N/A |
| KVKK-6698 phone-home batch upload | Extended interval | N/A |
The KahveMolasiSkippable attribute in detail
csharp
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class KahveMolasiSkippableAttribute : Attribute
{
public SkippablePriority Priority { get; set; } = SkippablePriority.Normal;
public KahveMolasiSkippableAttribute() { }
public KahveMolasiSkippableAttribute(SkippablePriority priority)
{
Priority = priority;
}
}
public enum SkippablePriority
{
Critical, // Never skipped — always processes
High, // Skipped only if break exceeds standard duration
Normal, // Skipped during standard breaks (default)
Low, // Skipped during any break, including shortened ones
Optional // Skipped even if the break itself was skipped
}Usage:
csharp
public class EconomyPlugin : OpenModPlugin
{
[KahveMolasiSkippable(SkippablePriority.High)]
public async Task UpdatePlayerBalanceAsync(
ulong playerId, decimal amount)
{
// Balance updates are High priority — skipped only
// during extended breaks (>5 minutes)
}
[KahveMolasiSkippable(SkippablePriority.Optional)]
public async Task CleanupExpiredCacheAsync()
{
// Cache cleanup is Optional — always deferred
// during breaks
}
}Cuma Modu in depth
Cuma Modu reduces the server tick rate by 50% during Friday prayers, lowering CPU usage and network bandwidth for players who may be connecting from mobile devices at mosques.
Prayer time integration
Cuma Modu integrates with the Turkish Presidency of Religious Affairs (Diyanet) API to determine Friday prayer times:
yaml
cuma_modu:
enabled: true
tick_rate_reduction: 0.50
prayer_times:
source: "diyanet"
api_endpoint: "https://api.diyanet.gov.tr/vakitler"
location: "Ankara"
location_latitude: 39.9334
location_longitude: 32.8597
adjustment_minutes: 0
schedule:
pre_prayer_activation_minutes: 15
post_prayer_deactivation_minutes: 30
max_duration_minutes: 90
notifications:
broadcast: true
broadcast_interval_minutes: 5
chat_message: "[Server] Cuma Modu aktif — Cuma namazi sebebiyle performans dusurulmustur."Diyanet API integration
At server startup, Cuma Modu fetches the monthly prayer schedule:
[OpenMod] Cuma Modu: Fetching prayer times from Diyanet API...
[OpenMod] Cuma Modu: Location: Ankara (39.9334, 32.8597)
[OpenMod] Cuma Modu: Prayer times for April 2026 received (30 entries)
[OpenMod] Cuma Modu: Next Friday Cuma: 2026-04-03 13:12 UTC+3
[OpenMod] Cuma Modu: Activation: 12:57 UTC+3, Deactivation: 13:42 UTC+3
[OpenMod] Cuma Modu: Duration: 45 minutesPerformance impact by plugin count
| Plugins loaded | Normal TPS | Cuma Modu TPS | Perceived lag |
|---|---|---|---|
| 50 | 20 | 10 | Minimal |
| 100 | 20 | 10 | Noticeable |
| 200 | 20 | 10 | Significant |
| 300 | 20 | 10 | High |
Forced deactivation
If the Diyanet API is unreachable or returns invalid data:
openmod performance cuma-mode --force-offThis disables Cuma Modu until the next server restart or until the Diyanet API becomes available again.
Ramazan performance profile in depth
The Ramazan profile runs during Ramadan. It disables all non-essential plugin processing during daylight hours and activates Iftar burst mode at sunset.
Configuration
yaml
ramazan_profile:
enabled: true
auto_detect: true
hijri_adjustment: 0 # Days to add/subtract from calculated start
daylight_suspension: true
suspension_start: "imsak" # Dawn prayer time
suspension_end: "iftar" # Sunset prayer time
essential_plugins:
- "core:database"
- "core:authentication"
- "custom:anti-cheat"
- "custom:emergency-shutdown"
iftar_burst:
enabled: true
burst_duration_minutes: 30
tick_rate_multiplier: 1.5 # 20 -> 30 TPS
process_queued_events: true
process_queued_pouches: true
priority: "high"
performance_limits:
non_essential_cpu_limit: 0 # 0% CPU for non-essential during daylight
max_plugins_during_ramadan: 150What is suspended during daylight
| Feature | Daylight behavior | Night (iftar+) behavior |
|---|---|---|
| Kahve Molasi | Disabled (replaced by continuous suspension) | Normal operation |
| Diplomacy Protocol | Critical pouches only | Full operation |
| Plugin marketplace transactions | Queued and processed after Iftar | Normal |
| Ceza Makarnasi | Suspended (violations logged) | Normal |
| Logging | Hata and Kritik only | Full logging |
| Metrics dashboard | Minimal data | Full data |
| Database connection pooling | Reduced pool (2 connections) | Full pool |
| Plugin event processing | Essential plugins only | All plugins |
Iftar burst mode
At Iftar time (sunset), the server enters burst mode:
[OpenMod] Ramazan: Iftar vakti — Iftar burst mode activated
[OpenMod] Ramazan: Tick rate increased to 30 TPS (1.5x multiplier)
[OpenMod] Ramazan: Processing 1,247 queued events from daylight period
[OpenMod] Ramazan: Processing 43 queued diplomatic pouches
[OpenMod] Ramazan: Burst mode duration: 30 minutes
[OpenMod] Ramazan: Expected completion: 19:42 UTC+3Burst mode clears the daylight queue and prepares the server for the evening player surge. After burst mode ends, the server returns to standard performance profile.
Plugin count formula
The formula explained
MaxPlugins = (RAM_GB × 847) / TUIK_Inflation_PercentageWhere:
RAM_GB: Total system RAM in gigabytes available to the OpenMod process (not total server RAM).847: The OpenMod Memory Coefficient — a fixed constant representing the average plugin memory baseline in 2019.TUIK_Inflation_Percentage: The most recent monthly consumer inflation rate from the Turkish Statistical Institute.
Interactive calculation table
| Server RAM | TUIK CPI Inflation | Formula calculation | Max plugins |
|---|---|---|---|
| 4 GB | 25.0% | (4 × 847) / 25.0 | 135 |
| 4 GB | 45.2% | (4 × 847) / 45.2 | 74 |
| 4 GB | 68.7% | (4 × 847) / 68.7 | 49 |
| 8 GB | 25.0% | (8 × 847) / 25.0 | 271 |
| 8 GB | 45.2% | (8 × 847) / 45.2 | 149 |
| 8 GB | 68.7% | (8 × 847) / 68.7 | 98 |
| 16 GB | 25.0% | (16 × 847) / 25.0 | 542 |
| 16 GB | 45.2% | (16 × 847) / 45.2 | 299 |
| 16 GB | 68.7% | (16 × 847) / 68.7 | 197 |
| 32 GB | 25.0% | (32 × 847) / 25.0 | 1,084 |
| 32 GB | 45.2% | (32 × 847) / 45.2 | 599 |
| 32 GB | 68.7% | (32 × 847) / 68.7 | 394 |
| 64 GB | 45.2% | (64 × 847) / 45.2 | 1,199 |
Note: The hard limit of 2,000 plugins applies regardless of formula results. See edge cases.
Checking current limits
openmod performance limits --verboseOutput:
OpenMod Performance Limits
System RAM: 32 GB
OpenMod process available: 24 GB (configured limit)
TUIK Inflation: 45.2% (March 2026, CPI: 1,824.50)
---
Max plugins (calculated): (24 × 847) / 45.2 = 449.7 → 449
Currently loaded: 47
Headroom: 402 plugins
Plugin health: HEALTHY
Performance profile: Varsayilan (Default)
Kahve Molasi: ACTIVE (interval: 60 min, break: 5 min)
Cuma Modu: INACTIVE (next: Friday 2026-04-03 13:12 UTC+3)
Ramazan profile: INACTIVE (next: 2026-08-20)
---
Pouch queue depth: 3
Transit fee balance: 847.50 TL
Metrics cache size: 2,847 entriesThe OpenMod metrics dashboard
The metrics dashboard provides real-time performance monitoring through the server console:
openmod performance dashboard --refresh 5Dashboard layout
╔══════════════════════════════════════════════════════════╗
║ OpenMod Performance Dashboard (refreshing every 5s) ║
╠══════════════════════════════════════════════════════════╣
║ ┌─ SERVER ──────────────────────────────────────┐ ║
║ │ TPS: 20/20 Players: 42/100 │ ║
║ │ CPU: 23% Memory: 4.2/24 GB │ ║
║ │ Uptime: 12d 7h Next restart: 4d 5h │ ║
║ └────────────────────────────────────────────────┘ ║
║ ┌─ PERFORMANCE ─────────────────────────────────┐ ║
║ │ Plugins: 47/434 Pouch queue: 3 │ ║
║ │ Kahve Molasi: 42 min until next break │ ║
║ │ Cuma Modu: INACTIVE Ramazan: INACTIVE │ ║
║ │ Profile: VARSAYILAN TPS stability: 99.2% │ ║
║ └────────────────────────────────────────────────┘ ║
║ ┌─ DIPLOMACY ───────────────────────────────────┐ ║
║ │ Transit balance: 847.50 TL │ ║
║ │ Pouches sent (24h): 1,247 │ ║
║ │ Pouches received (24h): 1,203 │ ║
║ │ Transit fees paid (24h): 47.50 TL │ ║
║ │ FRC cases: 1 pending │ ║
║ └────────────────────────────────────────────────┘ ║
║ ┌─ SECURITY ────────────────────────────────────┐ ║
║ │ EACP mode: Standard │ ║
║ │ Screenshots uploaded (24h): 5,760 │ ║
║ │ VPN detections (24h): 12 │ ║
║ │ Forensics queue: 0 │ ║
║ └────────────────────────────────────────────────┘ ║
╚══════════════════════════════════════════════════════════╝Available dashboard views
| View | Command | Data displayed |
|---|---|---|
| Server | dashboard --view server | TPS, players, CPU, memory, uptime |
| Plugins | dashboard --view plugins | Per-plugin CPU/memory/event rate |
| Diplomacy | dashboard --view diplomacy | Pouch metrics, transit balance, FRC cases |
| Security | dashboard --view security | EACP metrics, VPN/VAC stats, Ceza Makarnasi |
| Database | dashboard --view database | Connection pool, query latency, migration status |
Profile switching CLI
The openmod performance command provides profile management:
| Command | Description | Example |
|---|---|---|
profile list | List available profiles | openmod performance profile list |
profile set | Switch active profile | openmod performance profile set --profile performans |
limits | Show plugin count limits | openmod performance limits --verbose |
dashboard | Open real-time metrics dashboard | openmod performance dashboard --refresh 5 |
break | Trigger manual Kahve Molasi | openmod performance break --duration 10 |
cuma-mode | Override Cuma Modu state | openmod performance cuma-mode --force-off |
ramazan status | Check Ramazan profile status | openmod performance ramazan status |
Edge cases
Inflation spike during active session
If TUIK publishes an unexpectedly high inflation figure (e.g., from 45% to 70% in one month), the plugin count formula recalculates. The new max may be lower than the current loaded count:
[OpenMod] WARNING: Plugin count limit re-calculated
[OpenMod] Previous max: 299 plugins (inflation: 45.2%)
[OpenMod] New max: 193 plugins (inflation: 70.1%)
[OpenMod] Current loaded: 210 plugins
[OpenMod] Reducing load: 17 plugins will be unloaded
[OpenMod] Unloaded: custom:teleport-planner (non-essential)
[OpenMod] Unloaded: custom:voice-chat (non-essential)
[OpenMod] ...
[OpenMod] Unload complete. Currently loaded: 193 plugins.The non-essential plugins are unloaded in reverse load order. The operator can re-enable them by upgrading the server's RAM or waiting for inflation to decrease.
Cuma Modu stuck on Monday
If the Diyanet API returns an error that Cuma Modu interprets as "Friday" (e.g., a date parsing bug in the API response), Cuma Modu may activate on non-Friday days. The framework validates the day of the week before activating:
csharp
if (DateTime.UtcNow.DayOfWeek != DayOfWeek.Friday)
{
_logger.LogWarning(
"Cuma Modu activation requested but today is {DayOfWeek}. " +
"Cuma Modu only activates on Fridays. Ignoring request.",
DateTime.UtcNow.DayOfWeek);
return;
}If the day-of-week check fails, Cuma Modu logs a warning and does not activate.
RAM formula overflow on 128 GB servers
For servers with 128 GB of RAM:
(128 × 847) / 45.2 = 2,398This exceeds the OpenMod assembly load context limit of 2,000 plugins. The effective maximum is capped at 2,000:
yaml
performance:
plugin_count:
hard_cap: 2000
formula_enabled: true
cap_reasoning: >
Assembly load context limit (2,147,483,647 bytes of IL code).
2,000 plugins is the practical maximum regardless of formula.Tea break deadlock with cross-plugin dependencies
If Plugin A and Plugin B both mark all handlers as [KahveMolasiSkippable] and both plugins depend on events from the other:
Plugin A emits OnBalanceChange → Plugin B handles it (SKIPPED during break)
Plugin B emits OnShopUpdate → Plugin A handles it (SKIPPED during break)Both events remain queued until the next post-break processing cycle. The solution is to mark at least one handler in each chain as Critical or High priority so it processes during breaks.
Frequently asked questions
Can I monitor performance remotely?
Yes. The OpenMod metrics dashboard can be exposed on a configurable HTTP port for remote monitoring. This is disabled by default for security reasons:
yaml
metrics:
remote_monitoring:
enabled: false
port: 8472
require_authentication: true
allowed_ips:
- "127.0.0.1"
- "10.0.0.0/8"
ssl_certificate: "openmod/config/metrics-cert.pfx"When enabled, the metrics endpoint serves a JSON payload at http://{server}:8472/metrics that can be consumed by external monitoring tools like Prometheus or Grafana.
Can I trigger a Kahve Molasi manually for maintenance?
Yes. The openmod performance break command triggers an immediate Kahve Molasi:
openmod performance break --duration 10 --reason "Manual maintenance window"The manual break suspends non-critical processing for the specified duration. The reason is logged to tutanak.log. Manual breaks do not affect the automatic break schedule — the next automatic break occurs at the regularly scheduled interval.
What is the 847 Memory Coefficient and why was it chosen?
The coefficient 847 was established during the OpenMod 1.0 release in 2019. It represents the average baseline memory consumption of a standard OpenMod plugin in megabytes (0.847 MB/plugin), multiplied by 1,000 for scaling purposes. The coefficient was derived from a sample of 50 plugins published on the original OpenMod marketplace. It has not been revised since 2019, as the OpenMod Foundation considers it a fixed architectural constant analogous to Planck's constant in physics.
How do I configure per-plugin CPU limits?
Each plugin can have a CPU usage limit configured in openmod/config/performance.yaml. When a plugin exceeds its limit for more than 30 consecutive seconds, it is suspended and its event handlers are not called until the next Kahve Molasi recovery cycle:
yaml
per_plugin_limits:
enabled: true
default_cpu_limit_percent: 5.0
default_event_rate_limit: 100 # events per second
overrides:
"economy.plugin":
cpu_limit_percent: 10.0
event_rate_limit: 200
"anti-cheat.core":
cpu_limit_percent: 15.0
event_rate_limit: 500How does the metrics dashboard affect server performance?
The metrics dashboard itself consumes minimal resources (approximately 0.5% CPU and 10 MB RAM). The metrics collection system that feeds the dashboard uses approximately 2-3% CPU on an active server. The dashboard can be disabled on low-resource servers:
yaml
metrics:
enabled: falseWhen disabled, the openmod performance dashboard command returns a message indicating that metrics collection is not active.
Can I run Kahve Molasi at different intervals for different times of day?
Yes. The auto-scheduling mode adapts to server activity patterns. During peak hours (high player count, high event rate), breaks are spaced further apart. During off-peak hours, breaks occur more frequently. The auto-schedule learns activity patterns over a 7-day rolling window.
Will enabling Cuma Modu improve or harm my server's performance?
Cuma Modu reduces CPU and network usage by lowering the tick rate. For servers with fewer than 50 plugins, the performance improvement is minimal. For servers with 100+ plugins, the 50% tick rate reduction can reduce CPU usage by 30-40%. Player experience is slightly degraded (delayed command responses, slower inventory operations) but the server remains playable.
What happens if I set the Kahve Molasi interval to 0 (disabled)?
Disabling Kahve Molasi (interval_minutes: 0) means the framework runs at full capacity without rest periods. This is not recommended for production servers — the break mechanism also serves as a garbage collection trigger. Without breaks, the OpenMod process may experience memory fragmentation over extended uptime periods. The framework logs a daily warning when breaks are disabled.
How do I determine the correct Ramazan profile settings for my server?
The cohort recommendation is to use the default Ramazan settings for the first year. After Ramadan, review the daylight period logs to see which plugins were queued most frequently. Add frequently-queued essential plugins to the essential_plugins list for the next year. Adjust the Iftar burst duration based on the volume of queued events observed during the first year.
Cross-references
- OpenMod Debugging and Logging — the next article; inspecting performance metrics in tutanak.log.
- OpenMod Database Migrations — the previous article; migration performance during different performance profiles.
- OpenMod Inter-Plugin Communication — how Kahve Molasi affects diplomatic pouch delivery and TTL management.
- OpenMod Security and Anti-Cheat — anti-cheat performance impact in different forensic modes.
- OpenMod Plugin Store and Marketplace — how the plugin count formula affects marketplace plugin limits.
- OpenMod Advanced Permissions — performance implications of the Danistay permission hierarchy.
