Jump to content

Recommended Posts

Posted

Σας κέντρισα το ενδιαφέρον ? Αν ναί πάμε καλά ( γιατί με όσα ακολουθήσουν ίσως βαρεθείτε οι περισσότεροι ). Αν όχι , never mind. Ο οδηγός αυτός αποτελείτε από πολλά μέρη ( δεν εχω αποφασίσει ακόμα πόσα γιατί δεν τον έχω γράψει κάν ). Τον γράφω παράλληλα καθώς διαβάζω ένα βιβλίο για Garbage Collection.

 

Μάθημα Πρώτο: Εισαγωγή / Διάρκεια 15- 20 λεπτά.

 

--> Garbage Collection, τί είναι αυτό ?

 

Συλλογή σκουπιδιών ... στην Java. Όταν ο server σας τρέχει δημιουργούνται συνεχώς αντικείμενα στην μνήμη για την σωστή λειτουργεία του server. Ας υποθέσουμε οτι έχουμε έναν παίκτη και ας τον ονομάσουμε daggerakosGR ( what a noob ... ). Οταν ο DaggerakosGR κάνει login δημουργείται το αντικείμενο που αντιπροσωπεύει τον παίκτη ( L2PcInstance ) μαζί με όλες τις απαραίτητες πληροφορίες που χρειάζονται ( Skills, μπλά μπλά μπλα ). Όταν ο παίκτης αποφασίσει να κάνει logout ( μάλλον γιατί φωνάζει η μαμά "ύπνο τώρα ! " ) το αντικείμενο του παίκτη πρέπει να καταστραφεί επίσης για να μήν γεμίσει η μνήμη. Την δουλειά αυτή ( Garbage Collection ) την αναλαμβάνει ο Garbage Collector μία υπομονάδα της μηχανής της java που κάνει αυτή ακριβώς την δουλειά. Καταστρέφει αντικείμενα που δεν χρησιμοποιούνται.

 

--> Τί αντικείμενα χρησιμοποιούνται από έναν παίκτη ?

 

Διάφορα. Για παράδειγμα τα Skills του DaggerakosGR δημιουργούνται όταν επιλέξει το κατάλληλο Subclass και καταστρέφονται όταν αλλάξει Subclass ή κάνει Logout. Επίσης, κάθε ενέργεια που κάνει ο χρήστης δημιουργεί συνήθως αντικείμενα. Για παράδειγμα όταν ο χρήστης μετακινεί τον χαρακτήρα του δημιουργεί ένα αντικείμενο το οποίο χρησιμοποιείται για να ενημερώσου τους άλλους παίκτες οτι ο χρήστης κινείτε. Επίσης , όταν κάνει Summon ή όταν κάνει pickup ένα item.

 

--> Και γιατί πρέπει αυτά τα αντικείμενα να εξαφανίζονται όταν δεν χρησιμοποιούνται ?

 

Γιατί δεν έχεις 99999999999 GB ram :) ( Εκτός άν έχεις και δεν το γνωρίζουμε ... :) Μια φορά κάποιος στο MSN μου είπε οτι έχει server με 32 GB ram ... λολ).

--> Που χρειάζεται ο Guide αυτός ?

 

Ο Garbage Collector δεν λειτουργεί πάντα αποδοτικά σε όλες της εφαρμογές. Άν έχεις μεγάλο server με πολύ κόσμο σίγουρα χρειάζεσαι να ρυθμίσεις τον Garbage Collector. Άν πάλι είσαι Proud "Home-Server" Owner θα επιθυμείς να έχεις αρκετό κόσμο online χωρίς να laggarei ο server.

 

--> Πώς λειτουργεί η μνήμη της Java και του Server μου ?

Όταν εκκινεί ο Server αρχικά η java δεσμεύει ένα τμήμα της RAM ( πχ 1 gb ) για να βάλει εκεί τα monsters, τα items κτλ κτλ. Δηλαδή αρχιζει και φορτώνει απο την MySQL τα διάφορα δεδομένα στην μνήμη. Αυτό γιατί η μνήμη RAM είναι πιο γρήγορη από τον δίσκο στον οποίο βρίσκονται τα δεδομένα. Άρα τα φέρνουμε στην RAM. Επίσεις στην RAM αποθηκεύει η java και διάφορα αντικείμενα κατάστασης ώστε να κρατάει πληροφορίες όπως Reuse Delay κτλ κτλ κτλ. Πρακτικά, αν όχι όλα, τα περισσότερα δεδομένα του server βρίσκονται στην RAM όταν ο server τρέχει.

 

