Liigu sisu juurde

Paralleelsed töötajad

Greph jaotab teksti- ja AST-skannimised töötajate kogumi vahel, kui töö maht õigustab lisakulu. Kogum põhineb pcntl_fork()-l ja kasutab protsessisisest täitmist, kui ext-pcntl pole saadaval (Windows, mõnes PaaS-keskkonnas või piiratud majutuses).

Paralleelskannimiste lubamine

Määrake -j N väärtuseks CLI või jobs: N vastava suvandite objekti puhul:

Shell
./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),
);

Paralleeltöö käivitumine

Greph ei kasuta alati paralleeltöötlust. N protsessi loomine ja nende tulemuste torude kaudu edastamine lisab kulu, mis väikeste faililoendite puhul ületab otsingu enda kulu. Selle asemel arvutab fassaad lävendi tööde arvu, otsingurežiimi ja mustri kuju põhjal. Töötajate kogumile saadetakse ainult lävendit ületavad faililoendid.

Praegused heuristikad (asukohas Greph\Greph::shouldUseTextWorkers ja seotud failides):

  • Ühe tööga käivitused (-j 1) toimuvad alati protsessi sees.
  • Vaikimisi teksti skannimiseks peab töötajate kogumi käivitumiseks olema umbes jobs * 2_000 faili.
  • Arvu, vastetega failide ja vasteteta failide režiimis langeb lävend umbes jobs * 750 peale, sest failipõhine töö on väiksem.
  • Lühikeste identifikaatorikujuliste fikseeritud stringi mustrite puhul tõuseb lävend umbes väärtuseni jobs * 4_000, sest literaali kiirtee on niigi väga kiire ning protsesside loomine tasub end harva ära.
  • AST-otsing ja AST-ümberkirjutamine kasutavad lävendit jobs * 750.

Need arvud on heuristikad, mitte lubadused. Need on häälestatud andmestiku WordPress põhjal ning neid võidakse muuta.

Kogumi tööpõhimõte

Greph\Parallel\WorkSplitter jagab faililoendi N osaks. Greph\Parallel\WorkerPool loob iga osa jaoks eraldi töötajaprotsessi, mis käivitab sama sulguri oma faililõigul, ja Greph\Parallel\ResultCollector loeb jadastatud tulemused tagasi iga töötaja kohta loodud Unix-pesapaari kaudu. Emprotsess ootab kõiki töötajaid ning ühendab tulemused ja sorteerib need uuesti, et väljundi järjekord püsiks stabiilsena sõltumata töö jaotusest.

Tekstirežiimis kasutab töötajate kogum kohandatud võrguprotokolli kodeeringut (Greph\Text\TextResultCodec), et jadastatud andmemaht oleks väike. AST-režiim kasutab PHP standardset serialize()-i.

Kui pcntl pole saadaval

Kui pcntl_fork pole kasutatav (Windows või tugevdatud turvalisusega PHP järkudes), kasutab kogum läbipaistvalt iga osa töötlemiseks protsessisisest käivitust. Tulemus on sama mis -j 1 puhul. Greph ei anna viga, vaid töötab ühe lõimena.

Seda saab käitusajal tuvastada, kontrollides väärtust function_exists('pcntl_fork').

Häälestamissoovitused

  • Alustage nii, et -j väärtus oleks pool füüsiliste tuumade arvust, ja suurendage seda, kuni jõudlus paraneb.
  • Väikestes andmehoidlates on ainult literaale otsivate fikseeritud stringide puhul üks protsess tavaliselt kiirem kui mis tahes paralleelkonfiguratsioon.
  • Avaldatud võrdlustestid ei mõõda paralleelset AST-otsingut ega ümberkirjutamist. Enne tööde arvu määramist mõõtke tulemusi oma failipuul.
  • README read „Skannimisrežiim: paralleelne tekst” (andmestikus WordPress 1, 2 ja 4 töötajaga) ei mõõda töötajate kogumit: need otsivad lühikest literaali function, mille lävend jobs * 4_000 faili ületab andmestiku suuruse, seega käivitatakse kõik read protsessisiseselt (#8).

Piirangud

  • Praegune kogum ei toeta tööde varastamist. Kui üks osa on teistest palju mahukam, ootab kogum kõige aeglasema töötaja järel.
  • Töötajate tulemused talletatakse puhvrisse, kuni kõik töötajad on lõpetanud. Pika skannimise väljundi voogedastust (nagu rg --json sündmusi voogedastab) paralleelrežiim ei toeta.
  • Pärast tulemuste ühendamist sordib emprotsess need uuesti, seega ei vähenda töötajate kogum ühe protsessiga skannimisega võrreldes mälu tippkasutust.

Need piirangud sobivad töökoormustega, mille jaoks Greph on mõeldud (interaktiivne koodiotsing, agenditsüklid ja CI tööd hetktõmmistega). Need vaadatakse uuesti üle, kui profileerimine näitab, et need on pärisandmestike puhul kitsaskohaks.