Επικοινωνία με την υποστήριξη

Απαντάμε μέσω e-mail, συνήθως μέσα σε δύο ημέρες.

Το Google reCAPTCHA ελέγχει αυτή την υποβολή για κατάχρηση· δεδομένα αποστέλλονται στην Google. Το script φορτώνεται μόνο όταν ανοίξει αυτή η φόρμα.

← Όλα τα άρθρα

Πόσο κοστίζει πραγματικά η φόρτωση όλου του lib/

Η γραμμή 46 του μοναδικού αρχείου εισόδου αυτής της υπηρεσίας:

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

Πρόκειται για 65 αρχεία και 1,5 megabyte, που φορτώνονται σε κάθε αίτημα. Μια εικόνα μετρητή, μια σελίδα στατιστικών, ένα 404 — όλα το ίδιο. Χθες αυτό συνέβη 20.734 φορές.

26 οικογένειες σχεδίων μετρητών — 715 KB, χρησιμοποιείται μία σημαίες 189 KB · διαγράμματα 158 KB · όλα τα άλλα 470 KB εν ψυχρώ, χωρίς κρυφή μνήμη opcode: 132 ms opcodes σε κρυφή μνήμη στον δίσκο: 18,2 ms opcodes σε κοινόχρηστη μνήμη: 0,33 ms — το glob και 65 κλήσεις stat 65 αρχεία, 1,5 MB, 56 κλάσεις, σε κάθε αίτημα

Ο αριθμός που μετράει είναι ο μικρός

Η φόρτωση όλων από την αρχή, με την κρυφή μνήμη opcode απενεργοποιημένη, διαρκεί περίπου 132 χιλιοστά του δευτερολέπτου. Αυτός είναι ο αριθμός που θα έκανε το θέμα πρόβλημα, και δεν είναι ο αριθμός που πληρώνει ο διακομιστής.

Με τα opcodes ήδη μεταγλωττισμένα και αποθηκευμένα σε κοινόχρηστη μνήμη, απομένουν η λίστα του καταλόγου και μία κλήση stat() ανά αρχείο, επειδή ο έλεγχος χρονοσφραγίδων είναι ενεργός: 0,33 χιλιοστά του δευτερολέπτου. Με τη χθεσινή κίνηση αυτό σημαίνει λιγότερα από επτά δευτερόλεπτα δουλειάς σε ολόκληρη την ημέρα.

Ανάμεσά τους βρίσκεται μια τρίτη μέτρηση, 18,2 χιλιοστά του δευτερολέπτου, με την κρυφή μνήμη opcode να διαβάζει από τον δίσκο αντί από τη μνήμη. Είναι ανώτατο όριο και όχι ο πραγματικός αριθμός — δείχνει τι συμβαίνει όταν η κρυφή μνήμη υπάρχει αλλά είναι πιο αργή από την πραγματική. Αναφέρεται επειδή είναι ο μόνος «ζεστός» αριθμός που μπορεί να μετρηθεί από τη γραμμή εντολών, και το να προσποιηθεί κανείς το αντίθετο θα ήταν το εύκολο λάθος.

Άρα: αυτό δεν κοστίζει σχεδόν τίποτα, και δεν κοστίζει σχεδόν τίποτα αποκλειστικά χάρη σε κάτι άλλο. Αν απενεργοποιηθεί η κρυφή μνήμη opcode, η ίδια γραμμή κοστίζει τετρακόσιες φορές περισσότερο. Αυτή είναι μια πραγματική εξάρτηση, και αξίζει να γνωρίζει κανείς ότι υπάρχει αντί να την ανακαλύψει κατά τη διάρκεια μιας αναβάθμισης.

Τι περιέχουν στην πραγματικότητα τα 1,5 megabyte

Το σαράντα επτά τοις εκατό — 715 kilobyte σε 26 αρχεία — είναι οικογένειες σχεδίων μετρητών. Για τη σχεδίαση μιας εικόνας μετρητή χρειάζεται ακριβώς μία από αυτές. Οι άλλες 25 φορτώνονται, δηλώνονται και δεν αγγίζονται ποτέ.

