Μετάβαση στο περιεχόμενο

Παράλληλοι εργαζόμενοι

Το Greph κατανέμει τις σαρώσεις κειμένου και AST σε μια ομάδα εργαζομένων όταν ο όγκος εργασίας δικαιολογεί την επιβάρυνση. Η ομάδα βασίζεται στο pcntl_fork() και επιστρέφει σε εκτέλεση εντός διεργασίας όταν το ext-pcntl δεν είναι διαθέσιμο (Windows, ορισμένα περιβάλλοντα PaaS, περιορισμένη φιλοξενία).

Ενεργοποίηση παράλληλων σαρώσεων

Ορίστε το -j N στο CLI ή το jobs: N στο σχετικό αντικείμενο επιλογών:

Κέλυφος
./vendor/bin/greph -F -j 8 "function" src
./vendor/bin/greph -p '$obj->$method($$$ARGS)' -j 4 src
./vendor/bin/rg --threads 8 -F "function" src
./vendor/bin/sg run --threads 8 --pattern '$obj->$method($$$ARGS)' src
PHP
use Greph\Greph;
use Greph\Text\TextSearchOptions;

Greph::searchText(
    'function',
    'src',
    new TextSearchOptions(fixedString: true, jobs: 8),
);

Πότε ενεργοποιείται η παράλληλη λειτουργία

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

Οι τρέχουσες ευρετικές (στο Greph\Greph::shouldUseTextWorkers και τα σχετικά στοιχεία):

  • Οι εκτελέσεις μίας εργασίας (-j 1) πραγματοποιούνται πάντα εντός διεργασίας.
  • Οι προεπιλεγμένες σαρώσεις κειμένου απαιτούν περίπου jobs * 2_000 αρχεία για να ενεργοποιηθεί η ομάδα.
  • Οι λειτουργίες καταμέτρησης, αρχείων με αντιστοιχίες και αρχείων χωρίς αντιστοιχίες μειώνουν το όριο σε περίπου jobs * 750, επειδή η εργασία ανά αρχείο είναι φθηνότερη.
  • Τα σύντομα μοτίβα σταθερών συμβολοσειρών που μοιάζουν με αναγνωριστικά αυξάνουν το όριο σε περίπου jobs * 4_000, επειδή η γρήγορη διαδρομή κυριολεκτικού κειμένου είναι ήδη τόσο φθηνή, ώστε η δημιουργία διεργασιών σπάνια συμφέρει.
  • Η αναζήτηση και η επανεγγραφή AST χρησιμοποιούν το όριο jobs * 750.

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

Πώς λειτουργεί η ομάδα

Το Greph\Parallel\WorkSplitter κατανέμει τη λίστα αρχείων σε N τμήματα. Το Greph\Parallel\WorkerPool διακλαδώνεται σε μία διεργασία εργαζομένου ανά τμήμα· κάθε εργαζόμενος εκτελεί το ίδιο κλείσιμο στο δικό του τμήμα και το Greph\Parallel\ResultCollector διαβάζει πίσω τα σειριοποιημένα αποτελέσματα μέσω ενός ζεύγους υποδοχών Unix ανά εργαζόμενο. Η γονική διεργασία περιμένει να ολοκληρωθούν όλοι οι εργαζόμενοι και έπειτα συγχωνεύει και ταξινομεί ξανά το σύνολο αποτελεσμάτων, ώστε η σειρά εξόδου να παραμένει σταθερή ανεξάρτητα από τον τρόπο κατανομής της εργασίας.

Για τη λειτουργία κειμένου, η ομάδα εργαζομένων χρησιμοποιεί έναν προσαρμοσμένο κωδικοποιητή μεταφοράς (Greph\Text\TextResultCodec) για να διατηρεί μικρό το σειριοποιημένο φορτίο. Η λειτουργία AST χρησιμοποιεί την τυπική serialize() του PHP.

Όταν το pcntl δεν είναι διαθέσιμο

Αν δεν είναι δυνατή η κλήση του pcntl_fork (Windows, ενισχυμένες εκδόσεις του PHP), η ομάδα επιστρέφει απρόσκοπτα στην εκτέλεση κάθε τμήματος εντός διεργασίας. Το αποτέλεσμα είναι ίδιο με του -j 1. Το Greph δεν εμφανίζει σφάλμα· απλώς εκτελείται σε ένα νήμα.

Μπορείτε να το εντοπίσετε κατά την εκτέλεση ελέγχοντας το function_exists('pcntl_fork').

Συμβουλές ρύθμισης

  • Ξεκινήστε ορίζοντας το -j στο μισό του αριθμού των φυσικών πυρήνων σας και αυξήστε το μέχρι να πάψετε να βλέπετε βελτιώσεις.
  • Για αναζητήσεις σταθερών κυριολεκτικών συμβολοσειρών σε μικρά αποθετήρια, η εκτέλεση σε μία διεργασία είναι συνήθως ταχύτερη από οποιαδήποτε παράλληλη ρύθμιση.
  • Καμία δημοσιευμένη μέτρηση δεν αξιολογεί παράλληλη αναζήτηση ή επανεγγραφή AST. Μετρήστε στο δικό σας δέντρο πριν επιλέξετε αριθμό εργασιών.
  • Οι σειρές «Λειτουργία σάρωσης: παράλληλο κείμενο» του README (1, 2 και 4 εργαζόμενοι στο σώμα δεδομένων WordPress) δεν μετρούν την ομάδα: αναζητούν τη σύντομη κυριολεκτική συμβολοσειρά function, της οποίας το όριο των jobs * 4_000 αρχείων υπερβαίνει το μέγεθος του σώματος δεδομένων, επομένως κάθε σειρά εκτελείται εντός διεργασίας (#8).

Περιορισμοί

  • Η τρέχουσα ομάδα δεν υποστηρίζει δυναμική ανάθεση εργασιών. Αν ένα τμήμα είναι πολύ βαρύτερο από τα υπόλοιπα, η ομάδα περιμένει τον πιο αργό εργαζόμενο.
  • Τα αποτελέσματα των εργαζομένων αποθηκεύονται προσωρινά μέχρι να ολοκληρωθούν όλοι. Δεν υποστηρίζεται έξοδος ροής από μια μακρόχρονη σάρωση, όπως η ροή συμβάντων του rg --json, σε παράλληλη λειτουργία.
  • Η γονική διεργασία ταξινομεί ξανά τα αποτελέσματα μετά τη συγχώνευση, επομένως η ομάδα εργαζομένων δεν μειώνει τη μέγιστη χρήση μνήμης σε σχέση με τη σάρωση μίας διεργασίας.

Αυτοί οι περιορισμοί είναι αποδεκτοί για τους φόρτους εργασίας που στοχεύει το Greph (διαδραστική αναζήτηση κώδικα, κύκλοι λειτουργίας agent, εργασίες CI σε στιγμιότυπα). Θα επανεξεταστούν αν η ανάλυση επιδόσεων δείξει ότι αποτελούν σημείο συμφόρησης σε πραγματικά σώματα δεδομένων.