マイクラサーバーで最も深刻な問題の一つが、TPS(Ticks Per Second)の低下です。プレイヤーの動きがカクカクし、レッドストーン回路が正常に動作しない…そんな経験はありませんか?この記事では、Sparkプロファイラを使った科学的なラグ原因分析から、実践的な解決策まで完全解説します!
1. TPSとMSPTの基礎知識
TPSとは何か?
TPS(Ticks Per Second):
- サーバーが1秒間に処理できるゲームティック数
- 理想値:20TPS(1ティック = 50ms)
- 18TPS以下:プレイヤーに体感できるラグ
- 15TPS以下:深刻なパフォーマンス問題
MSPT(Milliseconds Per Tick):
- 1ティックの処理にかかる時間(ミリ秒)
- 理想値:50ms以下
- 60ms以上:ラグの発生
- 100ms以上:重大な問題
出典: Spark Documentation
ラグの種類と特徴
サーバーラグ(TPS低下):
- 症状:全プレイヤーに影響
- 原因:CPU処理、メモリ不足、重い処理
- 確認方法:
/forge tps
または/tps
クライアントラグ(FPS低下):
- 症状:個別プレイヤーのみ
- 原因:グラフィック処理、クライアント設定
- 確認方法:F3キーでFPS確認
ネットワークラグ(遅延):
- 症状:動作の遅延、巻き戻り
- 原因:回線品質、距離、パケットロス
- 確認方法:ping値の測定
2. Sparkプロファイラの導入と基本操作
Sparkプラグインのインストール
Bukkit/Spigot/Paper サーバー:
Copy# pluginsフォルダにダウンロード
cd /opt/minecraft/plugins
wget https://ci.lucko.me/job/spark/lastSuccessfulBuild/artifact/spark-bukkit/build/libs/spark-bukkit-1.10.73.jar
Fabric/Forge サーバー(MOD版):
Copy# modsフォルダにダウンロード
cd /opt/minecraft/mods
wget https://ci.lucko.me/job/spark/lastSuccessfulBuild/artifact/spark-fabric/build/libs/spark-fabric-1.10.73.jar
基本的なプロファイリング手順
ステップ1:プロファイリング開始
/spark profiler start
ステップ2:問題の再現
- ラグが発生している状況を5-10分間維持
- 通常プレイを継続してリアルなデータを収集
ステップ3:プロファイリング停止
/spark profiler stop
ステップ4:結果の確認
/spark profiler open
高度なプロファイリングオプション
特定要素に絞った分析:
# エンティティのみをプロファイル
/spark profiler start --only-ticks-over 50 --thread server
# 特定ワールドのみ
/spark profiler start --combine-all --thread server
# メモリ使用量も同時に分析
/spark heapdump
3. Timings v2による詳細分析
Timings v2の有効化
Paper/Spigot サーバーでの設定:
Copy# spigot.yml
settings:
debug: false
timeout-time: 60
restart-on-crash: true
restart-script: ./start.sh
timings:
enabled: true
verbose: true
server-name-privacy: false
hidden-config-entries:
- database
- proxies
history-interval: 300
history-length: 3600
Timingsレポートの取得
基本コマンド:
/timings on
# 5-10分間の通常プレイ
/timings paste
詳細分析用:
/timings reset
/timings on
# 問題発生時のプレイ
/timings paste
Timingsレポートの読み方
出典: indifferent broccolipedia
重要な確認項目:
- Total Time: 全体の処理時間
- Tick Time: ティック処理時間
- Entity Activation: エンティティ処理
- Tile Entity Ticking: タイルエンティティ処理
- World Ticking: ワールド更新処理
問題のある値の目安:
Avg Tick: > 50ms (問題)
Entity Activation: > 10ms (要注意)
Tile Entity: > 15ms (重大)
World Ticking: > 20ms (問題)
4. エンティティ削減の実践的手法
エンティティ数の確認
基本的な確認コマンド:
/forge entity_count
/minecraft:summon
/essentials:entitycount
詳細分析:
# エンティティタイプ別カウント
/spark profiler start --only-ticks-over 100 --thread server
# エンティティの位置確認
/minecraft:execute as @e run data get entity @s Pos
効果的なエンティティ管理
自動削除設定例(server.properties):
Copy# エンティティ削除設定
entity-broadcast-range-percentage=100
entity-tracking-range:
players: 48
animals: 48
monsters: 48
misc: 32
display: 128
# スポーン制限
spawn-limits:
monsters: 15
animals: 10
water-animals: 5
water-ambient: 20
ambient: 15
プラグインによる管理(ClearLag設定例):
Copy# config.yml
settings:
auto-removal-enabled: true
removal-broadcast-enabled: true
removal-delay: 300 # 5分間隔
auto-removal:
enabled: true
broadcast: true
autoremoval-interval: 300
items:
- minecraft:cobblestone
- minecraft:dirt
- minecraft:stone
entities:
enabled: true
limit: 1000
check-interval: 120
remove:
- minecraft:zombie
- minecraft:skeleton
- minecraft:spider
手動エンティティクリーンアップ
緊急時のクリーンアップコマンド:
# 全アイテムエンティティの削除
/minecraft:kill @e[type=item]
# 特定範囲のモンスター削除
/minecraft:kill @e[type=#minecraft:hostile,distance=..100]
# 古いエンティティの削除(5分以上存在)
/minecraft:kill @e[type=item,nbt={Age:6000s}]
# エクスペリエンスオーブの削除
/minecraft:kill @e[type=experience_orb]
5. タイルエンティティ最適化
問題のあるタイルエンティティの特定
重いタイルエンティティランキング:
- ホッパー: 最も重い処理
- レッドストーン回路: 複雑な信号処理
- チェスト(特に大型): 在庫管理
- かまど・溶鉱炉: 製錬処理
- 看板: 文字レンダリング
ホッパー最適化テクニック
効率的なホッパー設計:
悪い例:
[チェスト]
↓
[ホッパー] → [ホッパー] → [ホッパー] → [チェスト]
良い例:
[チェスト]
↓
[ホッパー]
↓
[水流輸送]
↓
[ホッパー] → [チェスト]
ホッパー設定の最適化(Paper):
Copy# paper.yml
hopper:
cooldown-when-full: true
disable-move-event: false
ignore-occluding-blocks: false
hopper-amount: 1
ticks-per:
hopper-transfer: 8 # デフォルト: 8
hopper-check: 1 # デフォルト: 1
レッドストーン回路の最適化
効率的なレッドストーン設計:
- クロック回路の削減: 必要最小限に
- 信号強度の最適化: 15ブロック以内で分割
- リピーターの削減: 可能な限り直接接続
- オブザーバーブロックの制限: 連鎖反応を避ける
問題のある回路パターン:
❌ 高速クロック回路(1tick間隔)
❌ 巨大なレッドストーン配線
❌ 無限ループ回路
❌ 不必要なリピーター連鎖
6. 効果的なラグ対策プラグイン
必須プラグイン一覧
パフォーマンス監視:
- Spark: 総合プロファイラ
- Observable: リアルタイム監視
- LagGoggles: ビジュアルラグ診断
エンティティ管理:
- ClearLag: 定期的なクリーンアップ
- EntityLimiter: エンティティ数制限
- MobLimiter: モブスポーン制御
チャンク最適化:
- ChunkManager: チャンク管理
- LaggRemover: ラグ要因除去
- TileEntityLimiter: タイルエンティティ制御
プラグイン設定例
ClearLag 最適設定:
Copysettings:
auto-removal-enabled: true
removal-broadcast-enabled: true
removal-delay: 300
modules:
limit:
enabled: true
max: 1000
check-interval: 60
chunk-entity-limiter:
enabled: true
limit: 100
mob-range:
enabled: true
range: 64
Observable 監視設定:
Copyperformance:
tps-threshold: 18.0
mspt-threshold: 55.0
memory-threshold: 85
alerts:
discord-webhook: "https://discord.com/api/webhooks/..."
enable-broadcasts: true
enable-actionbar: true
7. プリベンティブ(予防的)監視システム
自動監視スクリプト
TPS監視とアラート:
Copy#!/bin/bash
# tps_monitor.sh
TPS_THRESHOLD=18
ALERT_EMAIL="admin@example.com"
LOG_FILE="/var/log/minecraft_tps.log"
while true; do
# TPSの取得(Sparkプラグイン使用)
TPS=$(screen -S minecraft -p 0 -X stuff "spark tps$(echo -ne '\r')" | grep "TPS" | awk '{print $2}')
if (( $(echo "$TPS < $TPS_THRESHOLD" | bc -l) )); then
echo "$(date): LOW TPS DETECTED: $TPS" >> $LOG_FILE
# アラートメール送信
echo "Minecraft server TPS is low: $TPS" | \
mail -s "Minecraft TPS Alert" $ALERT_EMAIL
# 自動プロファイリング開始
screen -S minecraft -p 0 -X stuff "spark profiler start$(echo -ne '\r')"
sleep 300 # 5分間プロファイル
screen -S minecraft -p 0 -X stuff "spark profiler stop$(echo -ne '\r')"
screen -S minecraft -p 0 -X stuff "spark profiler open$(echo -ne '\r')"
fi
sleep 60 # 1分間隔でチェック
done
Grafana ダッシュボード設定
重要なメトリクス:
Copy# prometheus設定例
- job_name: 'minecraft-spark'
static_configs:
- targets: ['localhost:9225']
scrape_interval: 5s
metrics_path: /metrics
# 監視項目
- minecraft_tps
- minecraft_mspt
- minecraft_memory_used
- minecraft_entities_count
- minecraft_chunks_loaded
- minecraft_players_online
アラートルール:
Copygroups:
- name: minecraft_performance
rules:
- alert: MinecraftLowTPS
expr: minecraft_tps < 18
for: 2m
labels:
severity: warning
annotations:
summary: "Minecraft TPS is low: {{ $value }}"
- alert: MinecraftHighMSPT
expr: minecraft_mspt > 60
for: 1m
labels:
severity: critical
annotations:
summary: "Minecraft MSPT is high: {{ $value }}ms"
8. おすすめサーバー構成
小中規模サーバー最適化構成
🏆 安定重視:エックスサーバー VPS for Game
推奨理由:
- 高性能CPU(3コア〜)で安定したTPS維持
- 大容量メモリでエンティティ処理が快適
- 専用サポートでトラブル時も安心
- 自動バックアップでデータ保護
TPS最適化プラン:
- 8GBプラン:月額4,400円(20人以下推奨)
- 16GBプラン:月額9,750円(50人以下推奨)
特徴:
- 99.99%の稼働率保証
- NVMe SSDで高速ディスクI/O
- 24時間監視サービス
🎯 コスパ重視:ConoHa for GAME
推奨理由:
- 時間課金制で効率的な運用
- 高速SSDでチャンク読み込みが快適
- 豊富なテンプレートで簡単セットアップ
- 初期費用無料
料金プラン:
- 8GBプラン:月額4,066円
- 16GBプラン:月額9,834円
特徴:
- 柔軟な料金体系
- リージョン選択可能
- 充実したAPIサポート
💰 予算重視:カゴヤ CLOUD VPS
推奨理由:
- 最安級価格でコスト効率重視
- 安定した性能でTPS維持
- 国内企業の信頼性
- 長期利用に最適
料金プラン:
- 4GBプラン:月額1,958円(軽量サーバー)
- 8GBプラン:月額7,700円(中規模サーバー)
特徴:
- 高いコストパフォーマンス
- 長期契約割引
- 充実したサポート体制
パフォーマンス最適化設定
JVM引数(TPS重視):
Copyjava -Xms8G -Xmx8G \
-XX:+UseG1GC \
-XX:G1HeapRegionSize=4M \
-XX:MaxGCPauseMillis=50 \
-XX:+ParallelRefProcEnabled \
-XX:+AlwaysPreTouch \
-XX:+DisableExplicitGC \
-jar server.jar nogui
server.properties(TPS最適化):
Copy# 描画距離の最適化
view-distance=6
simulation-distance=4
# エンティティ最適化
max-entity-cramming=8
entity-broadcast-range-percentage=75
# その他最適化
network-compression-threshold=512
player-idle-timeout=60
まとめ
マイクラサーバーのTPS低下は複雑な問題ですが、適切な分析ツールと対策により必ず解決できます。Sparkプロファイラを使った科学的アプローチにより、推測ではなく事実に基づいた最適化が可能になります。
TPS最適化の重要ポイント:
- 継続的な監視: SparkとObservableによる24時間監視
- 事実に基づく分析: 推測ではなくプロファイリング結果で判断
- 段階的な最適化: 一度に多くの変更をせず、効果を検証
- 予防的措置: 問題が発生する前の対策実装
- 適切なインフラ: サーバー性能がボトルネックにならない構成
特にエックスサーバー VPS for Game、ConoHa for GAME、カゴヤ CLOUD VPSは、それぞれ異なるニーズに対応した優秀なサービスです。予算と規模に応じて適切に選択することで、安定した20TPSを維持できます。
2025年のマイクラサーバー運用では、もはや「なんとなく重い」は通用しません。科学的なアプローチで、プレイヤーが快適に遊べる環境を提供しましょう!
※本記事は2025年7月時点の情報に基づいて執筆されています。各プラグインやツールのバージョンは最新のものを使用し、定期的なアップデートを心がけてください。
参考リンク:
免責事項: サーバーの設定変更は事前にバックアップを取り、テスト環境で動作確認を行ってから本番環境に適用してください。各プラグインの利用規約を遵守し、サーバーの安定稼働を最優先に運用してください。