Είπαμε οτι δεσμέυσαμε αρχικά 1 GB από τη RAM. Τί γίνεται αν δεν είναι αρκετό ? Αν δεν είναι αρκετό η Java μεγαλώνει το τμήμα αυτό ώστε να μπορεί να κρατά όλα τα δεδομένα του server. Εώς πότε το μεγαλώνει ? Μέχρι να φτάσει μια μέγιστη τιμή που έχουμε ορίσει εμείς. Η αρχική μνήμη και η μέγιστη μνήμη ορίζονται από τον Admin /Developer με τις παραμέτρους:

 

1)Για την αρχική μνήμη : -Xms, Παράδειγμα : Xms512m δίνει 512mb στον server όταν ξεκινάει για να βάλει εκεί δεδομένα.

2)Για την μέγιστη τιμή: - Xmx, Παράδειγμα : Xmx1024m δίνει 1024 μέγιστο. Η μνήμη αυτή θα δεσμευτεί μόνο άν γεμίσει η αρχική τιμή ( 512 ).

 

Άσκηση:

 

Για την λειτουργία του Server του ένας Admin (Server me 50 online ας πούμε ... )  ζήτησε βοήθεια απο 3 Developers. Ο καθένας του έδωσε μία από τις παρακάτω ρυθμίσεις:

 

Developer 1): -Xms12m -Xmx32m

Developer 2): -Xms1024m -Xmx512m

Developer 3): -Xms512m -Xmx1024m

 

Ποιός Developer κατα τη γνώμη σας έδωσε την καλύτερη τιμή αλλά και σωστή τιμή ? και γιατί ?

 

Λύση:

Ο Developer 1 έδωσε σωστές τιμές αλλά πολύ μικρες για server.

Ο Developer 2 έδωσε αρχική μνήμη περισσότερη από την μέγιστη μνήμη που είναι λάνθασμένη ρύθμιση.

Ο Developer 3 έδωσε αρχική μνήμη 512mb που είναι καλή τιμή και μέγιστη σε περίπτωση που η αρχική γεμίσει 1024mb. Άρα ο Developer 3 έδωσε τις σωστές τιμές.

 

Posted

Μάθημα Δεύτερo: Garbage Collector / 15 λεπτά.

 

--> Πώς χωρίζεται η μνήμη του Server μου (χωρίς πολλές λεπτομέριες) ?

 

Η μνήμη που δώσαμε στον server στον προηγούμενο Guide χωρίζεται σε δύο τμήματα που ονομάζονται Young και Tenured Generation. Δηλαδή άν έχουμε δώσει 1 GB τότε ένα μέρος του ονομάζεται Young Generation και ένα άλλο Tenured Generation. To γιατί χωρίζεται έτσι η μνήμη θα αναλυθεί παρακάτω. Το τί ποσοστό μνήμης γίνεται Young και τί ποσοστό Tenured μπορεί να ρυθμιστεί. Η βασική τιμή που έχει αν θυμάμαι καλά είναι 40 - 60 αντίστοιχα.

 

--> Πώς ρυθμίζω τον χωρισμό της μνήμης ?

Με την εντολή -XX:NewRatio=M, όπου Μ αριθμός. Ο αριθμός αυτός δηλώνει τον λόγο Tenured προς Young. Για παράδειγμα άν έχουμε 1GB και -XX:NewRatio=10, αυτό μας λέει οτι το Tenured ποσοστό είναι 10 φορές μεγαλύτερο από το Young.

 

Young + Tenured = 1 GB.

Tenured = 10*Young.

 

Υπάρχει και ένας δεύτερος τρόπος τον οποίο δεν θα χρησιμοποιήσουμε στον οδηγό αυτό ( Για όσους ενδιαφέρονται δείτε Xmn ).

 

--> Μόνο αυτά τα δύο κομάτια έχει η μνήμη ?

 

Όχι. Υπάρχουν και τμήματα για διαφορετικές λειτουργείες αλλά δεν περιλαμβάνονται στον οδηγό γιατί δεν επιρεάζουν και γιατί είναι σχετικά μικρά. Για αυτό το λόγο και οι εξισώσεις παραπάνω έχουν καλή προσέγγιση.

 

