Paper(마인크래프트)

Paper(페이퍼)는 마인크래프트 서버를 위한 고성능 구동기로, Spigot을 포크하여 추가적인 성능 최적화와 기능을 제공한다. 현재 가장 인기 있는 마인크래프트 서버 구동기이며, 대규모 서버에서 널리 사용된다.

2016년 처음 출시되었으며, PaperMC 팀에 의해 개발되고 있다. 이 서버 최적화 가이드는 공식 문서에서 제공하는 정보를 확장하여 게임플레이 변경사항과 최적화로 인한 잠재적 부작용에 대한 추가적인 강조를 제공한다. Spigot의 모든 기능을 포함하면서도 더 나은 성능과 안정성을 제공한다.

주요 특징

성능 최적화

  • 비동기 청크 로딩 및 저장
  • 향상된 엔티티 AI 및 경로탐색
  • 메모리 사용량 최적화
  • 틱 최적화 및 지연 감소
  • 동기화된 청크 쓰기를 비활성화하여 메인 스레드의 부담을 줄임

추가 기능

  • 익스플로잇 패치
  • 향상된 API
  • 월드별 설정 지원
  • 고급 타이밍 시스템 (Timings v2)
  • 내장 안티엑스레이

설치 방법

1. papermc.io에서 최신 버전 다운로드
2. 서버 폴더에 paper-1.21.jar 저장
3. 서버 시작:
   java -Xms2G -Xmx4G -jar paper-1.21.jar
4. EULA 동의 후 재시작

설정 파일 구조

Paper는 config 폴더 내에 설정 파일을 저장하며, paper-world-defaults.yml의 모든 설정은 월드별로 재정의할 수 있다:

서버 폴더/
├── config/
│   ├── paper-global.yml      # 전역 설정
│   └── paper-world-defaults.yml  # 월드 기본 설정
├── world/
│   └── paper-world.yml       # 월드별 설정 (선택사항)
├── bukkit.yml
├── spigot.yml
└── server.properties

paper-global.yml 주요 설정

paper-global.yml은 전체 서버에 적용되는 설정을 관리한다:

# 최신 Paper 1.21 기준 권장 설정
_version: 30  # 설정 파일 버전

chunk-loading:
  player-max-concurrent-loads: 20.0
  player-max-concurrent-sends: 5.0

chunk-system:
  gen-parallelism: default
  io-threads: -1
  worker-threads: -1

collisions:
  enable-player-collisions: true
  send-full-pos-for-hard-colliding-entities: true

console:
  enable-brigadier-highlighting: true
  enable-brigadier-completions: true

item-validation:
  display-name: 8192
  lore-line: 8192
  
messages:
  no-permission: '&c권한이 없습니다.'
  use-display-name-in-quit-message: false
  
misc:
  chat-threads:
    chat-executor-core-size: -1
    chat-executor-max-size: -1
  fix-entity-position-desync: true
  lag-compensate-block-breaking: true
  load-permissions-yml-before-plugins: true
  max-joins-per-tick: 5  # 한 틱당 최대 접속 플레이어 수 제한
  region-file-cache-size: 256
  use-alternative-luck-formula: false
  
packet-limiter:
  all-packets:
    action: KICK
    max-packet-rate: 5000.0
  kick-message: '&c너무 많은 패킷을 전송했습니다!'
  
player-auto-save:
  max-per-tick: -1
  rate: -1
  
proxies:
  # BungeeCord/Velocity 설정
  bungee-cord:
    online-mode: true
  proxy-protocol: false
  velocity:
    enabled: false
    online-mode: false
    secret: ''
    
timings:
  enabled: true
  hidden-config-entries:
    - database
    - proxies.velocity.secret
  url: 'https://timings.aikar.co/'

paper-world-defaults.yml 핵심 최적화

엔티티는 최신 마인크래프트 버전에서 리소스를 많이 소모하므로, 최고급 CPU도 엔티티를 제어하지 않으면 성능 저하를 겪을 수 있다:

엔티티 설정

entities:
  # 아머스탠드 최적화
  armor-stands:
    do-collision-entity-lookups: false
    tick: true
    
  # 엔티티 거동
  behavior:
    baby-zombie-movement-modifier: 0.5
    disable-chest-cat-detection: false
    disable-creeper-lingering-effect: false
    disable-player-crits: false
    door-breaking-difficulty:
      zombie: [HARD]
      zombie_villager: [HARD]
      husk: [HARD]
      zombified_piglin: [HARD]
      vindicator: [NORMAL, HARD]
    
  # 몹 스포닝
  spawning:
    all-chunks-are-slime-chunks: false
    creative-arrow-despawn-rate: 180  # 크리에이티브 모드 화살 디스폰 시간
    despawn-ranges:
      ambient:
        hard: 128
        soft: 32
      axolotls:
        hard: 128
        soft: 32
      creature:
        hard: 128
        soft: 32
      misc:
        hard: 128
        soft: 32
      monster:
        hard: 128
        soft: 32  # 몬스터가 디스폰되기 시작하는 거리
      underground_water_creature:
        hard: 128
        soft: 32
      water_ambient:
        hard: 64
        soft: 32
      water_creature:
        hard: 128
        soft: 32
    
    # 스폰 간격 (틱)
    # 값을 높이면 몹 스폰 빈도가 감소하여 성능 향상
    monster-spawn-max-light-level: default
    per-player-mob-spawns: true
    spawn-limits:
      ambient: -1
      axolotls: -1
      creature: -1
      monster: -1
      underground_water_creature: -1
      water_ambient: -1
      water_creature: -1

성능 최적화 설정

