Kuyankhulana kwakukulu ndi Cliff Click, bambo wa JIT kuphatikiza ku Java
Cliff Dinani - CTO ya Cratus (IoT sensors for process improvement), woyambitsa ndi woyambitsa nawo oyambitsa angapo (kuphatikiza Rocket Realtime School, Neurensic ndi H2O.ai) okhala ndi zotuluka zingapo zopambana. Cliff adalemba buku lake loyamba ali ndi zaka 15 (Pascal wa TRS Z-80)! Amadziwika kwambiri chifukwa cha ntchito yake pa C2 ku Java (Nyanja ya Nodes IR). Wopangayu adawonetsa dziko lapansi kuti JIT ikhoza kupanga code yapamwamba kwambiri, yomwe inali imodzi mwazinthu zomwe zidayambitsa Java ngati imodzi mwamapulogalamu amakono amakono. Kenako Cliff adathandizira Azul Systems kupanga mainframe 864-core ndi pulogalamu yoyera ya Java yomwe imathandizira GC kuyimitsa pa mulu wa 500-gigabyte mkati mwa 10 milliseconds. Kawirikawiri, Cliff adatha kugwira ntchito pazinthu zonse za JVM.
Habrapost iyi ndi zokambirana zabwino ndi Cliff. Tilankhula pamitu iyi:
Kusintha kwa kukhathamiritsa kwapang'ono
Momwe mungapangire refactoring yayikulu
Mtengo Model
Maphunziro a kukhathamiritsa otsika
Zitsanzo zothandiza za kuwongolera magwiridwe antchito
Chifukwa chiyani pangani chilankhulo chanu cha pulogalamu
Ntchito ya Engineer Performance
Mavuto Aukadaulo
Pang'ono za kugawa kaundula ndi ma multi-cores
Vuto lalikulu m'moyo
Interview imachitidwa ndi:
Andrey Satarin kuchokera ku Amazon Web Services. Mu ntchito yake, adakwanitsa kugwira ntchito zosiyanasiyana: adayesa database ya NewSQL yogawidwa ku Yandex, njira yodziwira mitambo ku Kaspersky Lab, masewera ambiri a Mail.ru ndi ntchito yowerengera mitengo ya ndalama zakunja ku Deutsche Bank. Wokonda kuyesa ma backend akuluakulu ndi machitidwe ogawa.
Vladimir Sitnikov kuchokera ku Netcracker. Zaka khumi zogwira ntchito pakuchita komanso kuwopsa kwa NetCracker OS, mapulogalamu omwe amagwiritsidwa ntchito ndi oyendetsa ma telecom kuti azitha kuyendetsa makina ndi zida zogwirira ntchito. Ndimakonda zochitika za Java ndi Oracle Database. Wolemba zakusintha kopitilira khumi ndi awiri mu woyendetsa wovomerezeka wa PostgreSQL JDBC.
Kusintha kwa kukhathamiritsa kwapang'ono
Andrei: Ndinu dzina lalikulu padziko lonse la JIT kuphatikiza, Java, ndi magwiridwe antchito ambiri, sichoncho?
Cliff: Zili choncho!
Andrei: Tiyeni tiyambe ndi mafunso ena okhudza ntchito yogwira ntchito. Mukuganiza bwanji za kusankha pakati pa kukhathamiritsa kwapamwamba komanso kotsika ngati kugwira ntchito pamlingo wa CPU?
Cliff: Chifukwa ndikhoza! Ndine wopuma pantchito, ndiye ichi ndi chokonda changa. Moyo wanga wonse ndakhala ndikukhazikitsa zilankhulo za anthu ena. Ndinagwiranso ntchito kwambiri pa kalembedwe kanga ka code. Komanso chifukwa ndimawona zovuta m'zilankhulo zina. Ndikuwona kuti pali njira zabwinoko zochitira zinthu zodziwika bwino. Ndipo ndikanawagwiritsa ntchito. Ndangotopa ndikuwona zovuta mwa ine ndekha, mu Java, mu Python, muchilankhulo china chilichonse. Tsopano ndikulemba mu React Native, JavaScript ndi Elm monga chosangalatsa chomwe sichimapuma pantchito, koma za ntchito yogwira ntchito. Ndimalembanso ku Python ndipo, mwina, ndipitiliza kugwira ntchito yophunzirira makina pamakina a Java. Pali zilankhulo zambiri zodziwika ndipo zonse zili ndi zinthu zosangalatsa. Aliyense ndi wabwino mwa njira yake ndipo mutha kuyesa kubweretsa zinthu zonsezi pamodzi. Kotero, ndikuphunzira zinthu zomwe zimandisangalatsa, khalidwe la chinenero, kuyesera kuti ndipeze semantics yololera. Ndipo mpaka pano ndikuchita bwino! Pakalipano ndikulimbana ndi semantics ya kukumbukira, chifukwa ndikufuna kukhala nayo monga C ndi Java, ndikupeza chitsanzo champhamvu cha kukumbukira ndi semantics ya kukumbukira katundu ndi masitolo. Nthawi yomweyo, khalani ndi zolembera zodziwikiratu monga ku Haskell. Apa, ndikuyesera kusakaniza zofananira za mtundu wa Haskell ndi ntchito yokumbukira mu C ndi Java. Izi ndi zomwe ndakhala ndikuchita kwa miyezi 2-3 yapitayi, mwachitsanzo.
Andrei: Ngati mupanga chilankhulo chomwe chimakhala bwino ndi zilankhulo zina, mukuganiza kuti wina angachite mosiyana: tengani malingaliro anu ndikuwagwiritsa ntchito?
Cliff: Umu ndi momwe zilankhulo zatsopano zimawonekera! Chifukwa chiyani Java ikufanana ndi C? Chifukwa C anali ndi mawu abwino omwe aliyense ankamvetsa ndipo Java inauziridwa ndi syntax iyi, kuwonjezera chitetezo chamtundu, kuyang'ana malire, GC, komanso adasintha zinthu zina kuchokera ku C. Iwo anawonjezera zawo. Koma iwo adadzozedwa kwambiri, sichoncho? Aliyense amaima pamapewa a zimphona zomwe zidabwera patsogolo panu - ndi momwe kupita patsogolo kumapangidwira.
Cliff: Chabwino, ndakhala ndikulemba C kwa zaka zambiri, ndi malloc zonsezi ndi zaulere, ndikuwongolera pamanja moyo wonse. Mukudziwa, 90-95% ya nthawi yoyendetsedwa pamanja ili ndi mawonekedwe omwewo. Ndipo ndizowawa kwambiri kuchita pamanja. Ndikufuna wokonzayo kuti akuuzeni zomwe zikuchitika kumeneko ndi zomwe mwapeza ndi zochita zanu. Pazinthu zina, wobwereketsa amachita izi kunja kwa bokosi. Ndipo ikuyenera kuwonetsa chidziwitso, kumvetsetsa chilichonse, komanso osandilemetsa ndikuwonetsa kumvetsetsa kumeneku. Iyenera kusanthula kuthawitsa kwanuko, ndipo pokhapokha ikalephera, ndiye kuti ikufunika kuwonjezera zolemba zomwe zingafotokoze moyo wonse - ndipo chiwembu chotere ndizovuta kwambiri kuposa kubwereketsa, kapena chekeni chilichonse chomwe chilipo. Kusankha pakati pa "zonse zili bwino" ndi "sindikumvetsa kalikonse" - ayi, payenera kukhala china chabwinoko.
Chifukwa chake, monga munthu yemwe adalemba ma code ambiri mu C, ndikuganiza kuti kukhala ndi chithandizo chowongolera moyo wonse ndichinthu chofunikira kwambiri. Ndakhutitsidwanso ndi kuchuluka kwa Java kumagwiritsira ntchito kukumbukira ndipo kudandaula kwakukulu ndi GC. Mukagawa kukumbukira ku Java, simudzakumbukira kukumbukira komwe kunali komweko panthawi yomaliza ya GC. Izi sizili choncho m'zilankhulo zokhala ndi kasamalidwe kolondola kwambiri. Mukayimba malloc, mumapeza nthawi yomweyo kukumbukira komwe kumangogwiritsidwa ntchito. Nthawi zambiri mumachita zinthu zosakhalitsa ndi kukumbukira ndikuzibwezeranso nthawi yomweyo. Ndipo nthawi yomweyo imabwerera ku dziwe la malloc, ndipo kuzungulira kwa malloc kotsatira kumachikokanso. Chifukwa chake, kugwiritsa ntchito kukumbukira kwenikweni kumachepetsedwa kukhala zinthu zamoyo panthawi yoperekedwa, kuphatikiza kutayikira. Ndipo ngati zonse sizikudumphira mwachisawawa, zokumbukira zambiri zimatha mu cache ndi purosesa, ndipo zimagwira ntchito mwachangu. Koma pamafunika zambiri kasamalidwe pamanja kukumbukira ndi malloc ndi ufulu kuitana mu dongosolo loyenera, m'malo oyenera. Dzimbiri limatha kuchita izi moyenera palokha, ndipo nthawi zambiri limapereka magwiridwe antchito abwinoko, chifukwa kukumbukira kumachepetsedwa mpaka kuwerengera komwe kulipo - kusiyana ndi kuyembekezera kuzungulira kwa GC kumasula kukumbukira. Zotsatira zake, tinali ndi njira yosangalatsa kwambiri yopititsira patsogolo ntchito. Ndipo zamphamvu kwambiri - ndikutanthauza, ndidachita zinthu zotere pokonza deta ya fintech, ndipo izi zidandilola kuti ndifulumire pafupifupi kasanu. Ndiko kulimbikitsa kwakukulu, makamaka m'dziko lomwe mapurosesa sakufulumira ndipo tikudikirira kukonza.
Ntchito ya Engineer Performance
Andrei: Ndikufunanso kufunsa za ntchito zonse. Munayamba kutchuka ndi ntchito yanu ya JIT ku HotSpot kenako ndikupita ku Azul, yomwenso ndi kampani ya JVM. Koma tinali tikugwira kale ntchito pa hardware kuposa mapulogalamu. Ndiyeno mwadzidzidzi anasintha kupita ku Big Data ndi Machine Learning, ndiyeno kuzindikira zachinyengo. Kodi zimenezi zinachitika bwanji? Izi ndi madera osiyana kwambiri a chitukuko.
Cliff: Ndakhala ndikukonza mapulogalamu kwa nthawi yayitali ndipo ndakwanitsa kutenga makalasi ambiri osiyanasiyana. Ndipo pamene anthu amati: "o, ndiwe amene munapanga JIT ku Java!", Nthawi zonse zimakhala zoseketsa. Koma izi zisanachitike, ndinali kugwira ntchito yofanana ndi PostScript - chilankhulo chomwe Apple idagwiritsapo ntchito makina osindikiza a laser. Ndipo izi zisanachitike ndidakhazikitsa chilankhulo cha Forth. Ndikuganiza kuti mutu wamba kwa ine ndi chitukuko cha zida. Moyo wanga wonse ndakhala ndikupanga zida zomwe anthu ena amalemba nawo mapulogalamu awo abwino. Koma ndinali nawonso pakupanga makina opangira opaleshoni, madalaivala, ma kernel-level debuggers, zinenero za chitukuko cha OS, zomwe zinayamba zochepa, koma patapita nthawi zinakhala zovuta kwambiri. Koma mutu waukulu udakali chitukuko cha zida. Gawo lalikulu la moyo wanga linadutsa pakati pa Azul ndi Sun, ndipo zinali za Java. Koma nditalowa mu Big Data ndi Machine Learning, ndidavalanso chipewa changa chapamwamba ndikuti, "O, tsopano tili ndi vuto losachepera, ndipo pali zinthu zambiri zosangalatsa zomwe zikuchitika komanso anthu akuchita zinthu." Iyi ndi njira yabwino yopitira patsogolo.
Inde, ndimakonda kwambiri makompyuta ogawidwa. Ntchito yanga yoyamba inali ngati wophunzira ku C, pa ntchito yotsatsa malonda. Izi zidagawidwa pamakompyuta pa Zilog Z80 tchipisi zomwe zidasonkhanitsa deta ya OCR ya analogi, yopangidwa ndi wosanthula weniweni. Unali mutu wabwino komanso wopenga kotheratu. Koma panali mavuto, gawo lina silinazindikiridwe molondola, kotero mumayenera kutenga chithunzi ndikuwonetsa kwa munthu yemwe amatha kuwerenga kale ndi maso ndikufotokozera zomwe adanena, choncho panali ntchito ndi deta, ndi ntchito izi. anali ndi chinenero chawochawo . Panali kumbuyo komwe kunakonza zonsezi - ma Z80 omwe akuyenda mofanana ndi ma terminals a vt100 akuthamanga - mmodzi pa munthu aliyense, ndipo panali chitsanzo chofananira pa Z80. Chikumbukiro china chomwe chimagawidwa ndi ma Z80 onse mkati mwa kasinthidwe ka nyenyezi; Ndege yam'mbuyo idagawidwanso, ndipo theka la RAM linagawidwa pa intaneti, ndipo theka lina linali lachinsinsi kapena linapita ku chinachake. Dongosolo logawika lovuta kwambiri lomwe lili ndi makumbukidwe ogawana... ogawana pang'ono. Izi zinali liti ... sindingathe kukumbukira, kwinakwake pakati pa zaka za m'ma 80. Kalekale ndithu.
Inde, tiyerekeze kuti zaka 30 zapita kale kwambiri. Beowulf-magulu. Magulu oterowo amawoneka ngati ... inali kukumbukira kwabodza komwe kumagawana ndi masamba okumbukira chitetezo pa x86, ndipo ngati mutalembera patsamba lino, ndiye kuti tidauza ma processor ena kuti ngati apeza kukumbukira komweko komweko, kuyenera kuchotsedwa kwa inu, motero china chake ngati protocol yothandizira. kugwirizana kwa cache kunawonekera ndi mapulogalamu a izi. Lingaliro losangalatsa. Koma vuto lenileni linali linanso. Zonsezi zinagwira ntchito, koma mwamsanga munapeza zovuta zogwirira ntchito, chifukwa palibe amene anamvetsa zitsanzo za machitidwe pamlingo wokwanira - ndi njira zotani zofikira kukumbukira zomwe zinalipo, momwe mungatsimikizire kuti mfundozo sizimangokhalira kukangana, ndi zina zotero.
Zomwe ndinabwera nazo mu H2O ndikuti ndi omwe akupanga okha omwe ali ndi udindo wodziwa komwe kufanana kumabisika komanso komwe sikuli. Ndinabwera ndi chitsanzo cholembera chomwe chinapangitsa kulemba kachidindo kapamwamba kukhala kosavuta komanso kosavuta. Koma kulemba code yoyenda pang'onopang'ono ndizovuta, zidzawoneka zoipa. Muyenera kuyesetsa kwambiri kulemba code pang'onopang'ono, muyenera kugwiritsa ntchito njira zosavomerezeka. Code braking ikuwonekera poyang'ana koyamba. Zotsatira zake, nthawi zambiri mumalemba kachidindo kamene kamayenda mofulumira, koma muyenera kudziwa zoyenera kuchita pokumbukira nawo. Zonsezi zimamangiriridwa kumagulu akuluakulu ndipo khalidweli limakhala lofanana ndi magulu akuluakulu osasunthika mu Java yofanana. Ndikutanthauza, yerekezani kuti ulusi uwiri umalemba pamndandanda wofananira, umodzi wa iwo upambana, ndipo winayo, motere, wataya, ndipo simudziwa kuti ndi uti. Ngati sizikusinthika, ndiye kuti dongosololi likhoza kukhala chilichonse chomwe mukufuna - ndipo izi zimagwira ntchito bwino. Anthu amasamala kwambiri za dongosolo la magwiridwe antchito, amayika zosakhazikika m'malo oyenera, ndipo amayembekezera zovuta zokhudzana ndi kukumbukira m'malo oyenera. Kupanda kutero, amangolemba kachidindo ngati malupu kuyambira 1 mpaka N, pomwe N ndi ma thililiyoni, ndikuyembekeza kuti milandu yonse yovuta idzakhala yofanana - ndipo sizigwira ntchito pamenepo. Koma mu H2O iyi si Java kapena Scala; mutha kuyiwona ngati "Java minus minus" ngati mukufuna. Iyi ndi ndondomeko yomveka bwino kwambiri ndipo ikufanana ndi kulemba C kapena Java code yosavuta yokhala ndi malupu ndi magulu. Koma nthawi yomweyo, kukumbukira kumatha kukonzedwa mu terabytes. Ndimagwiritsabe ntchito H2O. Ndimagwiritsa ntchito nthawi ndi nthawi pamapulojekiti osiyanasiyana - ndipo akadali chinthu chofulumira kwambiri, kambirimbiri mwachangu kuposa omwe akupikisana nawo. Ngati mukuchita Big Data ndi data columnar, ndizovuta kwambiri kumenya H2O.
Mavuto Aukadaulo
Andrei: Ndi chiyani chomwe chakhala chovuta kwambiri pantchito yanu yonse?
Cliff: Kodi tikukambirana zaukadaulo kapena zosagwirizana ndiukadaulo? Ndikhoza kunena kuti zovuta zazikulu si zaukadaulo.
Ponena za zovuta zaukadaulo. Ndinangowagonjetsa. Sindikudziwa kuti chachikulu chinali chiyani, koma panali ena osangalatsa omwe adatenga nthawi yayitali, kulimbana ndi malingaliro. Nditapita ku Sun, ndinali wotsimikiza kuti ndipanga compiler yofulumira, ndipo gulu la akuluakulu adanena poyankha kuti sindidzapambana. Koma ndidatsata njira iyi, ndidalemba cholembera ku registry allocator, ndipo idathamanga kwambiri. Zinali zofulumira monga C1 yamakono, koma wopereka ndalamayo anali wocheperapo kale, ndipo poyang'ana kumbuyo kunali vuto lalikulu la deta. Ndidafunikira kuti ndilembe cholembera cholembera ndipo sindimamvetsetsa vuto lomwe limakhalapo pakati pa kufotokoza kwachidziwitso ndi liwiro, zomwe zidalipo nthawi imeneyo ndipo zinali zofunika kwambiri. Zinapezeka kuti mawonekedwe a data nthawi zambiri amaposa kukula kwa cache pa x86s nthawi imeneyo, chifukwa chake, ngati ndimaganiza kuti olembetsa atha kupanga 5-10 peresenti ya nthawi yonse ya jitter, ndiye kuti zidachitikadi. 50 peresenti.
M'kupita kwa nthawi, wolembayo adakhala woyeretsa komanso wogwira ntchito bwino, adasiya kupanga code yowopsya nthawi zambiri, ndipo ntchitoyo inayamba kufanana ndi zomwe compiler C imapanga. . Mukalemba kachidindo ngati C, mupeza magwiridwe antchito ngati C nthawi zambiri. Ndipo mukupita patsogolo, nthawi zambiri mumapeza kachidindo kamene kamayenderana ndi mlingo C, olembetsa olembetsa anayamba kuwoneka ngati chinachake chokwanira ... mosasamala kanthu kuti code yanu ikuyenda mofulumira kapena pang'onopang'ono. Ndinapitiliza kugwira ntchito pa allocator kuti apange zosankha zabwino. Anakhala wodekha komanso wodekha, koma adapereka machitidwe abwino ndi abwino pazochitika zomwe palibe wina angakhoze kupirira. Nditha kulowa mu registry allocator, kuyika mwezi wantchito kumeneko, ndipo mwadzidzidzi code yonse imayamba kuchita 5% mwachangu. Izi zidachitika nthawi ndi nthawi ndipo olembetsa adakhala chinthu chaluso - aliyense adachikonda kapena kudana nacho, ndipo anthu ochokera kusukuluyi adafunsa mafunso pamutu wakuti "chifukwa chiyani zonse zimachitika motere", bwanji osatero. jambulani mzere, ndipo pali kusiyana kotani. Yankho likadali lofanana: chopereka chotengera mtundu wa graph kuphatikiza ntchito yosamala kwambiri yokhala ndi buffer code ndi chofanana ndi chida chopambana, kuphatikiza kopambana komwe palibe amene angagonjetse. Ndipo ichi ndi chinthu chosadziwika bwino. Zina zonse zomwe wopanga amapanga pali zinthu zophunziridwa bwino, ngakhale zabweretsedwanso pamlingo waukadaulo. Nthawi zonse ndimachita zinthu zomwe zimayenera kusandutsa wojambulayo kukhala ntchito yojambula. Koma palibe chilichonse mwa izi chomwe chinali chodabwitsa - kupatula kwa olembetsa. Chinyengo ndicho kusamala kudula pansi pansi pa katundu ndipo, ngati izi zichitika (ndikhoza kufotokoza mwatsatanetsatane ngati mukufuna), izi zikutanthauza kuti mukhoza kutsata mwamphamvu kwambiri, popanda chiopsezo chogwera pa kink mu ndondomeko ya ntchito. M'masiku amenewo, panali gulu la anthu ophatikizira athunthu, opachikidwa ndi zinyalala ndi mluzu, omwe anali ndi ogawa zolembetsa, koma palibe amene adatha kuchita.
Vuto ndiloti ngati muwonjezera njira zomwe zimayenera kulowetsamo, kuwonjezeka ndi kuonjezera malo olowera, zomwe zimagwiritsidwa ntchito nthawi yomweyo zimaposa chiwerengero cha zolembera, ndipo muyenera kuzidula. Mulingo wovuta nthawi zambiri umabwera pomwe woperekayo asiya, ndipo wofuna kutayikira amakhala wofunika wina, mudzagulitsa zinthu zakutchire. Phindu lakuyika apa ndikuti mumataya gawo lapamwamba, pamutu pakuyimba ndi kusunga, mutha kuwona zomwe zili mkati ndikuzikulitsa. Mtengo wa inlining ndikuti kuchuluka kwazinthu zamoyo kumapangidwa, ndipo ngati olembetsa anu amawotcha kuposa momwe amafunikira, mumataya nthawi yomweyo. Choncho, ambiri allocators ali ndi vuto: pamene inlining kuwoloka mzere winawake, chirichonse padziko lapansi chimayamba kudulidwa ndipo zokolola zikhoza kugubuduza pansi chimbudzi. Omwe akugwiritsa ntchito compiler amawonjezera ma heuristics: mwachitsanzo, kusiya kuyika, kuyambira ndi kukula kokwanira, popeza kugawa kumawononga chilichonse. Umu ndi momwe kink mu graph ya magwiridwe antchito amapangidwira - inu okhala pakati, okhala pakati, magwiridwe antchito amakula pang'onopang'ono - kenako kukwera! - imagwera pansi ngati jack yothamanga chifukwa mumatsata kwambiri. Umu ndi momwe zonse zidagwirira ntchito Java isanabwere. Java imafuna kulowetsedwa kochulukirapo, chifukwa chake ndidapangitsa kuti wondigawirayo akhale wolimba mtima kwambiri kuti awonekere m'malo mowonongeka, ndipo ngati mulowa mochulukira, imayamba kutayika, koma mphindi "yopanda kukhetsa" ikubwerabe. Izi ndizosangalatsa ndipo zidangobwera kwa ine modzidzimutsa, osati zowonekeratu, koma zidalipira bwino. Ndinayamba kuchita zaukali ndipo zinanditengera kumalo komwe Java ndi C zimagwirira ntchito limodzi. Ali pafupi kwambiri - nditha kulemba Java code yomwe ili yothamanga kwambiri kuposa C code ndi zinthu monga choncho, koma pafupifupi, pachithunzi chachikulu cha zinthu, ndizofanana. Ndikuganiza kuti gawo lina loyenera ndi lolembetsa, zomwe zimandilola kuti ndizitha kutsata mopusa momwe ndingathere. Ndimangoyang'ana zonse zomwe ndikuwona. Funso apa ndilakuti ngati allocator amagwira ntchito bwino, kaya zotsatira zake ndi code yogwira ntchito mwanzeru. Ili linali vuto lalikulu: kumvetsetsa zonsezi ndikuzipanga kuti zigwire ntchito.