Τεχνική ανάλυση για τη βελτιστοποίηση εφαρμογών internet, και μελέτη των στατιστικών με το πακέτο Xray.

 

Άγγελος Καραγεωργίου Νοέμβριος 2001

Εισαγωγή:

 

 

                Το Internet έχει πλέον μπει για τα καλά στη ζωή μας, αλλά τι ξέρουμε πραγματικά γι΄ αυτό ;

Η ύπαρξη μετρήσιμων στοιχείων για την εισχώρηση του δικτύου στον επαγγελματικό κύκλο είναι από ανύπαρκτη έως εντελώς λανθασμένη. Στην Αμερική υπάρχουν εταιρείες και πανεπιστημιακές έρευνες για τη μέτρηση του φαινομένου Internet. Στην Ελλάδα αλλά και στην Ευρώπη γενικότερα υπάρχει έλλειψη αυτής της πληροφορίας.

 

                Για να μπορέσουμε λοιπόν να συγκρίνουμε τις νέες οικονομίες που αναπτύσσονται, αλλά και για να πάρουμε μια εικόνα της αγοράς μας, ανέπτυξα το πακέτο Xray. Το Xray επισκέπτεται όλα τα domains ενός GTLD, όπου αυτό είναι επιτρεπτό, και συλλέγει πληροφορίες. Τα στοιχεία που λαμβάνουμε είναι η διεύθυνση IP του server του domain, την ενεργή η μη κατάσταση του  και τι software χρησιμοποιεί ο server. Επίσης μας δίνει στοιχεία για το πόσοι Name Servers υπάρχουν και τα IP αυτών. Από αυτά τα στοιχεία το Xray παράγει μια σειρά από πρωτεύοντα στατιστικά αποτελέσματα.

 

                Το πρώτο κομμάτι του άρθρου είναι μια τεχνική ανάλυση του πακέτου και της μεθόδου βελτιστοποίησης. Όσοι από εσάς κουραστείτε προχωρήστε στο δεύτερο μέρος όπου ακολουθεί μια παρουσίαση και ανάλυση των αποτελεσμάτων. Στα αποτελέσματα θα μπορέσετε να δείτε μια σύγκριση ορισμένων επιλεγμένων e-οικονομιών.

 

Μέρος 1ο. Τεχνική Ανάλυση

 

                Το πρωταρχικό βήμα στην ανάπτυξη οποιουδήποτε  προϊόντος είναι ο προσδιορισμός του προβλήματος που πρέπει να λύσει. Πρέπει λοιπόν να βρούμε όλα τα ονόματα καταχωρημένα κάτω από ένα GTLD και να πάρουμε τα στοιχεία τους όπως αναφέρθηκε στην εισαγωγή.

 

                Αποφασίσα λοιπόν στο λογισμικό που θα χρησιμοποιήσωμε αλλά φροντίσα να μην επανεφεύρω  τον τροχό. Έψαξα στο δια δίκτυο για τον πηγαίο κώδικα μιας ελαφριάς εφαρμογής για τη μεταφορά ιστοσελίδων και ξεκίνησα από εκεί. Υπάρχουν ήδη έτοιμα μικρά προγραμματάκια που κάνουν αυτή τη δουλειά όπως το wget, αλλά το κόστος λειτουργίας τους για μαζικό αριθμό domains είναι μεγάλο. Έτσι για να φτιάξω ένα πρωτότυπο πρόγραμμα αποφάσισα να αρχίσω να γράφω χρησιμοποιώντας το πακέτο LWP της PERL. To LWP είναι πραγματικά αριστοτεχνική δουλειά αλλά είναι φτιαγμένο με άξονα τη στιβαρότητα και όχι την ταχύτητα. Κάποια από αυτήν την αρχική δουλειά μπορείτε να τη δείτε στα προγράμματα myscan.pl και myscan2.pl.

 

                Το βασικό μου πρόβλημα με την PERL είναι ότι μπέρδευε τα signals σε κατάσταση Forked Processes. Ίσως και να μην είμαι και τόσο καλός στην PERL , όπως και να έχει αποφάσισα κάποια στιγμή να δουλέψω με C γιατί είναι η ταχύτερη δυνατή γλώσσα. Στο πανεπιστήμιο κάποτε είχα γράψει ένα προγραμματάκι που έφερνε σελίδες web, ξέθαψα λοιπόν αυτό το πρόγραμμα και άρχισα να παίζω με αυτό, να το αλλάζω. Το αρχικό πρόγραμμα έφερνε σελίδες από το internet σε ένα προσωρινό αρχείο στο σκληρό. Χρήσιμο το τοπικό σώσιμο αλλά όταν έχεις να επισκεφθείς 200.000 ονόματα γίνεται εφιάλτης.

 

