Η άσχημη πλευρά του traffic

Nick Papanotas's Facebook profile Γράφει ο Νίκος Παπανώτας | View CommentsLeave a Comment
Τελευταία ενημέρωση: Wednesday, February 4, 2009 | 14182 Views

Κάθε webmaster στοχεύει στο να έχει όσο το δυνατόν περισσότερο traffic στο site του. Ωστόσο μερικές φορές το traffic προκαλεί μεγάλα προβλήματα. Μεγάλος χρόνος απόκρισης, πεσμένοι servers μεταξύ άλλων είναι οι πονοκέφαλοι που μπορείτε να συναντήσετε όσο το site σας προχωράει στον δρόμο της επιτυχίας.

Φυσικά αυτά είναι τα ομορφότερα προβλήματα που μπορείτε να συναντήσετε σαν publisher, χωρίς αυτό να σημαίνει οτι δέν πρέπει να είμαστε προετοιμασμένοι. Παρακάτω σας περιγράφω κάποιες λύσεις που δούλεψαν για εμάς και εύχομαι να σας χρειαστούν ;)

Apache optimization

Καταρχήν είναι πολύ σημαντικό να είναι σωστά configured ο web server σας. Στην περίπτωση που είστε σε shared hosting μάλλον δέν σας ενδιαφέρει, ωστόσο αν έχετε dedicated server μπορείτε να χρησιμοποιήσετε κάποια απο τις testing εφαρμογές για Apache που μπορούν να σας βοηθήσουν με το σωστό configuration του server.

Static vs Dynamic content

Ας δούμε λίγο πώς σερβίρει ένας web server μία σελίδα, και πιό συγκεκριμένα ο Apache. Όταν ζητάμε μία σελίδα, ουσιαστικά κάνουμε ένα request για κάθε αντικείμενο αυτής (html, τα css, τις εικόνες, κτλ) Για κάθε request ο server απασχολεί ένα process το οποίο ασχολείται με το “σερβίρισμα”. Όταν κάποιο process τελιώσει, τότε περιμένει κάποιο διάστημα, και αν δέν του ζητηθεί κάποια άλλη σελίδα τότε “πεθαίνει”.

Μέχρι εδώ όλα καλά, ωστόσο σε ένα site με μεγάλο load, υπάρχει ένα σημαντικό πρόβλημα. Ας υποθέσουμε οτι ένα process σερβίρει μία δυναμική σελίδα. Ενδεχομένως να χρησιμοποιηθούν 30mb μνήμης απο το script που παράγει την σελίδα. Όταν τελειώσει το parsing, το process δέν θα ελευθερώσει την μνήμη και ακόμα αν στο επόμενο request σερβίρει μιά εικόνα θα χρησιμοποιεί πάλι 30mb μνήμης. Σε ένα φυσιολογικό server αυτό δέν είναι πρόβλημα ωστόσο σε ένα απαιτητικό περιβάλλον δέν μπορούμε να σπαταλάμε μνήμη. Συμπληρωματικά πολλές βασικές διεργασίες του κάθε request δέν χρειάζονται για το σερβίρισμα στατικού περιεχομένου οπότε πάλι υπάρχει σπατάλη πόρων του συστήματος.

Η λύση που ανακάλυψα σε αυτό το πρόβλημα είναι η εξής. Χρησιμοποιούμε ένα web server για δυναμικό περιεχόμενο και έναν για στατικό. Έτσι – και στο ίδιο μηχάνημα – μπορούμε να βάλουμε έναν Apache με mod_rewrite, logging και ότι άλλο θέλουμε, και σε μιά άλλη ip βάζουμε έναν lighttpd με απενεργοποιημένα όλα τα modules για να σερβίρει το στατικό περιεχόμενο. Φυσικά αν όλο αυτό σας φαίνεται δύσκολο μπορείτε απλώς να χρησιμοποιήσετε μια υπηρεσία σαν το amazon ec2 για να κάνετε hosting το στατικό περιεχόμενο

Η συγκεκριμένη λύση βοήθησε το webdigity να αντέξει ένα digg/stumbleupon/reddit κύμα που δέχτηκε με 1600 online visitors χωρίς κανένα πρόβλημα (ενώ παλιότερα έτρεχα με τα restart)

MySQL

Στην MySQL όπως και σε κάθε server το πιό βασικό είναι το configuration. Ένα πολύ καλό εργαλείο που μπορεί να σας βοηθήσει είναι το MySQLTuner το οποίο βοηθάει στο στήσιμο του server. Παράλληλα κάτι που πρέπει οπωσδήποτε να βλέπετε είναι τα queries που καθυστερούν με το slow query log. Όσο αφορά τα queries το πιό βασικό που πρέπει να σας πώ είναι να αποφεύγετε τα RAND() και να χρησιμοποιείτε οπωσδήποτε την LIMIT.

PHP opcode caching

Το opcode caching μπορεί να κάνει την php πολλές φορές πιό γρήγορη και το συνιστώ ανεπιφύλαχτα. Υπάρχουν διάφορες λύσεις για opcode caching. Εγώ θα σας προτείνω την XCache που είναι stable και φυσικά open source :)

PHP data caching

Για να “ξεκουράζουμε” τον database server καλό είναι να κάνουμε και ένα caching των δεδομένων σε επίπεδο εφαρμογής. Αυτό μπορεί να γίνει σε αρχεία στο file system (δείτε ένα tutorial που έγραψα παλιότερα) ή με την χρήση του memcached.

Αυτά τα λίγα για server optimisation, ελπίζω να σας άρεσε το άρθρο :)

[photo credit]

  • http://www.pestaola.gr Titanas

    Εξαιρετική λύση είναι και το eAccelerator με μικρή αλλαγή στο .ini ώστε να κάνει caching αποκλειστικά στην RAM

  • Νίκος Παπανώτας

    O eAccelerator δέν είναι stable λύση. Τον είχα δοκιμάσει σε παλιότερο server και έκανε συνέχεια segmentation fault errors, ενώ πολλές φορές είχε crashάρει εντελώς τον server.

    Το XCache απο την άλλη είναι 100% stable αφού υπάρχει και στα repos του debian

  • http://www.pestaola.gr Titanas

    Δεν είχα προβλήματα αλλά αυτό δεν σημαίνει οτι είναι η βέλτιστη λύση. Πρέπει να δοκιμάσω και το XCache

  • http://developstories.gr/ Kostas Theodorou

    Και εγώ είχα χρησιμοποιήσει τον ea στον smart publisher, αλλά τελικά τον έβγαλα όταν διαπίστωσα τα προβλήματα που είχε σε κάποιες εξειδικευμένες συναρτήσεις.

  • http://blog.cherouvim.com/ cherouvim

    μερικές ιδέες και από μένα
    Stress testing: http://jakarta.apache.org/jmeter/
    Best practices για high performance websites: http://developer.yahoo.com/performance/rules.html το βιβλίο τους http://oreilly.com/catalog/9780596529307/ και το YSlow του firebug.
    Για high performance mysql θέλει καλό διάβασμα το εξής βιβλίο ή τα blogs των authors του: http://oreilly.com/catalog/9780596101718/

  • http://www.adslspeed.com Makis77

    Πολύ ωραίο άρθρο!!!

blog comments powered by Disqus