Optimize Edilmiş Sunucu Başlatma Kodu - Tüm Sunucular İçin

Bu konu süresiz olarak sabitlenmiş.

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
V2.X
Yeni recode sürümü çıktı!
Buraya tıklayarak yeni sürümün kaynak sayfasına gidebilirsiniz.

Merhabalar
Bu konumda sizlere uzun süre test edip kullandığım ve birçok tecrübe edinerek geliştirdiğim optimize edilmiş başlatma kodunu tanıtıp paylaşacağım.
Öncelikle özellikleri açıklayıp daha sonra kodu aşağıya bırakıyorum. Ondan sonrasında da yapmanız gereken değişiklikleri ve her kodun teker teker ne iş yaptığını açıklayacağım.

Özellikler
- Özel CMD penceresi başlığı.
- Bilgilendirici echo mesajları.
- Tamamen optimize edilmiş java argümanları.
- Otomatik bazı gereksiz dosyaları temizler.
- Sunucu çökünce / kapanınca otomatik reset atma (tekrar açma) fonksiyonu.

Uyumluluk
Java 8 / JDK 8 gerektirir. JDK 8 üstünde (örn. JDK 11) çalıştırmak istiyor iseniz bazı kodlar silindiği, deprecated edildiği veya değiştirildiği için kaldırmanız, değiştirmeniz gerekebilir. Yazılım bilginiz yok ise ve ille de JDK 11 kullanmak istiyor iseniz yoruma aldığınız hatayı yazabilirsiniz.

Kodumuz
Bash:
@echo off
title Sunucu Yonetim Kontrol Paneli
:start
echo Sunucu aciliyor...
java -XX:+UnlockExperimentalVMOptions -server -Xms256M -Xmx3G -XX:-HeapDumpOnOutOfMemoryError -XX:SoftRefLRUPolicyMSPerMB=1000 -XX:-UseCompressedOops -XX:+TieredCompilation -XX:+UseLWPSynchronization -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+ParallelRefProcEnabled -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Duser.language=en -Duser.country=US -Dpaper.playerconnection.keepalive=120 -Dlog4j.skipJansi=true -jar LifeSpigot.jar -nojline -o false --log-append=false --log-strip-color=true nogui
echo Sunucu kapandi. Yeniden baslatilmasini istemiyor iseniz pencereyi kapatin.
echo Gunluk temizlik baslatiliyor..
echo Dosyalar siliniyor...
del \plugins\NoCheatPlus\*.log /q
del \plugins\NoCheatPlus\*.lck /q
del \plugins\NoCheatPlus\*.log.* /q
del \plugins\AntiAura\logs\*.* /q
del \plugins\AuthMe\authme.log /q
del \plugins\bStats\temp.txt /q
echo Dosya silme basarili, sunucu yeniden baslatiliyor..
timeout 5 > nul
goto start


Değiştirmeniz Gerekenler
İlk olarak maksimum RAM miktarını değiştirmelisiniz. -Xmx3G kısmını, makinenizin toplam RAM miktarı - 1 veya - 2 olarak ayarlamanızı tavsiye ederim. Eğer değiştirmez iseniz "insufficient memory", "unable to launch jvm" veya "out of memory" tarzı hatalar alabilirsiniz.

İkinci olarak -jar LifeSpigot.jar kısmını değiştirmelisiniz. Buradaki LifeSpigot.jar kısmını sizde artık "spigot.jar" veya "craftbukkit.jar" olabilir, onun ile değiştirmelisiniz. Değiştirmez iseniz "unable to access jarfile LifeSpigot.jar" tarzı bir hata alabilirsiniz.

Daha sonrasında herhangi bir şey değiştirmenize gerek yok fakat okumaya devam etmenizi tavsiye ederim.


Değiştirmenizi Önerdiklerim
Bunları değiştirmeseniz de olur fakat sadece önerimdir.

İlk olarak @Echo off dan sonraki satırda bulunan title Sunucu Yonetim Kontrol Paneli kısmını değiştirmeniz tavsiyem. Özellikle eğer BungeeCord kullanıyor ve birçok sunucunun CMD penceresini aynanda açık olarak ekranda görünüyor iseniz hepsinin aynı başlığa sahip olması karışıklık çıkaracaktır. Hepsine "Faction Yonetim Kontrol Paneli" tarzı isimler verip ayırabilirsiniz. Örneğin verdiğim örmek için kod "title Faction Yonetim Kontrol Paneli" olmalı, iki tırnak işaretleri olmadan tabii. Bir de türkçe karakter kullanmamanız tavsiyem.

