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:
./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
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_000faili. - Arvu, vastetega failide ja vasteteta failide režiimis langeb lävend umbes
jobs * 750peale, 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
-jvää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,2ja4töötajaga) ei mõõda töötajate kogumit: need otsivad lühikest literaalifunction, mille lävendjobs * 4_000faili ü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 --jsonsü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.