Άσκηση:

 

Υλολογίστε τις τιμές των Young και Tenured Generations για την παρακάτω εντολή εκκίνησης του Server :

-Xms1024m -Xmx1024m -XX:NewRatio=7

 

Λύση:

Young + Tenured = 1 GB = 1024 mb ( προσεγγιστικά γιατί υπάρχουν και άλλα τμήματα μνήμης. )

Tenured = 7* Young.

Αντικατάσταση:

 

Young + 7 Young = 1024

Young = 1024/8

Young = 128mb και Tenured = 896mb

 

 

Posted

Para poli wraio to Guide sou mprabo pou kathises kai ta egrapses ;) ;) alla xexases kati shmantiko na tous peis pou briskontai auta ;)

 

startGameServer.bat For Windows!!!

@echo off
title Game Server Console
:start
echo Starting L2J Game Server.
echo.
REM -------------------------------------
REM Default parameters for a basic server.
java -Xmx512m -cp bsf.jar;bsh-2.0b4.jar;commons-logging-1.1.jar;mmocore.jar;javolution.jar;c3p0-0.9.1.2.jar;mysql-connector-java-5.0.7-bin.jar;l2jserver.jar;jython.jar net.sf.l2j.gameserver.GameServer
REM
REM If you have a big server and lots of memory, you could experiment for example with
REM java -server -Xmx1536m -Xms1024m -Xmn512m -XX:PermSize=256m -XX:SurvivorRatio=8 -Xnoclassgc -XX:+AggressiveOpts
REM -------------------------------------
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Admin Restart ...
echo.
goto start
:error
echo.
echo Server terminated abnormaly
echo.
:end
echo.
echo server terminated
echo.
pause

 

REM java -server -Xmx1536m -Xms1024m -Xmn512m -XX:PermSize=256m -XX:SurvivorRatio=8 -Xnoclassgc -XX:+AggressiveOpts

 

GameServer_loop.sh For Linux!!!

#!/bin/bash

# exit codes of GameServer:
#  0 normal shutdown
#  2 reboot attempt

while :; do
[ -f log/java0.log.0 ] && mv log/java0.log.0 "log/`date +%Y-%m-%d_%H-%M-%S`_java.log"
[ -f log/stdout.log ] && mv log/stdout.log "log/`date +%Y-%m-%d_%H-%M-%S`_stdout.log"
java -Xms512m -Xmx512m -cp bsf.jar:bsh-2.0b4.jar:commons-logging-1.1.jar:javolution.jar:mmocore.jar:jython.jar:c3p0-0.9.1.2.jar:mysql-connector-java-5.0.7-bin.jar:l2jserver.jar net.sf.l2j.gameserver.GameServer > log/stdout.log 2>&1
[ $? -ne 2 ] && break
#	/etc/init.d/mysql restart
sleep 10
done

 

java -Xms512m -Xmx512m -cp bsf.jar:bsh-2.0b4.jar:commons-logging-

 

 

startLoginServer.bat!!!

@echo off
title Login Server Console
:start
echo Starting L2J Login Server.
echo.
java -Xmx128m -cp javolution.jar;mmocore.jar;c3p0-0.9.1.2.jar;mysql-connector-java-5.0.7-bin.jar;l2jserver.jar net.sf.l2j.loginserver.L2LoginServer
if ERRORLEVEL 2 goto restart
if ERRORLEVEL 1 goto error
goto end
:restart
echo.
echo Admin Restart ...
echo.
goto start
:error
echo.
echo Server terminated abnormaly
echo.
:end
echo.
echo server terminated
echo.
pause

 

java -Xmx128m -cp javolution.jar;mmocore.jar;c3p0-0.9.1.2.jar;mysql-connector-java-5.0.7-bin.jar;l2jserver.jar 

 

 

LoginServer_loop.sh For Linux!!!

#!/bin/bash

err=1
until [ $err == 0 ]; 
do
[ -f log/java0.log.0 ] && mv log/java0.log.0 "log/`date +%Y-%m-%d_%H-%M-%S`_java.log"
[ -f log/stdout.log ] && mv log/stdout.log "log/`date +%Y-%m-%d_%H-%M-%S`_stdout.log"
nice -n -2 java -Xms512m -Xmx512m -cp javolution.jar:mmocore.jar:c3p0-0.9.1.2.jar:mysql-connector-java-5.0.7-bin.jar:l2jserver.jar net.sf.l2j.loginserver.L2LoginServer > log/stdout.log 2>&1
err=$?
#	/etc/init.d/mysql restart
sleep 10;
done

 