-XX:+DisableExplicitGC: Bu ayar RAM kullanımını biraz daha esnekleştirir ve GC'leri azaltarak donmaları azaltmayı hedefler. İsterseniz kapatabilirsiniz, RAM kullanımınız yüksek ise ilk olarak bunu silip tekrar deneyin.

-Djava.awt.headless=true: Bu ayar makinede ekran olmadığını belirtiyor yani GUI vs. açan uygulamalar çalışmıyor. Sunucu da zaten bu tür şeyler genelde olmaz. Başka bir oyuna veya client'e uyarlayacak iseniz bunu kaldırmanız tavsiyem.

-Dlog4j.skipJansi=true: Eğer sunucu başlangıcında "WARN unable to insaniaite org.fusesource.jansi .." tarzı bir hata alıyor iseniz bu ayar onu kapatıyor. Altını çiziyorum çözmüyor, kapatıyor. Gereksiz bir uyarı mesajı sadece. Zaten -njline ile JLine'ı kapatıyoruz.

-nojline: JLine, yani konsolda yazıların oyun içindeki renk kodları gibi renkli olmasını ve üst tuşuna basarak konsola girdiğimiz komutları tekrar etmemizi sağlayan kütüphaneyi kapatmaya yarıyor. Bir performans artışı sağlar belki fakat ben zaten renkli olunca karışık olduğunu düşündüğüm ve makineden konsola zaten nadiren baktığım için (log dosyaları diye bir şey var) JLine'ın kapalı kalması daha mantıklı geliyor.

-o false: Bu ayar online-mode'u kapatıyor. Yeni spigot sürümlerinde kaldırıldı diye hatırlıyorum. Emin olmak için eklemiş olabilirim. Siz kaldırabilirsiniz.

nogui: BukkitGUI tarzı programlar kullanıyor iseniz kaldırabilirsiniz. Bukkit'in içine çok eski sürümlerde gömülü olan bir sistem vardı onu kapatıyor diye hatırlıyorum. Şuanda bir işlevi var mı bir bilgim yok bu ayarın.

del XX.log /q vb. kısımlar: Bunlar otomatik bazı gereksiz bulduğum log ve geçici dosyaları siliyor. Ne kadar gerekli bilinmez. Bir artı sağlamıyor bana ama uzun zamandır ekli olan bir kod. Silmekte özgürsünüz.


JVM Argümanları ve Anlamları
Bu kısımı normal bir kullanıcı iseniz okumanıza gerek yok. Buraya kadar çok okudunuz bile, tebrikler :D Yinede okumak istiyorsanız okuyabilirsiniz, ekstra bilgi hiçbir zaman kötü değildir.

JVM argümanları, veya daha doğru bir deyiş ile JVM komut satırı başlatma argümanları, bir kaç şekle ayrılır.

İlk olarak en çok kullanılan direk -ayar şeklinde yazılan ayarlar. Mesela -Xms1M gibi.
İkinci olarak kullanıcı parametreleri. Mesela -Duser.language=EN gibi.
Üçüncü olarak -XX: ile başlayan gelişmiş ayarlar.

Bu gelişmiş ayarlarda eğer -XX: den sonra - var ise o o ayarın kapatılacağı, + var ise açılacağı anlamına gelir.

Gelişmiş ayarlar genelde normal ayarlar kadar güvenli değildir.
Bende bu kodlar hakkında herhangi bir garanti sağlamıyorum fakat kendi sunucumda uzun süredir kullandığımı ve birçok sunucunun kullanıp memnun olduğunu söyleyebilirim.

Her neyse.. Şimdi uzun kısma gelelim. Sizin için teker teker her özellik, ayar ne işe yarıyor açıklamaya çalıştım.
Buyrunuz:


JVM Argümanlarının Anlamları