# 충돌 최적화
collisions:
  allow-player-cramming-damage: false
  allow-vehicle-collisions: false
  fix-climbing-bypassing-cramming-rule: false
  max-entity-collisions: 2  # 작은 공간에서 동물 AI가 서로 피하려고 경로를 찾는 것을 제한
  only-players-collide: false

# 청크 설정
chunks:
  auto-save-interval: -1
  delay-chunk-unloads-by: 10s
  entity-per-chunk-save-limit:
    # 청크당 저장할 최대 엔티티 수
    arrow: 16
    ender_pearl: 16
    experience_orb: 16
    fireball: 16
    small_fireball: 16
    snowball: 16
  fixed-chunk-inhabited-time: -1
  max-auto-save-chunks-per-tick: 6  # 월드 저장 작업 중 증분 청크 저장을 늦춤
  prevent-moving-into-unloaded-chunks: false

# 환경 설정
environment:
  disable-explosion-knockback: false
  disable-ice-and-snow: false
  disable-teleportation-suffocation-check: false
  disable-thunder: false
  frosted-ice:
    delay:
      max: 40
      min: 20
    enabled: true
  generate-flat-bedrock: false
  locate-structures-outside-world-border: false
  max-growth-height:
    bamboo:
      max: 16
      min: 11
    cactus: 3
    reeds: 3
  nether-ceiling-void-damage-height: disabled
  optimize-explosions: true  # Paper의 효율적인 폭발 알고리즘
  portal-create-radius: 16
  portal-search-radius: 128
  portal-search-vanilla-dimension-scaling: true
  treasure-maps:
    enabled: true
    find-already-discovered:
      loot-tables: default
      villager-trade: false
  water-over-lava-flow-speed: 5

홉퍼 최적화

hopper:
  cooldown-when-full: true
  disable-move-event: false
  disable-move-event-quickshop-compat: false
  ignore-occluding-blocks: false

틱 레이트 설정

tick-rates:
  behavior:
    villager:
      validatenearbypoi: -1
  container-update: 1
  grass-spread: 4
  mob-spawner: 1
  sensor:
    villager:
      secondarypoisensor: 40

안티엑스레이 설정

anticheat:
  anti-xray:
    enabled: true  # Paper의 안티엑스레이는 가장 효율적임
    engine-mode: 2  # 1=난독화, 2=숨김
    hidden-blocks:
      - copper_ore
      - deepslate_copper_ore
      - diamond_ore
      - deepslate_diamond_ore
      - gold_ore
      - deepslate_gold_ore
      - iron_ore
      - deepslate_iron_ore
      - coal_ore
      - deepslate_coal_ore
      - lapis_ore
      - deepslate_lapis_ore
      - mossy_cobblestone
      - obsidian
      - chest
      - trapped_chest
      - spawner
    lava-obscures: false
    max-block-height: 64
    replacement-blocks:
      - stone
      - oak_planks
      - deepslate
    update-radius: 2
    use-permission: false

월드별 설정 재정의

특정 월드에 대한 값을 설정하려면 월드 폴더 내의 paper-world.yml을 편집한다:

# world/paper-world.yml 예시
_version: 30

entities:
  spawning:
    spawn-limits:
      monster: 30  # 이 월드에서만 몬스터 제한을 30으로
      
chunks:
  max-auto-save-chunks-per-tick: 12  # 이 월드는 더 자주 저장

권장 JVM 플래그 (2025년 기준)

마인크래프트는 대부분 단일 스레드로 동작하므로 코어 수보다 높은 클럭 속도가 중요하다:

# Aikar's Flags (8GB+ RAM)
java -Xms8G -Xmx8G -XX:+UseG1GC -XX:+ParallelRefProcEnabled 
-XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions 
-XX:+DisableExplicitGC -XX:+AlwaysPreTouch 
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 
-XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 
-XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 
-XX:InitiatingHeapOccupancyPercent=15 
-XX:G1MixedGCLiveThresholdPercent=90 
-XX:G1RSetUpdatingPauseTimePercent=5 
-XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem 
-XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs 
-Daikars.new.flags=true -jar paper.jar --nogui

일반적인 오류와 해결책

청크 생성

1.14 이상 버전에서 청크 생성은 매우 리소스를 많이 사용한다:

# Chunky 플러그인을 사용한 사전 생성 권장
/chunky radius 5000
/chunky start

성능 진단

# Spark 플러그인 사용
/spark profiler start
# 5-10분 후
/spark profiler stop

# Paper 타이밍
/timings on
# 10분 후
/timings paste

피해야 할 사항

다음 항목들은 사용하지 않는 것이 권장된다:

  • ClearLag와 같은 엔티티 제거 플러그인 (Paper 자체 최적화가 더 효율적)
  • 실시간 플러그인 리로드/활성화/비활성화 플러그인
  • "Async" 기능을 내세우는 유료 서버 jar 파일

Paper 포크

Paper를 기반으로 한 추가 최적화 구동기:

  • Purpur: 더 많은 설정 옵션과 게임플레이 기능
  • Pufferfish: 추가 성능 최적화
  • Folia: 실험적 멀티스레딩 지원

마이그레이션 가이드

Spigot에서 Paper로 이전:

1. 전체 서버 백업
2. spigot.jar를 paper.jar로 교체
3. 서버 시작 (자동으로 설정 변환)
4. config 폴더의 새 설정 파일 확인
5. 필요에 따라 최적화 설정 조정

추가 자료

  • 공식 문서: docs.papermc.io
  • 커뮤니티 Discord: discord.gg/papermc[1]

각주

  1. Paper 설정과 최적화에 대한 실시간 도움을 받을 수 있는 공식 Discord 서버