nice -n -2 java -Xms512m -Xmx512m -cp javolution.jar:mmocore.jar:c3p0-0.9.1.2.jar:mysql-connector-java-5.0.7-

Posted

Σωστός :) To ξέχασα. Anyway food time και το κατα τις 12 ξεκινάνε τα δύσκολα :)

 

;) Mprabo kai pali xD

Posted

Τρίτο Μάθημα: An Inside look into garbage collector. / 20 λεπτά.

 

-->Τί υπάρχει στα δύο τμήματα της μνήμης ?

 

Στο τμήμα Young θέλουμε να έχουμε αντικείμενα μικρής ζωής. Για παράδειγμα, ένα NpcHtmlMessage έχει μικρή ζωή. Δημιουργείται , εκτελεί την αποστολή του κλασικού HTML παραθύρου στον χρήστη και μετά δεν χρησιμοποιείτε. Δηλαδή είναι παροδικό αντικείμενο.

 

Στο τμήμα Tenured έχουμε αντικείμενα που έχουν μεγάλη διάρκεια ζωής. PX SpawnTable. To SpawnTable κρατά όλα τα spawns και υπάρχει μέχρι το τέλος του server.

 

-->Πώς λειτουργούν αυτά τα δύο τμήματα ?

 

Αρχικά όταν δημιουργείτε ένα αντικείμενο γίνεται add στο Young Generation. Αν το αντικείμενο παύει να χρειάζεται (PX NPCHtmlMessage, character που κάνει logout ) τότε παραμένει στο Young. Αν μετά από κάποιο χρονικό διάστημα ( που θα δούμε παρακάτω ) το αντικείμενο χρειάζεται ακόμα ( πχ ένας καμμένος παίκτης που παίζει 10 ώρες την ημέρα ) τοτε μετακινείται στο Tenured τμήμα.

 

-->Πώς δουλέυει o Garbage Collector ? Πώς γίνεται η μετακίνηση από το Young στο Tenured ?

 

Όπως είπαμε πριν, η μνήμη είναι χωρισμένη σε 2 τμήματα. Το Young και το Tenured. Το ίδιο συμβαίνει και με τον Garbage Collector. Υπάρχουν στην ουσία δύο συλλέκτες. Ένας συλλέκτης για το Tenured και ένας για το Young. Ο συλλέκτης για το Young είναι πολύ πιο γρήγορος από τον συλλέκτη για το Tenured. Κάθε φορά που γεμίζει το Young αφού εκεί πρωτοβάζουμε τα αντικείμενα, τότε εκτελείτε ο Young Collector. Διαβάζει το Young τμήμα και διαγράφει όσα αντικείμενα δεν χρειάζονται ( παίκτες που έκαναν logout, πακέτα που στάλθηκαν κτλ κτλ ). Αν κάποιο αντικείμενο χρειάζεται το κρατάει και μετά απο κάποιο αριθμό εκτελέσεων αν δεί οτι το αντικείμενο χρειάζεται συννέχεια ( ο επίμονος καμμένος παίκτης που λέγαμε ... ) τότε το μεταφέρει στο Tenured.

 

Όταν ο παίκτης αποφασίσει να κάνει logout ενώ βρίσκεται στο Tenured το αντικείμενο του παραμένει στο Tenured . Σιγά σιγά το Tenured γεμίζει γιατί ο Young Collector βλέπει αντικείμενα που δεν καταστρέφονται γρήγορα. Όταν το Tenured γεμίσει επίσης τότε εκτελείτε ο Tenured Collector. O Tenured Collector είναι αργός, βαρής και διαβάζει όλη την μνήμη για να κάνει χώρο διαγράφοντας αντικείμενα που δεν χρειάζονται. Σε έναν άδειο server ο Tenured Collector ( ή αλλιώς Full Garbage Collector = Full GC ) κάνει για ένα κανονικό home μηχάνημα περίπου 1 sec για να καθαρίσει την μνήμη.

 