Έπειτα: 189 kilobyte δεδομένων σημαιών, που χρειάζονται στη σελίδα γεωγραφίας· 158 kilobyte βιβλιοθήκης διαγραμμάτων, που χρειάζονται όταν κάτι σχεδιάζει διάγραμμα. Κανένα από τα δύο δεν εμπλέκεται στην αποστολή μιας εικόνας μετρητή, που είναι το αίτημα στο οποίο αυτή η υπηρεσία απαντά συχνότερα από κάθε άλλο.

Το ορατό κόστος αυτού είναι μνήμη και όχι χρόνος. Η μέγιστη μνήμη ανά αίτημα αυξάνεται κατά περίπου τέσσερα megabyte, και σε αντίθεση με τα opcodes — που είναι κοινά για όλες τις διεργασίες — αυτό το μέρος πληρώνεται ανά αίτημα, παράλληλα, από κάθε worker ταυτόχρονα.

Κάποιος το είχε ήδη προσέξει

Το glob είναι lib/*.php. Δεν είναι αναδρομικό, και ακριβώς κάτω από αυτό βρίσκονται δύο κατάλογοι: lib/live/ με 229 kilobyte και lib/recht/ με 182 kilobyte. Τετρακόσια kilobyte που κάποτε βρίσκονταν στη διαδρομή φόρτωσης και τώρα όχι.

Μετακινήθηκαν επειδή είναι μεγάλα και σπάνια χρειάζονται: οι ενότητες στατιστικών και τα νομικά κείμενα. Το ότι βρίσκονται έναν κατάλογο βαθύτερα είναι ολόκληρος ο μηχανισμός. Δεν υπάρχει ρύθμιση, ούτε lazy loader, ούτε χάρτης autoload — ένα αρχείο είτε πιάνεται από το glob είτε όχι.

Είναι μια πραγματική λύση και αξίζει να ειπωθεί, γιατί το προφανές επόμενο βήμα θα ήταν ένας autoloader, και ένας autoloader εδώ θα ήταν μεγάλη αλλαγή για να λυθεί ένα πρόβλημα που ένα mkdir έχει ήδη λύσει δύο φορές.

Γιατί παραμένει

Ένα μόνο glob είναι το απλούστερο πράγμα που μπορεί να λειτουργήσει, και σύμφωνα με τα στοιχεία λειτουργεί: ένα τρίτο του χιλιοστού του δευτερολέπτου, σε έναν μικρό διακομιστή, στη διαδρομή που πρέπει να είναι γρήγορη. Η αντικατάστασή του με require ανά αρχείο σημαίνει ότι κάθε νέο αρχείο χρειάζεται μια γραμμή κάπου, και η γραμμή που θα ξεχαστεί προκαλεί μοιραίο σφάλμα στην παραγωγή αντί για μια ελαφρώς μεγαλύτερη φόρτωση.

Αυτό που χρειάζεται είναι να καταγραφεί εκείνο που το έκανε βιώσιμο εξαρχής: αν ένα αρχείο στο lib/ μεγαλώσει, μετακινείται σε υποκατάλογο και φορτώνεται με require εκεί όπου χρησιμοποιείται. Αυτόν τον κανόνα ακολουθούσαν εκείνοι οι δύο κατάλογοι, και δεν ήταν γραμμένος πουθενά μέχρι τώρα.

Η γενική εκδοχή είναι πιο βαρετή από τη μέτρηση. Το «όλα φορτώνουν τα πάντα» είναι συνήθως η λάθος μορφή, και αξίζει να μετρηθεί τι κοστίζει πριν ξαναχτιστεί. Εδώ κοστίζει 0,33 χιλιοστά του δευτερολέπτου και τέσσερα megabyte, και τα τέσσερα megabyte είναι το μέρος που αξίζει να παρακολουθείται, γιατί κλιμακώνονται με την ταυτόχρονη χρήση, ενώ τα χιλιοστά του δευτερολέπτου όχι.

Διαφήμιση