Βελτιστοποίηση

 

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

                Τώρα που πετάξαμε όλα τα περιττά πρέπει να δούμε πως μπορούμε να αυξήσουμε την απόδοση. Η φύση του προβλήματος είναι παράλληλη, έτσι το να το σπάσουμε σε κομμάτια είναι επόμενο. Αλλά σε πόσα κομμάτια το σπας; Εύκολο, σε τόσα κομμάτια όπου χρησιμοποιείς πλήρως τη σύνδεση σου στο internet χωρίς να την πνίξεις. Τελικά αποφάσισα να το σπάσω σε 32 παράλληλες λειτουργίες που είναι ένας καλός μαγικός αριθμός.

 

               

Παρακολούθηση δεδομένων

 

                Τώρα πλέον μπορούμε να τρέξουμε το πακέτο και να δούμε τι μας επιστρέφει. Είναι καλή τακτική στα πρώτα τρεξίματα ενός πακέτου να παρακολουθήστε όλη τη διαδικασία του. Αυτό λέγεται και σημείο Άλφα του κώδικα. Παρατήρησα λοιπόν ότι ονόματα που καταλήγουν στο ίδιο IP, αυτό που λέμε Virtual Servers, έχουν και τον ίδιο Web Server. Θα έπρεπε φυσικά να το ήξερα αυτό ήδη μιας και το επιβάλλει η λογική του πρωτοκόλλου. Έτσι λοιπόν εάν συνδεθούμε μόνο μια φορά σε κάθε IP και πάρουμε τα στοιχεία που χρειαζόμαστε, δεν χρειάζεται να ξανασυνδεθούμε για κανένα επόμενο domain για το ίδιο IP. Τα στοιχεία που θα μας δώσει ο server είναι πρακτικά ταυτόσημα.

 

                Εδώ το πρόβλημα χωρίζεται στα δύο. Η πρώτη μου προσπάθεια να θυμάμαι τις διευθύνσεις που έχω επισκεφθεί απέτυχε γιατί παρεξήγησα τη μεθοδολογία προγραμματισμού των Hash Tables στη ‘C’. Αλλά περισσότερα γι΄ αυτό παρακάτω.

 

Απλή και Κομψή Λύση

 

                Τώρα λοιπόν έχουμε μια τεράστια μάζα δεδομένων αποτελούμενη απο ονόματα ιστοσελίδων (web sites) τα οποία καταλήγουν σε κάποιες διυθύνσεις IP με τρόπο που φαίνεται εκ’ πρώτης όψεως τυχαίος. Αλλά άς ρίξουμε άλλη μια ματιά στα δεδομένα και πώς προκύπτου.  Πρίν φτάσουμε στη λίστα με τα ονόματα, το γνήσιο σετ δεδομένων περνάει απο μια σειρά scripts, τα οποία τα κάνουν λίγο μασάζ μέχρι να ετοιμαστούν για τον scanner. Επέστρεψα λοιπόν στα ωμά, προ μασάζ δεδομένα για να τα ξαναδώ.

 

                Οι διευθύνσεις IP των ονομάτων που είναι καταχωρημένα με τον κάθε ISP, τείνουν να χρησιμοποιούν τους ίδιους name servers, και να δημιουργούν νησίδες. Ας το δούμε λίγο αυτό: ο ΟΤΕΝΕΤ είναι ένας ISP με name servers τους ns1.otenet.gr και ns2.otenet.gr. Ο ΟΤΕΝΕΤ καταχωρεί τις διευθύνσεις των ονομάτων των πελατών του σε αυτά τα δύο μηχανήματα. Τα ονόματα με τη σειρά τους καταλήγουν σε ένα περιορισμένο αριθμό IP μιας και χρησιμοποιείται κατά κόρον η τεχνολογία virtual server. Έτσι αυτά τα ονόματα τείνουν να δημιουργούν νησίδες από κοινά IPs.

 

                Με εφαλτήριο αυτήν την παρατήρηση μπορούμε να σορτάρουμε αλφαβητικά με κλειδί πλέον τον Name Server αντί το domain. Έτσι λαμβάνουμε πολλά συνεχόμενα χτυπήματα στα ίδια IPs. Ο τρέχων πηγαίος κώδικας για τον masscrawler χρησιμοποιεί αυτήν την παρατήρηση. Η λύση είναι όντως απλή, λίγες απλές μεταβλητές για να θυμόμαστε την τελευταία διεύθυνση που επισκεφθήκαμε. Εάν το τρέχων domain καταλήγει στην ίδια διεύθυνση με πριν, τελειώσαμε, εάν όχι, προχωράμε. Αυτό το μικρό κολπάκι έκοψε το χρόνο της ανίχνευσης κατά το ήμισυ.

 

                Το μάθημα που πήρα ήταν να προσέχω πάρα πολύ τη φύση των δεδομένων μου. Υπάρχει μια τάση στους επαγγελματίες της πληροφορικής να προγραμματίζουν αγνοώντας τη φύση των στοιχείων τους ή θεωρώντας τα όλα εντελώς τυχαία. Αλλά οι πραγματικοί επιστήμονες της πληροφορικής θα σας πουν, ότι στο σχολείο έμαθαν πως οι αλγόριθμοι τυλίγονται γύρω από τα δεδομένα πάνω στα οποία δουλεύουν. Με λίγα λόγια η θεωρητική υποδομή είναι πράγματι ανεκτίμητη σε όλες τις δουλειές.

 