-XX:+UnlockExperimentalVMOptions: Bazı gelişmiş ayarların kilidini açmaya yarıyor.
-d64: JVM'yi 64-bit JVM olarak ayarlıyor. Zaten 64-bit JVM yükledi iseniz bu 64-bit seçiyor otomatik diye biliyorum fakat bu emin olmak için :D
-server: JVM'yi önceden konfigüre edilmiş sunucular için önerilen ayarlar ile donatıyor.
-Xms1M: Sunucunun 1MB ram ile başlayıp sadece ihtiyacı olduğunda RAM yemesini sağlıyor.
-Xmx8G: Maksimum RAM miktarını 8GB olarak belirliyor. Bu RAM miktarı aşıldığında JVM otomatik Out Of Memory hatası verecektir.
-XX:-HeapDumpOnOutOfMemoryError: Out Of Memory hatasına karşın head dump yapmayı kapatıyor. Head dump yapmak eğer işletim sistemininde RAM miktarı az kalmış ise durumu daha kötü etkiler, eğer geliştirici iseniz ve bu Out Of Memory hatası uygulamanızın basit şekilde çok fazla thread açmasından kaynaklanmıyor ise, sorunu çözmek ve kaynağını tespit etmek için başındaki - yi + yaparak head dump özelliğini açabilirsiniz.
-XX: SoftRefLRUPolicyMSPerMB=1000: Soft Reference objelerinin ne kadar süre boyunca hayatta kalacağını yani GC ile öğütülmeyeceğini belirliyor. Varsayılan değer bu sanırım ama yine de kalabilir.

-XX:+UseCompressedOops: Sıkıştırılan obje kullanmayı falan aktifleştiriliyordu sanırım. Bu argümanların çoğunu Oracle'nin sitesinde farklı makalelerde listelerde buldum diye hatırlıyorum.
-XX:+TieredCompilation: Java kodu Native koda dönüştürülür iken birden fazla thread kullanarak daha hızlı dönüştürme yapmaya yarıyordu diye hatırlıyorum.
-XX:+UseLWPSynchronization: Daha lightweight bir senkronize sistemi kullanmaya yarıyordu sanırım, bu şekilde performans artışı sağlıyor.
-XX:+UseBiasedLocking: Lock sistemini değiştiriyor ve yine daha lightweight bir sisteme geçiriyor diye hatırlıyorum.
-XX:+UseFastAccessorMethods: Methodlara daha hızlı erişmeye yarayan bir özelliği açıyor.
-XX:+UseG1GC: G1GC çöp toplayıcı (GC) sistemini kullanması konusunda JVM'ye bilgi veriyor.
-XX:+UseStringDeduplication: Bu ayar birden fazla kullanılan string objeleri için aynı objeyi kullanıyor. Kısaca aynı değeri temsil eden yazılar için bir den fazla string objesi açılmıyor. String cache tarzı bir sistem yani.
-XX:+ParallelRefProcEnabled: Paralel olarak referans objelerini işlemeyi açıyor. Paralel multi-threaded demek yani aynanda birden fazla iş yapılabiliyor.
-XX:+UseLargePagesInMetaspace: Metaspace adlı bellek bölümünde large pages denen sistemi kullanıyor.
-XX:+AggressiveOpts: JVM'nin bazı güvensiz optimizeleri yapmasına izin veriyor. Güvensiz değilde daha çok experimental, JDK11 de bu ayar kaldırılıp default oldu sanırım.

-XX:+DisableExplicitGC: Bu ayar bu kod arasında en çok tartışma yaratacak kod belkide. RAM kullanımını yükselttiği doğrudur. Fakat RAM kullanımını yükselten bu değil. Zaten -Xms1M sayesinde 1MB ile başlayıp ihtiyacı olunca yükselmesini ayarlamıştık. Yani kısaca bu koddan sonra RAM kullanımı artar ise o sizin sunucunuzun yediği RAM'dir. Sadece eğer bu ayarı kaldırır iseniz o RAM sürekli azaltılmaya çalışır ve JVM uygulama taraflı gelen güvensiz GC isteklerini de işler, bu da daha fazla GC demek. Eğer React tarzı bir eklenti otomatik GC yapıyor ise ve bu donmalara neden olabiliyor ise bu kod onu çözecektir fakat RAM kullanımını arttıracaktır. Bu arada RAM kullanımının artmasının hiçbir zararı yok. JVM ihtiyacı olduğunda hala GC yapacaktır. Bu kod GC'yi kapatmaz sadece kullanıcı kodundan gelen GC isteklerini yoksayar, yani sadece gerçekten ihtiyacı olduğunda GC yapar. Buda RAM gerekmediği zaman yüksek kullanılır demek.

