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

Bu konu süresiz olarak sabitlenmiş.

YıkılaYıkıla

Ağaç Yumruklayıcı
Mesajlar
12
En iyi cevaplar
0
Beğeniler
1
Puanları
120
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..
hacı yeni paylaştıpın start.bat çalışmıyor hata veriyor -jar spigot yaptım java 8 yüklü jdk 8 yüklü verdiği hata ise şu

Java HotSpot(TM) Client VM warning: TieredCompilation is disabled in this release.
Error occurred during initialization of VM
Could not reserve enough space for 3254272KB object heap

yardım edermisin
 

Nxymn

Warum diese games? Sei doch einfach Straight.
Mesajlar
355
En iyi cevaplar
2
Beğeniler
197
Puanları
400
Ruh hali
3Line sağlık
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
hacı yeni paylaştıpın start.bat çalışmıyor hata veriyor -jar spigot yaptım java 8 yüklü jdk 8 yüklü verdiği hata ise şu

Java HotSpot(TM) Client VM warning: TieredCompilation is disabled in this release.
Error occurred during initialization of VM
Could not reserve enough space for 3254272KB object heap

yardım edermisin

2.3.1 olanı kaynak sayfasından indirdiniz değil mi? TieredCompilation uyarısı sorun çıkarmaz, sadece uyarı. Fakat bu uyarı normalde Java 7'de çıkar, Java 8 kullandığınıza emin olmak için cmd'ye java -version yazın. (eski sürümlerde java --version da deneyebilirsiniz)

- jar spigot yaptım derken? Ayarlar kısmından jar_name=spigot yapabilirsiniz fakat onu da yapmanıza gerek yok başlatma kodu otomatik algılar JAR dosyasını.

İkinci ve sunucunun başlamamasının asıl nedeni ise RAM yetersizliği; eğer min_ram ve max_ram ayarlarını yapmaz iseniz başlatma kodu otomatik olarak min_ram'i eğer 1.5GB ram var ise 1.5GB'a yok ise boşta ki RAM miktarına, max_ram'i de makinedeki boşta ram miktarı - 1GB'a ayarlıyor. Bu durumda RAM yetersizliği hatası vermesi ilginç. Ram'iniz 1.5GB 'dan az mı?

Sorunu çözmek için min_ram ve max_ram ayarlarını kendiniz ayarlayıp tiered_compilation=true ayarını =false yapabilirsiniz.

Eğer sorunun nedeniyle alakalı detay paylaşırsanız sonraki güncellemede bende çözmek isterim. Bunun için aşağıdaki soruları cevaplayın lütfen:

- Java sürümünüz ne (son sürümler: Java 8 için 8u271, Java 15 için 15.0.1) ?
- Başlatma kodu sürümünüz ne (son sürüm: 2.3.1) ?
- Başlatma kodunu yürüttüğünüz makinenizdeki veya bilgisayarınızdaki RAM miktarınız nedir?
 

YıkılaYıkıla

Ağaç Yumruklayıcı
Mesajlar
12
En iyi cevaplar
0
Beğeniler
1
Puanları
120
Ruh hali
2.3.1 olanı kaynak sayfasından indirdiniz değil mi? TieredCompilation uyarısı sorun çıkarmaz, sadece uyarı. Fakat bu uyarı normalde Java 7'de çıkar, Java 8 kullandığınıza emin olmak için cmd'ye java -version yazın. (eski sürümlerde java --version da deneyebilirsiniz)

- jar spigot yaptım derken? Ayarlar kısmından jar_name=spigot yapabilirsiniz fakat onu da yapmanıza gerek yok başlatma kodu otomatik algılar JAR dosyasını.

İkinci ve sunucunun başlamamasının asıl nedeni ise RAM yetersizliği; eğer min_ram ve max_ram ayarlarını yapmaz iseniz başlatma kodu otomatik olarak min_ram'i eğer 1.5GB ram var ise 1.5GB'a yok ise boşta ki RAM miktarına, max_ram'i de makinedeki boşta ram miktarı - 1GB'a ayarlıyor. Bu durumda RAM yetersizliği hatası vermesi ilginç. Ram'iniz 1.5GB 'dan az mı?

Sorunu çözmek için min_ram ve max_ram ayarlarını kendiniz ayarlayıp tiered_compilation=true ayarını =false yapabilirsiniz.

Eğer sorunun nedeniyle alakalı detay paylaşırsanız sonraki güncellemede bende çözmek isterim. Bunun için aşağıdaki soruları cevaplayın lütfen:

- Java sürümünüz ne (son sürümler: Java 8 için 8u271, Java 15 için 15.0.1) ?
- Başlatma kodu sürümünüz ne (son sürüm: 2.3.1) ?
- Başlatma kodunu yürüttüğünüz makinenizdeki veya bilgisayarınızdaki RAM miktarınız nedir?
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) Client VM (build 25.241-b07, mixed mode)
java versiyonum bu
ram ayarlarını yaptım
tiered_compilation=true bunuda fasle yaptım yine olmadı
jdk 8 yüklü ama olmuyor
sunucum local host ondan olabilirmi
 

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) Client VM (build 25.241-b07, mixed mode)
java versiyonum bu
ram ayarlarını yaptım
tiered_compilation=true bunuda fasle yaptım yine olmadı
jdk 8 yüklü ama olmuyor
sunucum local host ondan olabilirmi

Bilgisayarınızın ram miktarı ne? Java sürümünüz eski bu arada. JDK'da değil, JRE yüklü. JDK 1.8.0_271 sürümünü Oracle'nin sitesinden hesap açarak indirebilirsiniz. (Google'a JDK yazdığınızda çıkan ilk adres, fakat hesap açmanız zorunlu java.com'un aksine)

tiered_compilation=false yapıp, min_ram ve max_ram ayarlarını bilgisayarınızın RAM'ine göre ayarladıysanız olması gerek. Hala aynı hatayı mı veriyor yoksa farklı bir hata mı?

Localhost olması fark etmez, muhtemelen onla alakalı değildir. Windows sürümünüzü de belirtirseniz iyi olur.
 

RunHeavenTR

Marangoz
Mesajlar
45
En iyi cevaplar
0
Beğeniler
10
Puanları
40
Ruh hali
Herkes için yararlı olabilecek gerekli bir konu.
Başarılar dilerim <3
 
Son düzenleme:

Üst