Παρεξηγημένη Μεθοδολογία

 

                Ώρα να γυρίσουμε ένα βήμα πίσω. Το παραπάνω κολπάκι μας γλίτωσε πολύ χρόνο αλλά έχουμε και άλλα περιθώρια για επιτάχυνση με τη βοήθεια των hash tables. Υπάρχει ένα ρητό στην επιστημονική κοινότητα που λέει: το πρόβλημα γίνεται οφθαλμοφανές όταν σου το εξηγήσει κάποιος.

Ξεκίνησα λοιπόν να γράφω μικρά δοκιμαστικά προγραμματάκια για να δοκιμάσω τα hash tables της GNU-C  και το πρόβλημα έγινε ηλίου φαεινότερο. Η τρέχουσα ανάπτυξη δεν σώζει δεδομένα στα hashes αλλά δείκτες στα δεδομένα.

 

                Για να θυμόμαστε λοιπόν τα παλιά δεδομένα πρέπει πρώτα να τα αποθηκεύσουμε και μετά να περάσουμε δείκτες στα σημεία αποθήκευσης τους στα hashes. Ο υπό ανάπτυξη Άλφα κώδικας του masscrawler χρησιμοποιεί αυτή τη μεθοδολογία για να γλιτώσει άλλη μια τάξη μεγέθους σε ταχύτητα.

 

                Μια παρατήρηση εδώ, το ότι τα hashes μας γλιτώνουν από πολύ δευτερο-δουλειά δεν μειώνει σε τίποτα την πολυτιμότητα της παρατήρησης για την κοντινότητα των διευθύνσεων IP. Η χρήση αυτής της παρατήρησης σε συνδυασμό  με ανεπτυγμένες μεθόδους είναι η συνταγή που κάνει τόσο γρήγορο το Xray.

 

 

