Το παράδοξο της CPU στο 100%

Συχνά παρατηρούμε τη χρήση της CPU να αγγίζει το 100%, υποθέτοντας λανθασμένα ότι ο επεξεργαστής εκτελεί το μέγιστο δυνατό έργο. Στην πραγματικότητα, η CPU μπορεί να βρίσκεται σε κατάσταση αναμονής (backend stall) περιμένοντας δεδομένα από τη μνήμη RAM. Με μια σύγχρονη CPU να εκτελεί 400-800 εντολές κατά τον χρόνο που απαιτείται για μία μόνο πρόσβαση στη DRAM, το memory latency αποτελεί το κυριότερο σημείο συμφόρησης (bottleneck) σε εφαρμογές έντασης δεδομένων.

Βελτιστοποίηση μέσω radix partitioning

Σε λειτουργίες όπως το GROUP BY, η χρήση ενός μεγάλου HashTable οδηγεί σε συχνά cache misses, καθώς το μέγεθος του πίνακα υπερβαίνει τη χωρητικότητα της cache. Η τεχνική του radix partitioning επιλύει αυτό το πρόβλημα:

  1. Διαχωρισμός (Partitioning Phase): Τα δεδομένα χωρίζονται σε μικρότερα partitions με βάση το hash των κλειδιών τους.
  2. Επεξεργασία (Aggregation Phase): Κάθε partition επεξεργάζεται ξεχωριστά, διασφαλίζοντας ότι το HashTable που χρησιμοποιείται χωράει πλήρως στην CPU cache.

Αυτή η προσέγγιση, αν και αυξάνει τον συνολικό αριθμό των εντολών, μειώνει δραστικά τον χρόνο αναμονής για δεδομένα από τη DRAM, μετατρέποντας τις «ψυχρές» προσβάσεις μνήμης σε γρήγορες λειτουργίες εντός του chip.

Μετρήσιμα αποτελέσματα και hardware counters

Χρησιμοποιώντας εργαλεία όπως το perf, μπορούμε να ποσοτικοποιήσουμε τη βελτίωση. Στο παράδειγμα της μηχανής Pivot, η εφαρμογή του radix partitioning μείωσε το ποσοστό των CPU slots που βρίσκονταν σε αναμονή λόγω μνήμης από 50% σε 23.5%. Παράλληλα, ο όγκος των δεδομένων που ανακτώνται από τη DRAM μειώθηκε από 4.5GB σε 1.5GB, αποδεικνύοντας ότι η στρατηγική διαχείριση της μνήμης είναι ο καθοριστικός παράγοντας για την επίτευξη υψηλού throughput σε σύγχρονα συστήματα.