Jump to content

[Guide] Πώς θα μαζέψω τα σκουπίδια από την αυλή μου. Java Memory and GC.


Recommended Posts

Σας κέντρισα το ενδιαφέρον ? Αν ναί πάμε καλά ( γιατί με όσα ακολουθήσουν ίσως βαρεθείτε οι περισσότεροι ). Αν όχι , 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 έδωσε τις σωστές τιμές.

 

Link to comment
Share on other sites

Μάθημα Δεύτερ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

 

 

Link to comment
Share on other sites

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-

Link to comment
Share on other sites

Τρίτο Μάθημα: 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 ... ).

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

ωραιο ολο αυτο το guide αλλα πιστευω πως ο φιλος μας απο εδω εχει ενα δικιο...
Link to comment
Share on other sites

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.




×
×
  • Create New...