Συναγερμός – Alarm

 

                Μέσα στον κώδικα υπάρχει ένα σήμα alarm. Αυτό το σήμα μας ειδοποιεί αν το domain στο οποίο προσπαθούμε να συνδεθούμε δεν έχει καταλήξει σε κάποιο όνομα (resolution*) ή δεν έχει ανταποκριθεί καθόλου. Για στατιστικούς λόγους διαχωρίζουμε αυτές τις δύο περιπτώσεις. Η PERL έτεινε να μπερδεύει τα σήματα αυτά κάτω από συνθήκες Forking και τελικά αυτός ήταν ο λόγος που στράφηκα στην C.

 

                Ο χρόνος μέχρι να σηκωθεί το alarm είναι ένας άλλος μαγικός αριθμός. Πρέπει να είναι πρώτος αριθμός ειδάλλως τα σήματα θα τείνουν να φτάνουν όλα μαζί στα processes δημιουργώντας καταιγίδες. Αυτό συμβαίνει, όπως μπορείτε να δείτε και στο τρέχον εγχειρίδιο του σύμπαντος, γιατί τα φαινόμενα τείνουν να συμβαίνουν σε μικρές σύγχρονες σειρές. Ο χρόνος πρέπει επίσης να είναι αρκετός, για να επιτρέπει ένα καλό σχετικά μηχάνημα να απαντήσει, αλλά και όχι τόσο μεγάλος ώστε τα μηχανήματα που δεν απαντούν να μας καθυστερούν υπέρμετρα. Οι αριθμοί στους οποίους κατέληξα είναι 11,13 και 17 για γρήγορη, μεσαία και αργή απάντηση. Μπορείτε να τα αλλάξετε μέσα στον κώδικα του masscrawler όπως σας αρέσει.

 

                Ναι ξέρω έπρεπε να είναι εξωτερική παράμετρος, το άφησα σαν άσκηση για τους μαθητές.

 

 

Μελλοντικές Κατευθύνσεις

 

 

                Ο τρέχων παραλληλισμός γίνεται σπάζοντας τα δεδομένα σε 32 κομμάτια και δίνοντας κάθε κομμάτι σε διαφορετική επεξεργασία του masscrawler. Η φυσική γειτνίαση των δεδομένων βοηθάει στο να εμφανίζονται τα ίδια IP μέσα στα ανεξάρτητα σετ.

 

                Φυσικά μπορούμε να γλιτώσουμε ακόμη περισσότερο χρόνο κρατώντας μόνο μία κόπια των IP που να τη μοιράζονται όλα τα processes. Έτσι θα επισκεφθούμε κάθε IP μόνο μια φορά αντί για

πιθανόν όσα και τα processes. Αυτό θα μπορούσε να γίνει με μέθοδο μοιραζόμενης μνήμης και ένα σημαιοφόρο, που κατευθύνει πιο process γράφει κάθε στιγμή σε αυτήν τη μνήμη. Η επιτάχυνση θα είναι πραγματικά σημαντική, για παράδειγμα στην περίπτωση της Αυστρίας θα κάνουμε μόνο 8000 επισκέψεις από τα 200.000 ονόματα που είναι καταχωρημένα. Αυτή είναι μια ολόκληρη τάξη μεγέθους!

 

                Για να το κάνουμε ακόμη πιο επαγγελματικό το πακέτο θα μπορούσαμε να το υποστηρίξουμε από πίσω με μια βάση δεδομένων τύπου SQL όπως  Oracle ή PostgreSQL. Αυτό θα μας διευκολύνει για να κρατήσουμε ιστορικά στοιχεία χωρίς πραγματικά να επιβαρύνει την εφαρμογή. Η καθυστέρηση είναι τάξεις μεγέθους μεγαλύτερη στη σύνδεση στο Internet παρά στην τοπική βάση.

 

                Ένα ακόμη πρόβλημα είναι το φορτίο υπό το οποίο βάζουμε το name server στη διάρκεια της ανίχνευσης, κάποια στιγμή είχε φτάσει να καταναλώνει 105ΜΒ Ram. Αυτό συνεπάγεται οτι ο υπολογιστής μας θα καταφύγει σε swapping άρα και θα γίνει πολύ πιο αργός.

 

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

 

                Θα μπορούσαμε λοιπόν να δώσουμε το resolving για τις κατοπινές ανιχνεύσεις σε μια ασύγχρονη επεξεργασία χαμηλής ισχύος. Αλλά ένα λεπτό, όλο αυτό το κομμάτι της ανάλυσης μετατρέπεται σε ένα άλλο ολόκληρο προϊόν, και μοιάζει με αίτηση για επιχορήγηση από την ΕΟΚ.

 

 



