서버 설정 조정
모든 서버에 맞는 설정은 없다. 각 설정 옵션을 이해하고, 서버 하드웨어, 플레이어 수, 서버 성격 등에 맞춰 값을 조정해야 한다.
그래서 값은 서버마다 다르다. 게임 후반으로 갈수록 자동화 장치나 플레이어가 늘면서 서버의 작업량도 점점 늘어난다.
따라서 서버 최적화는 한 번 하고 끝나는 작업이 아니라 꾸준히 해야 하는 일이다.
머리를 쓸 준비를 하자. 아래 추천값은 참고용일 뿐이니, 구체적인 숫자는 직접 시험해 보자.
Paper 1.20+ 기준이다.
네트워크 최적화
섹션 제목: “네트워크 최적화”네트워크 최적화의 주된 목적은 서버 업로드 대역폭 사용 때문에 플레이어의 핑(네트워크 지연)이 높아져 게임 경험이 나빠지는 문제를 해결하는 것이다.
서버 시야 거리 줄이기
섹션 제목: “서버 시야 거리 줄이기”수동 조정
섹션 제목: “수동 조정”spigot.yml이나 server.properties에서 서버의 시야 거리를 설정할 수 있다. spigot.yml의 값이 server.properties의 값을 덮어쓴다.
view-distance: 8 #시야 거리 8 chunks기본값인 10 chunks를 쓰고 있다면 대역폭에 부담이 될 수 있으니 상황에 맞게 줄이자.
자동 조정
섹션 제목: “자동 조정”View Distance Tweaks를 설치하면 플레이어가 많아지면 시야를 자동으로 줄이고, 적어지면 자동으로 늘리도록 시야 거리를 자동 조정할 수 있다.
청크 로딩 속도 낮추기
섹션 제목: “청크 로딩 속도 낮추기”/config/paper-global.yml에 청크 생성 관련 설정이 있다.
chunk-loading-basic: #참고: 아래 단위는 모두 chunks / seconds player-max-chunk-generate-rate: -1.0 #플레이어별 최대 청크 생성 속도. -1로 설정하면 비활성화된다. player-max-chunk-load-rate: 100 #플레이어 한 명이 청크를 로드하는 최대 속도. -1로 설정하면 비활성화된다. player-max-chunk-send-rate: 75 #서버가 플레이어 한 명에게 보내는 최대 속도. -1로 설정하면 비활성화된다.이 중 player-max-chunk-send-rate는 서버가 플레이어에게 초당 최대 몇 개의 청크 패킷을 보낼지 정한다. 낮게 설정할수록 플레이어가 완전한 맵 정보를 받는 속도가 느려진다.
서버가 보내는 청크 정보의 총량은 거의 같지만, 보내는 속도가 낮아지니 업로드 대역폭의 최대 사용량이 줄어들어 대량의 맵 탐험으로 인한 렉을 피할 수 있다.
엔티티 수 제어
섹션 제목: “엔티티 수 제어”Minecraft 서버는 각 엔티티의 행동을 근처 플레이어 클라이언트에 실시간으로 보낸다. 이 패킷은 보통 작지만, 많은 플레이어가 엔티티가 밀집한 지역에 있으면 대역폭을 많이 차지하게 된다.
bukkit.yml과 config/paper-world-default.yml에서 spawn-limits를 제한한다(둘 다 값이 있으면 Paper의 값을 쓰고, Paper의 값이 -1이면 Bukkit의 값을 쓴다).
spawn-limits: monsters: 70 #몬스터: 엘더 가디언, 엔더맨, 워든, 좀벌레, 피글린 야수, 스트레이, 환술사, 스켈레톤, 셜커, 조글린, 가디언, 마그마 큐브, 좀비 주민, 좀비 피글린, 변명자, 팬텀, 피글린, 슬라임, 엔더 드래곤, 드라운드, 약탈자, 소환사, 좀비, 거미, 허스크, 가스트, 파괴수, 호글린, 동굴 거미, 마녀, 위더, 엔더마이트, 위더 스켈레톤, 블레이즈, 거인, 크리퍼, 벡스
animals: 10 #동물: 돼지, 북극곰, 여우, 고양이, 좀비 말, 스니퍼, 판다, 토끼, 늑대, 소, 거북, 개구리, 알레이, 상인 라마, 당나귀, 벌, 낙타, 양, 올챙이, 오실롯, 닭, 무시룸, 말, 라마, 떠돌이 상인, 앵무새, 염소, 노새, 스켈레톤 말, 스트라이더
water-animals: 5 # 오징어와 돌고래
water-ambient: 20 # 대구, 복어, 연어, 열대어
water-underground-creature: 5 # 발광 오징어
axolotls: 5 # 아홀로틀
ambient: 15 # 박쥐만 해당. 0을 추천최신 버전의 config/paper-world-default.yml에서는 animals가 creature로, water-animals가 water-creature로 바뀌었다.
다음 설정 파일을 참고하자.
spawn-limits: ambient: 15 # 박쥐만 해당. 0을 추천
axolotls: 5 # 아홀로틀
creature: 10 #동물: 돼지, 북극곰, 여우, 고양이, 좀비 말, 스니퍼, 판다, 토끼, 늑대, 소, 거북, 개구리, 알레이, 상인 라마, 당나귀, 벌, 낙타, 양, 올챙이, 오실롯, 닭, 무시룸, 말, 라마, 떠돌이 상인, 앵무새, 염소, 노새, 스켈레톤 말, 스트라이더
monsters: 70 #몬스터: 엘더 가디언, 엔더맨, 워든, 좀벌레, 피글린 야수, 스트레이, 환술사, 스켈레톤, 셜커, 조글린, 가디언, 마그마 큐브, 좀비 주민, 좀비 피글린, 변명자, 팬텀, 피글린, 슬라임, 엔더 드래곤, 드라운드, 약탈자, 소환사, 좀비, 거미, 허스크, 가스트, 파괴수, 호글린, 동굴 거미, 마녀, 위더, 엔더마이트, 위더 스켈레톤, 블레이즈, 거인, 크리퍼, 벡스
water-underground-creature: 5 # 발광 오징어
water-ambient: 20 # 대구, 복어, 연어, 열대어
water-creature: 5 # 오징어와 돌고래대부분의 경우 모든 제한을 원래의 50%로 낮추는 것이 합리적이다. 제한과 실제 엔티티 수는 선형 관계가 아니라서, 실제 엔티티 수는 원래의 약 72%가 된다.
엔티티 표시 거리 줄이기 (비추천)
섹션 제목: “엔티티 표시 거리 줄이기 (비추천)”엔티티 표시 거리를 줄이면 서버가 엔티티 갱신 패킷을 덜 보내지만, 서버에는 엔티티가 존재하는데도 플레이어가 먼 곳의 엔티티를 볼 수 없게 된다.
entity-tracking-range: display: 64 players: 48 animals: 48 monsters: 48 misc: 32 other: 64더 합리적인 엑스레이 방지 방식 고르기
섹션 제목: “더 합리적인 엑스레이 방지 방식 고르기”Orebfuscator 같은 광물 난독화 플러그인은 그만 쓰고, Paper 내장 광물 난독화를 쓰자.
Paper 광물 난독화를 쓸 때는 오버월드 외의 차원에서 mode 2나 mode 3을 되도록 켜지 말자.
Keepalive
섹션 제목: “Keepalive”purpur.yml에서 use-alternate-keepalive 옵션을 켜자.
성능 최적화
섹션 제목: “성능 최적화”성능 최적화는 주로 낮은 TPS와 높은 MPST 때문에 생기는 서버 렉이나 지속적인 끊김을 해결하는 것이다.
시뮬레이션 거리
섹션 제목: “시뮬레이션 거리”simulate-distance
섹션 제목: “simulate-distance”엔드에서는 view-distance를 더 높게 설정해도 된다. 겉날개 비행이 편해지면서도 자원을 많이 먹지 않는다.
또 플레이어들에게 Bobby나 Farsight 같은 모드 설치를 권하자. 청크를 로컬에 캐시하므로 서버 성능에 전혀 영향을 주지 않는다!
수동 조정
섹션 제목: “수동 조정”spigot.yml에서 서버의 시뮬레이션 거리를 설정할 수 있다.
simulate-distance: 8기본값인 10 chunks를 쓰고 있다면 성능에 큰 영향을 주니 상황에 맞게 줄이자.
자동 조정
섹션 제목: “자동 조정”View Distance Tweaks를 설치하면 플레이어가 많아지면 시야를 자동으로 줄이고, 적어지면 자동으로 늘리도록 시야 거리를 자동 조정할 수 있다.
청크 생성과 로딩
섹션 제목: “청크 생성과 로딩”chunk-loading-basic
섹션 제목: “chunk-loading-basic”서버가 청크를 생성하는 작업은 자원을 아주 많이 먹는다. 서버를 사전 생성해 두었기를 바란다. 아직이라면 사전 생성을 읽어 보자.
/config/paper-global.yml에 청크 생성 관련 설정이 있다.
chunk-loading-basic: #참고: 아래 단위는 모두 chunks / seconds player-max-chunk-generate-rate: -1.0 #플레이어별 최대 청크 생성 속도. -1로 설정하면 비활성화된다. player-max-chunk-load-rate: 100 #플레이어 한 명이 청크를 로드하는 최대 속도. -1로 설정하면 비활성화된다. player-max-chunk-send-rate: 75 #서버가 플레이어 한 명에게 보내는 최대 속도. -1로 설정하면 비활성화된다.이 중 player-max-chunk-generate-rate는 서버가 플레이어를 위해 초당 최대 몇 개의 청크를 생성할지 정한다. 낮게 설정할수록 청크 생성이 느려진다.
이러면 맵을 많이 탐험하는 플레이어는 서버가 좀 느리다고 느낄 수 있지만, 대부분의 플레이어의 게임 경험을 지킬 수 있으니 그럴 만한 가치가 있다.
prevent-moving-into-unloaded-chunks
섹션 제목: “prevent-moving-into-unloaded-chunks”플레이어가 로드되지 않은 청크로 들어가지 못하게 해서, 청크를 동기적으로 로드하느라 메인 스레드에 렉이 생기는 것을 막는다. view-distance가 작을수록 플레이어가 로드되지 않은 청크에 들어갈 가능성이 커진다.
max-loads-per-projectile
섹션 제목: “max-loads-per-projectile”Minecraft에서는 쏜 화살이나 던진 엔더 진주 등이 일정 거리의 청크를 로드할 수 있다.
pufferfish.yml에서 발사체가 로드할 수 있는 최대 청크 수를 조정할 수 있다.
값을 낮추면 발사체가 많을 때의 청크 부하를 줄일 수 있지만, 엔더 진주 등에 문제가 생길 수 있다.
청크 언로드 속도 조정
섹션 제목: “청크 언로드 속도 조정”delay-chunk-unloads-by
섹션 제목: “delay-chunk-unloads-by”청크를 반복해서 대량으로 로드하고 언로드하는 것은 성능을 많이 먹고, 쓸모없는 청크를 오래 로드해 두는 것도 성능 낭비다.
paper-world-defaults.yml에서 플레이어가 떠난 뒤 얼마 후에 청크 언로드를 시작할지 조정할 수 있다.
chunks: delay-chunk-unloads-by: 10s플레이어가 왔다 갔다 할 때 서버가 같은 청크를 계속 로드하고 언로드하는 것을 막는 데 도움이 된다. 값이 너무 높으면 한 번에 너무 많은 청크가 로드될 수 있다.
플레이어가 자주 텔레포트하거나 로드하는 영역은 영구적으로 로드해 두는 것도 고려해 보자. 서버 부담을 꽤 덜 수 있다.
| 추천값 | 서버 유형 |
|---|---|
| 5s | 초반 개척기, 플레이어가 넓은 범위를 탐험할 때 |
| 10s | 일반 서버 |
| >15s | 서버 콘텐츠 특성상 플레이어가 넓게 이동하지 않을 때 |
월드 저장
섹션 제목: “월드 저장”max-auto-save-chunks-per-tick
섹션 제목: “max-auto-save-chunks-per-tick”paper-world-defaults.yml의 설정으로, 월드 저장 속도를 제어한다.
max-auto-save-chunks-per-tick: 24이 값은 틱마다 저장할 수 있는 최대 청크 수다. 월드 청크 저장 속도를 낮추면 평균 성능을 높일 수 있다.
한 틱에 로드한 청크가 이 값을 넘으면, 남은 청크는 다음 틱에 이어서 저장한다.
이 값은 저장해야 할 청크 수와 플레이어 수에 맞춰야 한다. 인원이 많아 저장할 청크가 많아지면 적절히 늘리자.
청크 저장이 빠르면 저장 중 부하는 높지만 저장 시간은 짧아진다. 정전이나 갑작스러운 다운이 생겼을 때
저장 속도가 높을수록 청크 데이터를 잃을 가능성이 줄어든다.
| 추천값 | 서버 인원 |
|---|---|
| 4 | 늘 10명 미만 |
| 8 | 20명 안팎 (기본값) |
| 12 | 30명 안팎 |
| >24 | 늘 50명 이상 |
entity-per-chunk-save-limit
섹션 제목: “entity-per-chunk-save-limit”청크를 저장할 때 서버는 그 청크에 있는 엔티티도 함께 저장한다.
paper-world-defaults.yml의 설정으로, 월드 저장 시 엔티티 종류별 최대 저장 개수를 제어한다.
추천값:
chunks: entity-per-chunk-save-limit: area_effect_cloud: 8 arrow: 16 breeze_wind_charge: 16 dragon_fireball: 3 egg: 8 ender_pearl: 16 experience_bottle: 3 experience_orb: 16 eye_of_ender: 8 fireball: 8 firework_rocket: 8 llama_spit: 3 splash_potion: 8 lingering_potion: 8 shulker_bullet: 8 small_fireball: 8 snowball: 8 spectral_arrow: 16 trident: 16 wind_charge: 16 wither_skull: 4chunks: entity-per-chunk-save-limit: area_effect_cloud: 8 arrow: 16 dragon_fireball: 3 egg: 8 ender_pearl: 16 experience_bottle: 3 experience_orb: 16 eye_of_ender: 8 fireball: 8 firework_rocket: 8 llama_spit: 3 potion: 8 shulker_bullet: 8 small_fireball: 8 snowball: 8 spectral_arrow: 16 trident: 16 wither_skull: 4chunks: entity-per-chunk-save-limit: area_effect_cloud: 8 arrow: 16 breeze_wind_charge: 16 dragon_fireball: 3 egg: 8 ender_pearl: 16 experience_bottle: 3 experience_orb: 16 eye_of_ender: 8 fireball: 8 firework_rocket: 8 llama_spit: 3 potion: 8 shulker_bullet: 8 small_fireball: 8 snowball: 8 spectral_arrow: 16 trident: 16 wind_charge: 16 wither_skull: 4청크가 언로드되어 메모리에서 디스크로 저장될 때 청크당 최대 엔티티 수를 설정한다. 엔티티 종류마다 제한을 둘 수 있어서,
서버가 대량의 발사체를 저장하려다 크래시하는 것을 막을 수 있다. 이름으로 다른 엔티티를 이 목록에 추가할 수도 있다.
일부 플레이어가 엔티티를 대량으로 만들어 서버를 멈추려는 시도를 완화해 준다. 대형 몹 농장 건설을 막는 용도는 아니다.
보물 지도
섹션 제목: “보물 지도”treasure-maps.enabled
섹션 제목: “treasure-maps.enabled”보물 지도 생성은 성능을 매우 많이 먹는다. 찾아야 할 구조물이 아직 생성되지 않은 청크에 있으면 서버가 응답하지 않을 수도 있다.
월드를 사전 생성하고 바닐라 월드 경계를 설정해 둔 경우에만 이 기능을 켜는 것이 안전하다.
paper-world-default.yml의 설정으로, 서버가 보물 지도를 생성할지 정한다.
treasure-maps.find-already-discovered
섹션 제목: “treasure-maps.find-already-discovered”paper-world-default.yml의 설정으로, 보물 지도가 탐험하지 않은 곳을 가리키도록 강제할지 정한다.
추천값: loot-tables: true villager-trade: true탐험하지 않은 구조물은 보통 아직 생성되지 않은 청크에 있어서 서버가 느려질 수 있다.
villager-trade는 주민 거래로 얻는 지도에 영향을 준다.
loot-tables는 상자처럼 전리품을 생성하는 모든 보관함에 영향을 준다.
dolphin.disable-treasure-searching
섹션 제목: “dolphin.disable-treasure-searching”purpur.yml의 설정으로, 돌고래가 보물 지도를 찾을 수 있는지 정한다.
true로 설정하면 탐색을 끈다.
엔티티
섹션 제목: “엔티티”기본적으로 엔티티는 서버 부하의 40% 정도를 차지한다. 엔티티를 제어하지 않으면 시중 최고의 CPU를 써도 서버에 렉이 걸린다.
엔티티 수 제어
섹션 제목: “엔티티 수 제어”spark 같은 성능 분석 플러그인으로 봤을 때, 전체 엔티티 틱이 30% 아래로 유지되는 것이 바람직하다(어느 정도 플레이어가 접속해 있는 상황 기준).
spawn-limits
섹션 제목: “spawn-limits”bukkit.yml과 paper-world-default에 같은 설정이 있는데, Paper에서 설정하면 Bukkit의 값을 덮어쓴다.
그러니 paper-world-default에서 바로 설정하는 것을 추천한다.
spawn-limits: monsters: 70 #몬스터: 엘더 가디언, 엔더맨, 워든, 좀벌레, 피글린 야수, 스트레이, 환술사, 스켈레톤, 셜커, 조글린, 가디언, 마그마 큐브, 좀비 주민, 좀비 피글린, 변명자, 팬텀, 피글린, 슬라임, 엔더 드래곤, 드라운드, 약탈자, 소환사, 좀비, 거미, 허스크, 가스트, 파괴수, 호글린, 동굴 거미, 마녀, 위더, 엔더마이트, 위더 스켈레톤, 블레이즈, 거인, 크리퍼, 벡스 animals: 10 #동물: 돼지, 북극곰, 여우, 고양이, 좀비 말, 스니퍼, 판다, 토끼, 늑대, 소, 거북, 개구리, 알레이, 상인 라마, 당나귀, 벌, 낙타, 양, 올챙이, 오실롯, 닭, 무시룸, 말, 라마, 떠돌이 상인, 앵무새, 염소, 노새, 스켈레톤 말, 스트라이더 water-animals: 5 # 오징어와 돌고래 water-ambient: 20 # 대구, 복어, 연어, 열대어 water-underground-creature: 5 # 발광 오징어 axolotls: 5 # 아홀로틀 ambient: 15 # 박쥐만 해당. 0을 추천몹 최대 스폰 수는 플레이어 수 * 스폰 제한이다. 값이 작을수록 플레이어가 만나는 몹이 줄어들고, 몹 종류별로 각 플레이어 근처에 스폰될 확률은 균등하다.
양날의 검이다. 값이 낮으면 서버 부담이 줄지만, 대부분의 게임 모드에서 자연 스폰되는 몹은 게임플레이의 중요한 부분이다.
아래 표는 세 가지 상황별 추천값이다. 서버 렉 정도와 콘텐츠에 맞춰 알맞은 값을 고르자.
| 몹 유형 | 추천 최솟값 | 추천값 | 추천 최댓값 |
|---|---|---|---|
| monster | 18 | 30 | 45 |
| animal | 5 | 8 | 10 |
| water-animals | 2 | 3 | 5 |
| water-ambient | 2 | 3 | 5 |
| water-underground-creature | 3 | 4 | 5 |
| axolotls | 3 | 4 | 5 |
| ambient | 0 | 1 | 1 |
mob-spawn-range
섹션 제목: “mob-spawn-range”또 spigot.yml에는 몹 스폰 범위 설정이 있다.
mob-spawn-range: 8전체 몹 스폰 빈도와 수를 낮췄으니 몹의 전체 밀도가 눈에 띄게 떨어진다. 너무 먼 곳의 몬스터는 게임성에 거의 영향이 없다는 점을 고려하면,
몹 스폰 범위를 줄여서(청크 단위, 시뮬레이션 거리보다 클 수 없다) 바닐라에 가까운 밀도를 얻을 수 있다.
추천값:
spawn-limit 값 | 대응하는 mob-spawn-range 추천값 | 실제 몹 수 |
|---|---|---|
| 70 (기본값) | 8 (기본값) | 100% (기본값) |
| 56 | 6-7 | 90% |
| 42 | 5-6 | 78% |
| 28 | 4-5 | 65% |
| 14 | 3-4 | 48% |
엔티티 스폰과 디스폰
섹션 제목: “엔티티 스폰과 디스폰”ticks-per
섹션 제목: “ticks-per”bukkit.yml에 몹 스폰 빈도 설정이 있다.
ticks-per: animal-spawns: 400 monster-spawns: 1 water-spawns: 1 water-ambient-spawns: 1 water-underground-creature-spawns: 1 axolotl-spawns: 1 ambient-spawns: 1이 설정은 서버가 몇 틱마다 몹 스폰을 시도할지 정한다. 기본값은 매 틱, 즉 초당 20번이다.
당연히 아주 무거운 작업이지만, 값을 너무 높이면 몹이 상한에 닿지 않았는데도 스폰 빈도가 너무 낮아진다.
추천값:
ticks-per: animal-spawns: 399 monster-spawns: 9 water-spawns: 199 water-ambient-spawns: 399 water-underground-creature-spawns: 399 axolotl-spawns: 399 ambient-spawns: 999despawn-ranges
섹션 제목: “despawn-ranges”Paper에서
추천값:
ambient: hard: 72 soft: 30axolotls: hard: 72 soft: 30creature: hard: 72 soft: 30misc: hard: 72 soft: 30monster: hard: 72 soft: 30underground_water_creature: hard: 72 soft: 30water_ambient: hard: 72 soft: 30water_creature: hard: 72 soft: 30몹 종류별 디스폰 범위(블록 단위)를 조정한다. 값을 낮추면 플레이어에게서 멀리 떨어진 몹을 더 빨리 치울 수 있다.
soft 거리는 30 정도로 두고, hard 거리는 simulation-distance보다 약간 크게 설정하자. 그러면 플레이어가 청크 밖으로 막 벗어났을 때 몹이 바로 사라지지 않는다
([paper-world configuration]의 delay-chunk-unloads-by도 함께 조정할 수 있다). 몹이 hard 거리를 벗어나면 즉시 사라진다.
몹이 soft와 hard 거리 사이에 있으면 일정 확률로 사라진다. hard 거리는 soft 거리보다 커야 한다. 시뮬레이션 거리에 맞춰
(simulation-distance * 16) + 8로 조정하자. 이 설정 때문에 플레이어가 지나간 뒤 (몹이 아직 사라지지 않아서) 청크가 언로드되지 않을 수도 있다.
충돌 판정
섹션 제목: “충돌 판정”max-entity-collisions
섹션 제목: “max-entity-collisions”paper-world-default.yml에 있다.
spigot.yml의 같은 이름 항목을 덮어쓴다. 엔티티 하나가 동시에 처리할 수 있는 충돌 횟수를 정한다. 0이면 플레이어를 포함한 다른 엔티티를 밀 수 없다. 2면 대부분의 상황을 처리할 수 있다.
다만 maxEntityCramming 게임 규칙, 즉 몹이 겹쳐서 질식하는 동작이 깨진다는 점에 주의하자.
fix-climbing-bypassing-cramming-rule
섹션 제목: “fix-climbing-bypassing-cramming-rule”paper-world-default.yml에 있다.
엔티티가 기어오르는 동안 엔티티 밀집 규칙을 받지 않는 문제를 고칠지 정한다. 기어오르는 몹(예: 거미)이 좁은 공간에 대량으로 쌓이는 것을 막아 준다.
enable-suffocation-optimization
섹션 제목: “enable-suffocation-optimization”추천값: true
질식 검사(몹이 블록 안에 있는지, 질식 피해를 받아야 하는지 검사)의 빈도를 피해 쿨타임에 맞춰 제한해 최적화한다. 정확한 타이밍의 질식으로 엔티티를 처치하는 테크니컬 서바이벌 플레이어가 아니라면 이 최적화를 알아차릴 일은 없다.
엔티티 AI
섹션 제목: “엔티티 AI”몹 활성화 범위
섹션 제목: “몹 활성화 범위”entity-activation-range
섹션 제목: “entity-activation-range”spigot.yml에 몹 활성화 범위를 제어하는 entity-activation-range 설정이 있다.
엔티티의 AI가 활성화되는 거리(블록 단위)를 설정한다. 값을 낮추면 성능 향상에 도움이 되지만,
몬스터의 반응이 둔해질 수 있다. 너무 많이 낮추면 철 농장 같은 몹 농장이 망가질 수 있다.
추천값:
entity-activation-range: animals: 16 monsters: 24 raiders: 48 misc: 8 water: 8 villagers: 16 flying-monsters: 48inactive-goal-selector-throttle
섹션 제목: “inactive-goal-selector-throttle”pufferfish.yml의 몹 목표 선택 관련 설정이다.
비활성 엔티티의 목표 선택기를 제한해서, 매 틱이 아니라 20 tick마다 한 번씩 갱신하게 한다.
성능이 몇 퍼센트 오르고, 게임 경험에는 영향이 거의 없다.
dab
섹션 제목: “dab”pufferfish.yml의 몹 AI 관련 설정이다.
dab: enabled: true start-distance: 12 max-tick-freq: 30 activation-dist-mod: 7 blacklisted-entities: []dab이란? 멀리 있는 몹은 상대적으로 덜 중요하다는 점을 이용해, 거리에 따라 단계적으로 몹 AI 실행을 줄이는 알고리즘이다.
start-distance는 블록 단위로, 얼마나 먼 곳부터 몹의 AI를 줄일지 정한다.
activation-dist-mod는 감소 기울기다. 값을 늘리면 먼 엔티티가 더 자주 연산되고, 줄이면 먼 엔티티가 더 드물게 연산되어 서버가 더 매끄러워진다. 대신 엔티티와 환경의 상호작용에 영향을 주어 몹 농장 효율이 떨어질 수 있다.
max-tick-freq는 틱 단위로, 엔티티 틱 간격의 최댓값이다. 엔티티가 아무리 멀리 있어도 로드되어 있다면 20 tick 안에 최소 한 번은 연산된다.
blacklisted-entities는 dab의 AI 제어를 받지 않는 엔티티다. AI가 특히 중요한 엔티티가 있다면 여기에 넣어 보자.
상황별 추천값:
| 옵션 | AI를 희생해 성능 확보 | 추천 | 바닐라에 더 가깝게 |
|---|---|---|---|
| start-distance | 8 - 10 | 12 | 20 |
| max-tick-freq | 30 - 40 | 20 | 10 |
| activation-dist-mod | 7 - 8 | 7 | 6 - 7 |
스포너 관련
섹션 제목: “스포너 관련”nerf-spawner-mobs
섹션 제목: “nerf-spawner-mobs”spigot.yml의 스포너 몹 AI 설정이다.
nerf-spawner-mobs: false켜면 스포너에서 나온 몹의 AI를 제거한다. AI가 제거된 몹은 아무것도 하지 않는다.
이 옵션을 켜면 몹 농장과 게임 경험에 큰 영향을 주기 때문에, Paper는 더 사용자 친화적인 옵션을 마련해 두었다.
spawner-nerfed-mobs-should-jump
섹션 제목: “spawner-nerfed-mobs-should-jump”paper-world-defaults.yml의 스포너 몹 AI 설정이다.
spawner-nerfed-mobs-should-jump: false스포너에서 나온 몹이 물속에서 점프할 수 있는지 정한다. nerf-spawner-mobs 때문에 생기는 몹 농장 문제를 고쳐 준다.
tick-rates.mob-spawner
섹션 제목: “tick-rates.mob-spawner”paper-world-defaults.yml의 스포너 동작 주기 설정이다.
스포너의 틱 주기를 조정한다. 서버에 스포너가 많다면 간격을 늘리는 것이 큰 도움이 된다.
주민 관련
섹션 제목: “주민 관련”tick-inactive-villagers
섹션 제목: “tick-inactive-villagers”spigot.yml에는 비활성 상태 주민의 부하를 줄이는 설정이 있다.
tick-inactive-villagers: true비활성이란 주민이 위의 entity-activation-range 중 villagers로 설정한 범위 밖에 있는 상태다.
끄면 성능 향상에 도움이 되지만, 경우에 따라 먼 곳의 주민이 더 멍청해지고 철 농장 등의 효율도 떨어진다.
zombie.aggressive-towards-villager-when-lagging
섹션 제목: “zombie.aggressive-towards-villager-when-lagging”purpur.yml의 설정으로, 서버에 렉이 걸릴 때 좀비가 주민을 적대할지 정한다.
주민은 좀비에게 쫓길 때 아주 복잡한 경로 탐색, 철 골렘 소환 같은 동작을 한다.
많은 주민이 좀비에게 겁먹으면 렉이 생긴다. TPS가 purpur.yml에 설정한 lagging-threshold 값보다 낮을 때 이 옵션을 켜면 좀비가 주민을 쫓지 않는다.
villager.lobotomize.enabled
섹션 제목: “villager.lobotomize.enabled”purpur.yml의 주민 AI 설정이다.
주민 때문에 서버에 렉이 걸릴 때만 켜자! 그렇지 않으면 주민 경로 탐색에 문제가 생긴다.
AI가 제거된 주민은 제때 거래 품목만 보충한다. 켜면 주민의 자동 경로 탐색이 꺼진다.
villager.search-radius
섹션 제목: “villager.search-radius”purpur.yml의 주민 탐색 범위 설정이다. 주민이 작업대 블록과 침대를 찾는 반경을 조정한다.
추천값:
villager: search-radius: acquire-poi: 16 nearest-bed-sensor: 16값을 낮추면 주민 성능이 크게 좋아지지만, 설정값보다 먼 작업대 블록이나 침대는 감지하지 못하게 된다.
tick-rates
섹션 제목: “tick-rates”paper-world-default.yml에서 AI 동작이 실행되는 간격을 정한다.
추천값:
behavior: villager: acquirepoi: 120 validatenearbypoi: 60sensor: villager: nearestbedsensor: 80 nearestlivingentitysensor: 40 playersensor: 40 secondarypoisensor: 80 villagerbabiessensor: 40Pufferfish의 DAB을 켰다면 이 항목의 기본값은 바꾸지 않는 것이 좋다.
acquirepoi는 주민이 가장 자주 하는 동작이라 간격을 크게 늘렸다. 주민의 경로 탐색에 문제가 있다면 이 값을 줄이자.
경로 탐색
섹션 제목: “경로 탐색”update-pathfinding-on-block-update
섹션 제목: “update-pathfinding-on-block-update”paper-world-default.yml에서 몹의 경로 탐색을 제어한다.
끄면 경로 탐색 횟수가 줄어 성능이 오른다. 경우에 따라 몹이 더 굼떠 보일 수 있다.
몹은 5틱(0.25초)마다 한 번씩만 경로를 수동적으로 갱신한다.
드롭 아이템과 경험치
섹션 제목: “드롭 아이템과 경험치”alt-item-despawn-rate
섹션 제목: “alt-item-despawn-rate”paper-world-default.yml에서 드롭 아이템별로 디스폰 시간을 정할 수 있다.
추천값:
enabled: trueitems: cobblestone: 300 netherrack: 300 sand: 300 red_sand: 300 gravel: 300 dirt: 300 grass: 300 pumpkin: 300 melon_slice: 300 kelp: 300 bamboo: 300 sugar_cane: 300 twisting_vines: 300 weeping_vines: 300 oak_leaves: 300 spruce_leaves: 300 birch_leaves: 300 jungle_leaves: 300 acacia_leaves: 300 dark_oak_leaves: 300 mangrove_leaves: 300 cherry_leaves: 300 cactus: 300 diorite: 300 granite: 300 andesite: 300 scaffolding: 600enabled: trueitems: cobblestone: 300 netherrack: 300 sand: 300 red_sand: 300 gravel: 300 dirt: 300 short_grass: 300 pumpkin: 300 melon_slice: 300 kelp: 300 bamboo: 300 sugar_cane: 300 twisting_vines: 300 weeping_vines: 300 oak_leaves: 300 spruce_leaves: 300 birch_leaves: 300 jungle_leaves: 300 acacia_leaves: 300 dark_oak_leaves: 300 mangrove_leaves: 300 cherry_leaves: 300 cactus: 300 diorite: 300 granite: 300 andesite: 300 scaffolding: 600지정한 아이템이 사라지기까지의 시간(틱 단위)을 설정한다. 성능을 높이려면 아이템 청소 플러그인이나 merge-radius 대신 이 옵션을 쓰는 것을 추천한다.
merge-radius
섹션 제목: “merge-radius”spigot.yml에서 같은 종류의 아이템과 경험치 구슬이 합쳐지는 거리를 설정한다.
추천값:
item: 3.5exp: 4.0바닥에 떨어진 아이템 수를 줄일 수 있다. 너무 높게 설정하면 아이템이 합쳐질 때 순간 이동하는 것처럼 보이고, 아이템이 블록을 통과해 일부 몹 농장이 망가질 수도 있다.
이 옵션은 아이템이 벽을 통과하는지 확인하지 않는다(Paper의 fix-items-merging-through-walls를 켜지 않는 한).
경험치 구슬은 생성될 때만 합쳐진다. 드롭 아이템 수를 줄이려면alt-item-despawn-rate`를 쓰는 것을 추천한다.
non-player-arrow-despawn-rate
섹션 제목: “non-player-arrow-despawn-rate”몬스터가 쏜 화살이 사라지는 시간(틱 단위)이다. 플레이어가 이 화살을 주울 수 없으니 20(1초) 정도로 설정해도 된다.
creative-arrow-despawn-rate
섹션 제목: “creative-arrow-despawn-rate”크리에이티브 모드 플레이어가 쏜 화살이 사라지는 시간(틱 단위)이다. 플레이어가 이 화살을 주울 수 없으니 20(1초) 정도로 설정해도 된다.
갑옷 거치대
섹션 제목: “갑옷 거치대”paper-world-default.yml에서 갑옷 거치대를 틱 처리할지 정한다.
armor-stands.tick
섹션 제목: “armor-stands.tick”대부분의 경우 false로 설정해도 안전하다. 갑옷 거치대나 관련 플러그인을 쓰다가 문제가 생기면 다시 켜자.
갑옷 거치대가 물에 밀리거나 중력의 영향을 받지 않게 된다.
armor-stands.do-collision-entity-lookups
섹션 제목: “armor-stands.do-collision-entity-lookups”갑옷 거치대 충돌을 켤지 정한다. 갑옷 거치대가 많고 무엇과도 충돌하지 않기를 원한다면 도움이 된다.
레드스톤
섹션 제목: “레드스톤”레드스톤 엔진
섹션 제목: “레드스톤 엔진”redstone-implementation
섹션 제목: “redstone-implementation”paper-world-default.yml에서 레드스톤 시스템이 쓸 엔진을 정한다.
레드스톤 시스템을 최적화된 버전으로 바꿔서 불필요한 업데이트를 줄이고 서버가 계산해야 할 로직의 양을 줄인다. 일부 레드스톤 장치에 영향을 줄 수 있지만,
향상 폭이 매우 커서 성능이 70%까지 좋아질 수 있으니 득이 실보다 크다. Bukkit 때문에 생긴 레드스톤 동기화 문제까지 고쳐 준다.
ALTERNATE_CURRENT는 Alternate Current를 기반으로 한다. 자세한 내용은 해당 페이지를 읽어 보자.
hopper.disable-move-event
섹션 제목: “hopper.disable-move-event”paper-world-default.yml에서 호퍼의 무거운 이벤트 하나를 제어한다.
InventoryMoveItemEvent를 수신하는 플러그인이 있을 때만 이 이벤트가 발생한다.
보호 플러그인처럼 이 이벤트를 수신하는 플러그인을 쓰려면 true로 설정하지 말자!
hopper.ignore-occluding-blocks
섹션 제목: “hopper.ignore-occluding-blocks”paper-world-default.yml에서 호퍼가 완전한 블록 안에 있는 보관함을 무시할지 정한다.
모래나 자갈 안에 있는 호퍼 광산 수레 같은 경우의 부하를 줄인다. 켜면 일부 레드스톤 장치가 망가질 수 있다.
tick-per
섹션 제목: “tick-per”ticks-per: hopper-transfer: 8 hopper-check: 1hopper-transfer는 호퍼가 몇 틱마다 아이템을 옮길지 정한다.
hopper-check는 호퍼가 한 번에 몇 개의 아이템을 옮길지 정한다.
호퍼가 아주 많은 서버에서는 hopper-transfer와 hopper-check를 잘 조합하면 호퍼 부하를 줄일 수 있다(
다만 분류기 같은 일부 장치의 동작에 약간 영향을 줄 수 있다).
또 hopper-check를 높이면 호퍼의 단위 시간당 아이템 운송 효율이 올라가서,
같은 양의 아이템을 옮기는 데 호퍼가 쓰이는 시간이 줄어들고 호퍼 부하도 더 줄어든다.
| 호퍼 속도 | 서버 부하 | hopper-transfer | hopper-check |
|---|---|---|---|
| 50% | 중하 | 16 | 1 |
| 100% | 중상 | 8 | 1 |
| 100% | 낮음 | 16 | 2 |
| 200% | 중간 | 8 | 2 |
optimize-explosions
섹션 제목: “optimize-explosions”paper-world-default.yml에서 폭발 최적화를 켤지 정한다.
true로 설정하면 바닐라 폭발 알고리즘을 최적화된 버전으로 바꾼다. 폭발 피해가 아주 약간 달라지는 대신 폭발 시 성능이 크게 좋아진다.
기타 최적화
섹션 제목: “기타 최적화”콘솔의 쓸모없는 메시지 줄이기
섹션 제목: “콘솔의 쓸모없는 메시지 줄이기”서버에는 플레이어의 비행, 과속 등을 감지하는 아주 조잡한 안티치트가 내장되어 있지만, 효과는 형편없다.
특히 서버에 렉이 걸리면 콘솔이 이 메시지로 도배된다. 안티치트를 하나라도 설치했다면
이런 쓸모없는 도배 메시지는 꺼도 된다. 안티치트를 하나도 설치하지 않았다면 기본 안티치트는 남겨 두자.
server.properties를 다음과 같이 설정한다.
allow-flight=true말을 타거나 비계를 오를 때 “비행”으로 판정되어 서버에서 추방되는 것을 막는다.
true로 설정해도 플레이어가 날 수 있게 되는 것은 아니다. 서버가 플레이어가 난다고 판단해도 추방하지 않을 뿐이다.
spigot.yml을 다음과 같이 설정한다.
settings: moved-wrongly-threshold: 1 # 플레이어의 잘못된 이동 무시 moved-too-quickly-multiplier: 99999 # 플레이어의 과속 이동 무시



