Direct answer
Scheduled plugin tasks can overload the tick thread even without a player command. Capture profiles over several task cycles and trace expensive scheduler callbacks to their plugin code.
How to check it
- Record the lag rhythm: e.g. a pause every few seconds or each minute. Check server logs for scheduled job messages.
- Profile a long enough interval with
/spark profiler start --timeout 300to include several repetitions. - Open the tick-thread tree. Look for scheduler/task execution branches and the plugin classes beneath them; compare the view against the time of repeated spikes.
- Check the owning plugin’s configuration for scan radius, batch size, refresh intervals, placeholder updates or cleanup tasks.
- In staging, adjust one documented interval/workload parameter or temporarily disable the feature, then profile again.
What to change
- Reduce work performed each run rather than only increasing the interval and creating larger bursts.
- Ask the developer to split expensive tasks into safe batches or move non-world I/O away from the tick thread.
- Avoid disabling important save, backup, moderation or protection tasks simply to improve benchmark numbers.
Software and version notes
Some tasks use asynchronous workers and will appear on threads other than the main tick thread. Folia scheduling is region-aware; do not transplant a Bukkit main-thread design without checking the API.
Verify the result
- Compare tick spikes over at least several task periods and watch for lag shifting to another thread.
- Validate plugin functionality, moderation and data consistency after any change.