Μέρος 2ο. Ανάλυση των αποτελεσμάτων

 

 

                Καλά όλα αυτά και σαν καθώς πρέπει τεχνοκράτης ικανοποιήθηκα από το όλο project, αλλά η ανάγκη ήταν η σύγκριση των οικονομιών. Έτρεξα λοιπόν το Xray για τα domains, AT, BG, FI, GR, NL, PL και  TO δηλαδή για Αυστρία, Βουλγαρία , Φινλανδία, Ελλάδα, Ολλανδία, Πολωνία και Τομπάγκο αντίστοιχα. Το Τομπάγκο είναι δημοφιλές με τους ανά το κόσμο αγγλόφωνους πληθυσμούς για γλωσσικούς λόγους.

 

                Η παρατήρηση η πρώτη είναι πως η e-οικονομία στην Ελλάδα είναι παραπλήσια της Φινλανδικής αλλά υστερεί σε σχέση με την Ολλανδία. Ο πρώτος πίνακας δείχνει τον αριθμό των καταχωρημένων ονομάτων.

 

                 

 

Γλωσσάριο:

 

Forking:                Τρόπος που ένα πρόγραμμα σπάει και αντιγράφει τον εαυτό του σε κομμάτια για να μοιραστεί το φορτίο του.

 

GNU-C:                 Ο μεταγλωτιστής (compiler) C που χρησιμοποίησα για την ανάπτυξη του masscrawler.

 

GΤLD:                                    Global Top Level Domain. Tο παγκόσμιο Internet έχει τη μορφή πολλαπλών πυραμίδων. Οι κορυφές είναι τα GTLDs όπου από κάτω καταχωρούνται τα επιμέρους ονόματα. Στην Ελλάδα π.χ.  οι καταχωρήσεις γίνονται κάτω το .GR .

 

Hash Table:          Προγραμματιστική / Αλγεβρική μεθοδολογία για την αποθήκευση και γρήγορη εύρεση ζευγαριών κλείδων και συζυγών των δεδομένων. Αφήστε το , είναι ένα ολόκληρο άρθρο απο μόνο του. Συντομογραφία: hashes

 

IP / IP address:    Αριθμητική διεύθυνση Internet τύπου 123.250.239.123. Ο τηλεφωνικός αριθμός αν θέλετε ενός υπολογιστή που είναι συνδεμένος στο διαδίκτυο.

 

Masscrawler:       Το όνομα του ανιχνευτή που έγραψα.

 

Μulti Tasking:   Πολλαπλές ασχολίες, αργκό των υπολογιστών που δηλώνει οτι ένας υπολογιστής τρέχει πολλά προγράμματα ταυτόχρονα.

 

Name Servers:     Εκεί όπου κρατείται η διεύθυνση του καταχωρημένου ονόματος (domain)

 

Process(es):         Διαδικασίες , ενα πρόγραμμα τη στιγμή που τρέχει.

 

Resolution:           Η διαδικασία με την οποία ρωτάμε ένα name server να μας δώσει τη διεύθυνση IP ενος καταχωρημένου ονόματος.

 

Scanner:               Ανιχνευτής, γενικό όνομα προγραμμάτων για τι άλλο; ανίχνευση δεδομένων.

 

Signal:                                   Το λογισμικό αντίστοιχο ενός Interrupt. Ένα σήμα που λεει στο πρόγραμμά μας να σταματήσει την τρέχουσα λειτουργία του για να κάνει προσωρινά κάτι άλλο

 

Swapping:             Η διαδικασία κατα την οποία το λειτουργικό σύστημα του υπολογιστή μεταφέρει αχρησιμοποίητα κομμάτια της RAM του στο σκληρό δίσκο. Αυτά τα κομμάτια ελευθερώνονται έτσι για να χρησιμοποιηθούν απο προγραμμάτα που έχουν έλλειψη σε μνήμη.

 

Virtual Server:    Ιδεατός server, για οικονομία κλίμακας οι ISPs εξυπηρετούν από ένα μηχάνημα πολλαπλά domains. Κάθε domain λοιπόν φαίνεται σαν μια ιδεατή ανεξάρτητη οντότητα.

 

 (Web) Server:     Διπλό νόημα, όταν δεν αναφέρεται στον υπολογιστή καθ’ εαυτό, είναι το λογισμικό που τρέχει για να σερβίρει τις σελίδες web.

 

 

 

 

 

Βιβλιογραφία:

 

Richard W Stevens              Advanced Programming in the UNIX(R)   Environment

 

Larry Wall                             Programming Perl (3rd Edition)

 

Gnu Project                           C Programming Online Manual Pages.

 

Dale Dougherty,                   sed & awk (2nd  Edition)

Arnold Robbins