-Djava.awt.headless=true: Bunu zaten yukarıda açıklamıştım.
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Duser.language=EN -Duser.country=US: Bu kodların hepsi türkiye makinelerde çıkan UTF-8 (türkçe karakter) sorunlarını çözmek için eklenen kodlar.
-Dpaper.playerconnection.keepalive=120: java.io.IOException: Connection forcibly closed by remote host tarzı hataları azaltmak için timeout süresini arttıran kod. Varsayılan 30 diye biliyorum 60-120 arası kullanabilirsiniz.
-Dlog4j.skipJansi=true: Bunu ve diğer Java argümanı olmayıpta program / spigot argümanı olan bir kaç şeyi daha yukarıda açıklamıştım, bakabilirsiniz.



Başka bir anlamadığınız veya sormak istediğiniz kod var ise cevaplamaktan mutluluk duyarım.
Bir sonraki konularda görüşmek üzere..
 


Son düzenleme:

ErenKrblt

Ağaç Yumruklayıcı
Mesajlar
20
En iyi cevaplar
0
Beğeniler
8
Puanları
50
Ruh hali
Discord'dan bir şey Hakkında Yardım Alacağım Özelden Destek Veriyormusunuz ?
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali

Umarım oradaki kodların 8 çekirdek işlemcili en az 16GB dedicated makinelerde test edildiğini ve bazı kodların makineleri çok zorladığını, Windows'un bile çalışmasının önüne geçtiğini biliyorsundur. Konumda da zaten oradaki kodlardan da esinlendiğimi belirtmiştim diye hatırlıyorum fakat bunun yanında birçok araştırma ve testte yaptım performans kodları konusunda kimse zaten stabilite vaad edemez fakat utf-8 kodları sayesinde sunucunun her yerinde Türkçe karakter kullanılabiliyor. Kullandığım her kodu konumda açıklamam ise ayrı bir artı. Sırf yorum atmak için yorum atmayın lütfen bir dahakine..
 

Emristyy

Overisty Universe
Mesajlar
41
En iyi cevaplar
0
Beğeniler
48
Puanları
240
Ruh hali
Büyük fark yaratırmı peki?
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Büyük fark yaratırmı peki?

Kodlar genel olarak performans artışı ve utf-8 / Türkçe karakter sorunlarını çözse de bir sunucu da zaten ya lag vardır ya da yoktur, eğer varsa gerçek sebebini bulana kadar ne yaparsanız yapın çözemezsiniz, en fazla hafifletebilirsiniz, lag yok ise de yaptıklarınız fazla gözle görülür etki sağlamaz çünkü zaten lag yoktur.

Herkese kullanmasını tavsiye ettiğim bir kod tabii ki, isterseniz -XX: gibi gelişmiş ayarları kaldırıp sadece utf-8 kodlarını da kullanabilirsiniz o halini de eklerim konuya belki.
 

Morona

Kömür Madencisi
Mesajlar
139
En iyi cevaplar
4
Beğeniler
141
Puanları
640
Ruh hali
Ben de kendimi sunucu yönetimini bilen biri sanıyordum. Süper bir rehber konusu olmuş, eline sağlık.
 

MeereeY

Sudan Çıkmış
Mesajlar
2
En iyi cevaplar
0
Beğeniler
1
Puanları
10
Arkadaşlar şöyle bir kod girdim ama minecraft bukkit server açarken, jar'ın ismini falan mc18 yapmama rağmen bir işe yaramadı ve start bat'ı başlattığımda dosyalar gelmedi. şu an sadee .jar ve start bat dosyası duruyor. Ne yapsam da gelmedi server dosyaları. Bunun çözümü nedir ? Neyi değiştirmem gerekiyor ?
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Arkadaşlar şöyle bir kod girdim ama minecraft bukkit server açarken, jar'ın ismini falan mc18 yapmama rağmen bir işe yaramadı ve start bat'ı başlattığımda dosyalar gelmedi. şu an sadee .jar ve start bat dosyası duruyor. Ne yapsam da gelmedi server dosyaları. Bunun çözümü nedir ? Neyi değiştirmem gerekiyor ?

Resmi tam göremiyorum fakat start.cmd adında bir dosya açıp içine konudaki kodları yapıştırdıktan sonra konuda belirtilen düzenlemeleri yapıp çalıştırırsan olması gerekiyor.
 

Üst