Αυτό σημένει οτι για 1 sec ο server παγώνει. Είναι το lag pου καταλαβαίνεις μερικές φορές για λίγο όταν παγώνουν όλα και μετα από λίγο ξεπαγώνουν. Σε μεγάλους server με πολλούς παίκτες ο Full GC κάνει αρκετά μεγαλύτερη συλλογή άρα λαγγάρει περισσότερο.

 

Σύνοψη:

 

H διαδικασία GC στην ουσία αποτελείτε από πολλά Young Collections που διαρκούν λίγο ( milliseconds ) τα οποία καθαρίζουν μόνο το Young τμήμα και μεταφέρουν στο Tenured αντικείμενα που δέν μπορούν να καθαριστούν ( noobs που δεν λένε να κάνουν logout ... ). Όταν χωθεί πολύ πράμα στον Tenured τότε ξεκινά η Full GC διαδικασία που είναι βαριά, αργή και σου ***** τον server  sto lag :)

 

Στο επομενο post θα δούμε κάποιους παράγοντες ποιότητας καλής συλλογής , και πώς μπορούμε να τους πετύχουμε με βάση τον Server μας ( Specs, pack , online count , pvp server  , farm server ... ).

Posted

πραγματικά φιλε πολύ καλό για εναν newbie ;)

 

Φαίνεται ενδοιαφέρον αλλά αν ο newbie δεν είναι VIP δεν μπορεί να το δεί (όπως και εγώ) οπότε ο newbie αμέσως δεν μπορεί να βοηθηθεί  ;)

Posted

Φαίνεται ενδοιαφέρον αλλά αν ο newbie δεν είναι VIP δεν μπορεί να το δεί (όπως και εγώ) οπότε ο newbie αμέσως δεν μπορεί να βοηθηθεί  ;)

ωραιο ολο αυτο το guide αλλα πιστευω πως ο φιλος μας απο εδω εχει ενα δικιο...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




  • Posts

    • ElmoreLab Harbor - Eternal C1 x1: ✅ https://harbor.elmorelab.com ElmoreLab Harbor - Eternal C1 x1 - is an exclusive server of the Eternal C1 chronicles from the top project ElmoreLab Harbor.   A unique server of its kind, on which everyone will have maximum pleasure, such as oldschool players who dream of nostalgia and to feel the warmest and classic C1 chronicles, as well as experienced players who are tired of thousands unbalanced servers of late chronicles. Due to the professional corrections of the balance system and the HONEST gameplay system - on this server, EVERY player will feel like in their own, warm and cozy Harbor C1. Let's return to the origins of L2 - back to 2004 in C1! ❤️   ⭐ Server characteristics:   STRICTLY 1 window, NO BOXES Bans for RMT and bots/cheats No donations with benefits Unique and high-quality PTS-build from Master Toma Professional corrections and full class-balance Reworked economy and closed all abuses Improved animations and all aspects of the game Exclusive HD-client with high-quality textures Experienced administration and management Fixed all bugs, geodata, exploits and holes Maximum sociality due to the 1-box system Discovering, exploring and researching Big online International server Nostalgia and oldschool-feelings   Rates: x1 Server start: 14.02.2025   The server is at the final stages of development and preparation for release. Information on the server will be updated, soon the patchnotes and changes/edits will be posted. Don't miss the legendary and epic experience on the best server in the last 20 years! ❤️ Join our C1-forum with a lot of information about server and active discussions.   ⭐ Website: https://harbor.elmorelab.com   ✅ Forum: https://forum-harbor.elmorelab.com   💥 Telegram: https://t.me/l2harbor https://t.me/l2harbor_chat   ⚡ Discord: https://discord.gg/harborelmorelab
    • yeah ok, if you say what is fuctional 100% i can't say something different 😛  but if someone find hard to compile it or get vs and all that things i have here one more simple way here to put overlay in your own server or to change your window name with few money.
    • I've been using this for 2 years now with no issues from Discord. I don't use ogg.dll either. This one works with any l2.exe too; I don’t see any difference between them.
    • hmm.. ok i just see that, is different code first of all. My sources is totally different based in other way, with else libraries.  I have access to modify everything even to make the clock to stop show how many time users play in server. 1) so maybe keep some personal info more hide. 2) i dont use ogg.dll 3) i create it and give it ready + support to install it. Plus what is mine can working with what ever .exe you want not just l2 with same simple method. And i am sure if you try this source to compile it, after 3 hours discord will like shadowban your API too thats my source
  • Topics

×
×
  • Create New...