{"id":2276,"date":"2020-10-31T23:28:44","date_gmt":"2020-10-31T22:28:44","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=2276"},"modified":"2020-10-31T23:28:44","modified_gmt":"2020-10-31T22:28:44","slug":"net-core-performance-nyomozas-ii","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2020\/10\/31\/net-core-performance-nyomozas-ii\/","title":{"rendered":".NET Core performance nyomoz\u00e1s II."},"content":{"rendered":"\n<p>\u00dajra neki\u00e1lltam m\u00e9rni. El\u0151z\u0151 alkalommal az\u00e9rt voltak rosszabbak a .NET Core sz\u00e1mai, mert sz\u00e1nd\u00e9kaim ellen\u00e9re els\u0151re nem optimaliz\u00e1lt k\u00f3dot m\u00e9rtem. A r\u00e9gi projectr\u0151l SDK projectre konverzi\u00f3 sor\u00e1n valami \u00f6sszezagyv\u00e1l\u00f3dott az optimaliz\u00e1l\u00e1s be\u00e1ll\u00edt\u00e1sok k\u00f6r\u00fcl a release configon\u00e1l. K\u00e9zzel kitakar\u00edtottam a csprojokat, \u00edgy m\u00e1r azt ford\u00edt, amit \u00e9n akarok (egy\u00e9bk\u00e9nt optimize+ a default).<\/p>\n\n\n\n<p>Mivel a m\u00e9r\u00e9s sor\u00e1n l\u00e1ttuk, hogy a GC-nek nagy hat\u00e1sa van a m\u00e9rt teljes\u00edtm\u00e9nyre, ez\u00e9rt, hogy re\u00e1lisabb k\u00e9pet kapjunk, hogy olyan sokszor kell megism\u00e9telni a m\u00e9r\u00e9st, hogy biztos elinduljon p\u00e1rszor a GC. Hisz lehet az\u00e9rt sz\u00e9pek egyes m\u00e9r\u00e9sekn\u00e9l a sz\u00e1mok, mert nem volt el\u00e9g nagy a haszn\u00e1lt mem\u00f3ria m\u00e9rete, hogy a GC elinduljon, \u00edgy nincs alkalma rontani a sz\u00e1mokat.<br>.NET 4.8 alatt app.configb\u00f3l szab\u00e1lyzom a GC m\u0171k\u00f6d\u00e9s\u00e9t:<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;gcServer enabled=&quot;true|false&quot;\/&gt;\n&lt;gcConcurrent enabled=&quot;true|false&quot;\/&gt;\n<\/pre>\n\n\n\n<p>.NET 5 alatt a runtimeconfig.template.jsonb\u0151l a legyegyszer\u0171bb szab\u00e1lyozni a GC-t:<\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n  &quot;runtimeOptions&quot;: {\n  &quot;configProperties&quot;: {\n  &quot;System.GC.Concurrent&quot;: false\n  &quot;System.GC.Server&quot;: false }\n  }\n}\n<\/pre>\n\n\n\n<p>De nekem egyel\u0151re erre nem hallgatott, de az csprojban be\u00e1ll\u00edtottra igen:<\/p>\n\n\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;PropertyGroup&gt;\n\t&lt;ServerGarbageCollection&gt;true&lt;\/ServerGarbageCollection&gt;\n\t&lt;ConcurrentGarbageCollection&gt;false&lt;\/ConcurrentGarbageCollection&gt;\n&lt;\/PropertyGroup&gt;\n<\/pre>\n\n\n\n<p>Az els\u0151 fut\u00e1sok nincsenek benne az aggreg\u00e1lt statiszik\u00e1kban, de a list\u00e1kban l\u00e1tszanak.<\/p>\n\n\n\n<p>J\u00f6jjenek a 4.8-as .NET Frameworks sz\u00e1mok.<\/p>\n\n\n\n<p>A m\u00e9r\u00e9sek tetej\u00e9n ott a konfig, a GC sz\u00e1mok azt mutatj\u00e1k, addig az adott gener\u00e1ci\u00f3ban h\u00e1nyszor t\u00f6rt\u00e9nt takar\u00edt\u00e1s.<\/p>\n\n\n\n<p><br>El\u0151sz\u00f6r k\u00e9t m\u00e9r\u00e9s Workstation GC-vel:<\/p>\n\n\n\n<p>Server: False, LatencyMode: <strong>Batch<\/strong><br>1849ms, GC0: 13, GC1: 8, GC2: 4<br>1565ms, GC0: 17, GC1: 11, GC2: 5<br>1958ms, GC0: 23, GC1: 14, GC2: 6<br>1072ms, GC0: 26, GC1: 16, GC2: 6<br>1696ms, GC0: 31, GC1: 19, GC2: 7<br>1371ms, GC0: 36, GC1: 21, GC2: 8<br>1411ms, GC0: 41, GC1: 24, GC2: 9<br>1270ms, GC0: 45, GC1: 26, GC2: 10<br>1446ms, GC0: 50, GC1: 29, GC2: 11<br>1264ms, GC0: 54, GC1: 31, GC2: 12<br>1455ms, GC0: 59, GC1: 34, GC2: 13<br>1294ms, GC0: 63, GC1: 36, GC2: 14<br>1433ms, GC0: 68, GC1: 39, GC2: 15<br>1246ms, GC0: 72, GC1: 41, GC2: 16<br>1431ms, GC0: 77, GC1: 44, GC2: 17<br>1318ms, GC0: 81, GC1: 46, GC2: 18<br>1460ms, GC0: 86, GC1: 49, GC2: 19<br>1258ms, GC0: 90, GC1: 51, GC2: 20<br>1434ms, GC0: 95, GC1: 54, GC2: 21<br>1251ms, GC0: <strong>99<\/strong>, GC1: 56, GC2: 22<br>Min: 1072, Avg: 1402<\/p>\n\n\n\n<p>Server: False, LatencyMode: <strong>Interactive<\/strong><br>1193ms, GC0: 137, GC1: 49, GC2: 7<br>1381ms, GC0: 209, GC1: 74, GC2: 8<br>1619ms, GC0: 282, GC1: 100, GC2: 10<br>1540ms, GC0: 355, GC1: 125, GC2: 12<br>1601ms, GC0: 429, GC1: 151, GC2: 14<br>1314ms, GC0: 500, GC1: 176, GC2: 14<br>1549ms, GC0: 573, GC1: 202, GC2: 16<br>1404ms, GC0: 645, GC1: 226, GC2: 16<br>1620ms, GC0: 718, GC1: 252, GC2: 18<br>1531ms, GC0: 791, GC1: 278, GC2: 20<br>1450ms, GC0: 864, GC1: 303, GC2: 21<br>1542ms, GC0: 937, GC1: 328, GC2: 23<br>1390ms, GC0: 1009, GC1: 353, GC2: 24<br>1353ms, GC0: 1081, GC1: 377, GC2: 24<br>1523ms, GC0: 1154, GC1: 403, GC2: 26<br>1313ms, GC0: 1225, GC1: 427, GC2: 26<br>1529ms, GC0: 1299, GC1: 454, GC2: 28<br>1435ms, GC0: 1371, GC1: 479, GC2: 29<br>1275ms, GC0: 1443, GC1: 503, GC2: 29<br>1500ms, GC0: <strong>1516<\/strong>, GC1: 536, GC2: 31<br>Min: 1275, Avg: 1467<\/p>\n\n\n\n<p>\u00c9rdekes l\u00e1tni, az interak\u00edv 15x annyi 0 gener\u00e1ci\u00f3s takar\u00edt\u00e1st ind\u00edtott, mert igyekszik sokszor, de kicsit takar\u00edtani, hogy ha anim\u00e1ci\u00f3k vagy m\u00e1s id\u0151\u00e9rz\u00e9keny k\u00f3dok futn\u00e1nak, akkor ne szaggasson bele. De cser\u00e9be a fut\u00e1si id\u0151k kiss\u00e9 megny\u00falnak.<\/p>\n\n\n\n<p>J\u00f6jjenek a server GC-k.<\/p>\n\n\n\n<p><br>Server: True, LatencyMode: <strong>Batch<\/strong><br>852ms, GC0: 2, GC1: 2, GC2: 2<br>683ms, GC0: 2, GC1: 2, GC2: 2<br>859ms, GC0: 3, GC1: 3, GC2: 3<br>509ms, GC0: 3, GC1: 3, GC2: 3<br><em>1061ms, GC0: 4<\/em>, GC1: 4, GC2: 4<br>523ms, GC0: 4, GC1: 4, GC2: 4<br>539ms, GC0: 4, GC1: 4, GC2: 4<br><em>1084ms, GC0: 5<\/em>, GC1: 5, GC2: 5<br>498ms, GC0: 5, GC1: 5, GC2: 5<br>505ms, GC0: 5, GC1: 5, GC2: 5<br>530ms, GC0: 5, GC1: 5, GC2: 5<br><em>894ms, GC0: 6<\/em>, GC1: 6, GC2: 6<br>503ms, GC0: 6, GC1: 6, GC2: 6<br><em>1021ms, GC0: 7<\/em>, GC1: 7, GC2: 7<br>495ms, GC0: 7, GC1: 7, GC2: 7<br>537ms, GC0: 7, GC1: 7, GC2: 7<br><em>1136ms, GC0: 8<\/em>, GC1: 8, GC2: 8<br>498ms, GC0: 8, GC1: 8, GC2: 8<br>490ms, GC0: 8, GC1: 8, GC2: 8<br>514ms, GC0: 8, GC1: 8, GC2: 8<br>Min: 490, Avg: 678<\/p>\n\n\n\n<p>Megh\u00f6kkent\u0151 k\u00fcl\u00f6nbs\u00e9g a workstationh\u00f6z k\u00e9pest. Sokkal gyorsabban fut le a k\u00f3d (pontosabban kevesebb id\u0151t vesz el a GC), sokkal kevesebb a takar\u00edt\u00e1s minden gener\u00e1ci\u00f3ban, ez\u00e9rt az \u00e1tereszt\u0151k\u00e9pess\u00e9g t\u00f6bb mint a dupl\u00e1ja lett. \u00c9rdekes l\u00e1tni, mindig akkor nagyobbak a m\u00e9rt id\u0151k, amikor a GC0 is ugrik egyet (d\u0151lttel megjel\u00f6ltem).<br>Hozz\u00e1teszem, t\u00f6bbsz\u00e1l\u00fa k\u00f3dn\u00e1l ez val\u00f3sz\u00edn\u0171leg m\u00e9g hars\u00e1nyabban kij\u00f6nne, mivel Server GC eset\u00e9n processzoronk\u00e9t 1 heap van, \u00edgy kisebb a torl\u00f3d\u00e1s.<\/p>\n\n\n\n<p>Server: True, LatencyMode: <strong>Interactive<\/strong><br>868ms, GC0: 5, GC1: 3, GC2: 2<br>616ms, GC0: 5, GC1: 3, GC2: 2<br>1308ms, GC0: 7, GC1: 5, GC2: 3<br>613ms, GC0: 7, GC1: 5, GC2: 3<br>604ms, GC0: 7, GC1: 5, GC2: 3<br>1259ms, GC0: 8, GC1: 5, GC2: 3<br>538ms, GC0: 8, GC1: 5, GC2: 3<br>607ms, GC0: 8, GC1: 5, GC2: 3<br>1056ms, GC0: 9, GC1: 6, GC2: 4<br>487ms, GC0: 9, GC1: 6, GC2: 4<br>475ms, GC0: 9, GC1: 6, GC2: 4<br>883ms, GC0: 11, GC1: 8, GC2: 5<br>471ms, GC0: 11, GC1: 8, GC2: 5<br>489ms, GC0: 11, GC1: 8, GC2: 5<br>1110ms, GC0: 13, GC1: 9, GC2: 6<br>606ms, GC0: 13, GC1: 9, GC2: 6<br>599ms, GC0: 13, GC1: 9, GC2: 6<br>596ms, GC0: 14, GC1: 10, GC2: 7<br>1227ms, GC0: 15, GC1: 11, GC2: 7<br>477ms, GC0: 15, GC1: 11, GC2: 7<br>Min: 471, Avg: 738<\/p>\n\n\n\n<p>Itt is sz\u00e9pek a sz\u00e1mok, de jobban sz\u00f3rnak. Mindenesetre tiszt\u00e1n l\u00e1tszik, ha a nyers teljes\u00edtm\u00e9ny kell, a server GC sokat sz\u00e1m\u00edt. Ezt f\u0151leg azoknak mondom, akik p\u00e9ld\u00e1ul Windows Service-ben futtatnak feldolgoz\u00f3 k\u00f3dokat, m\u00e9g ink\u00e1bb, ha ezt t\u00f6bb sz\u00e1lon teszik. Nagyon sokat lehet nyerni ezzel az egyszer\u0171 \u00e1tkonfigur\u00e1l\u00e1ssal. Egyr\u0151l m\u00e1r \u00edrtam <a href=\"https:\/\/soci.hu\/blog\/index.php\/2009\/06\/11\/a-tobbszalu-skalazas-nehezsegei\/\" data-type=\"URL\" data-id=\"https:\/\/soci.hu\/blog\/index.php\/2009\/06\/11\/a-tobbszalu-skalazas-nehezsegei\/\">2009-ben<\/a> is.<\/p>\n\n\n\n<p>M\u00e9g egy \u00e9rdekes eset. Ha minden m\u00e9r\u00e9s k\u00f6z\u00f6tt futtatom a GC-t (ezt nem belem\u00e9rve az id\u0151kbe), \u00edgy a m\u00e9r\u00e9s sor\u00e1n kisebb a val\u00f3sz\u00edn\u0171s\u00e9ge, hogy elinduljon (az els\u0151 m\u00e9r\u00e9st megism\u00e9telve)<br>Server: False, LatencyMode: Batch<br>1869ms, GC0: 13, GC1: 8, GC2: 4<br>1018ms, GC0: 17, GC1: 11, GC2: 5<br>1300ms, GC0: 23, GC1: 14, GC2: 6<br>1368ms, GC0: 27, GC1: 17, GC2: 8<br>1071ms, GC0: 32, GC1: 19, GC2: 9<br>1050ms, GC0: 36, GC1: 22, GC2: 10<br>1059ms, GC0: 41, GC1: 24, GC2: 11<br>1053ms, GC0: 45, GC1: 27, GC2: 12<br>986ms, GC0: 49, GC1: 30, GC2: 13<br>1076ms, GC0: 55, GC1: 33, GC2: 14<br>1049ms, GC0: 59, GC1: 36, GC2: 15<br>982ms, GC0: 63, GC1: 39, GC2: 16<br>1074ms, GC0: 69, GC1: 42, GC2: 17<br>1044ms, GC0: 73, GC1: 45, GC2: 18<br>980ms, GC0: 77, GC1: 48, GC2: 19<br>1072ms, GC0: 83, GC1: 51, GC2: 20<br>1056ms, GC0: 87, GC1: 54, GC2: 21<br>972ms, GC0: 91, GC1: 57, GC2: 22<br>1117ms, GC0: 97, GC1: 59, GC2: 23<br>1045ms, GC0: 101, GC1: 62, GC2: 24<br>Min: 972, Avg: 1072<\/p>\n\n\n\n<p><br>L\u00e1that\u00f3, hogy az \u00e1tlag sokkal k\u00f6zelebb van a minimumhoz, mivel kev\u00e9sb\u00e9 sz\u00f3rnak a m\u00e9rt \u00e9rt\u00e9kek, mert kevesebbszer szakadt meg a fut\u00e1s a GC miatt.<\/p>\n\n\n\n<p>Mi eddig a tanuls\u00e1g? A GC er\u0151sen belesz\u00f3l egy .NET app teljes\u00edtm\u00e9ny\u00e9be, nem csoda, hogy az ut\u00f3bbi \u00e9vekben igen sokat tesznek a kevesebb heap szemetel\u00e9s \u00e9rdek\u00e9ben. ref return, structok er\u0151ltetett haszn\u00e1lata, stackalloc, Span, stb.<\/p>\n\n\n\n<p>De az eredeti c\u00e9l a .NET 4.8 \u00e9s a .NET 5 k\u00f6z\u00f6tti teljes\u00edtm\u00e9nyk\u00fcl\u00f6nbs\u00e9g vizsg\u00e1lata. Ez\u00e9rt l\u00e1ssuk az el\u0151z\u0151 4 esetet, de most .NET 5 alatt.<\/p>\n\n\n\n<p>GC Server: False, GC LatencyMode: Interactive, .NETCoreApp,Version=v5.0<br>1098ms, GC0: 136, GC1: 50, GC2: 8<br>1287ms, GC0: 210, GC1: 77, GC2: 10<br>1122ms, GC0: 282, GC1: 102, GC2: 11<br>1457ms, GC0: 356, GC1: 129, GC2: 14<br>1188ms, GC0: 429, GC1: 154, GC2: 15<br>1009ms, GC0: 500, GC1: 178, GC2: 15<br>1345ms, GC0: 573, GC1: 203, GC2: 17<br>1321ms, GC0: 647, GC1: 229, GC2: 19<br>1059ms, GC0: 718, GC1: 253, GC2: 19<br>1381ms, GC0: 792, GC1: 287, GC2: 22<br>1154ms, GC0: 863, GC1: 323, GC2: 22<br>1235ms, GC0: 937, GC1: 353, GC2: 24<br>1179ms, GC0: 1008, GC1: 377, GC2: 24<br>1303ms, GC0: 1081, GC1: 403, GC2: 26<br>1419ms, GC0: 1154, GC1: 428, GC2: 27<br>1302ms, GC0: 1227, GC1: 453, GC2: 29<br>1310ms, GC0: 1299, GC1: 478, GC2: 30<br>1067ms, GC0: 1371, GC1: 502, GC2: 30<br>1499ms, GC0: 1445, GC1: 529, GC2: 33<br>1305ms, GC0: 1516, GC1: 553, GC2: 33<br>Min: 1009, Avg: 1260<\/p>\n\n\n\n<p>GC Server: False, GC LatencyMode: Batch, .NETCoreApp,Version=v5.0<br>1536ms, GC0: 11, GC1: 8, GC2: 4<br>1552ms, GC0: 14, GC1: 11, GC2: 5<br>1729ms, GC0: 18, GC1: 15, GC2: 6<br>1293ms, GC0: 22, GC1: 17, GC2: 7<br>1691ms, GC0: 27, GC1: 20, GC2: 8<br>1205ms, GC0: 32, GC1: 22, GC2: 8<br>1368ms, GC0: 36, GC1: 24, GC2: 9<br>1213ms, GC0: 40, GC1: 26, GC2: 10<br>1262ms, GC0: 44, GC1: 29, GC2: 11<br>1226ms, GC0: 48, GC1: 31, GC2: 12<br>1366ms, GC0: 53, GC1: 34, GC2: 13<br>1231ms, GC0: 57, GC1: 36, GC2: 14<br>1373ms, GC0: 62, GC1: 39, GC2: 15<br>1219ms, GC0: 66, GC1: 41, GC2: 16<br>1364ms, GC0: 71, GC1: 44, GC2: 17<br>1243ms, GC0: 75, GC1: 46, GC2: 18<br>1392ms, GC0: 80, GC1: 49, GC2: 19<br>1284ms, GC0: 84, GC1: 51, GC2: 20<br>1379ms, GC0: 89, GC1: 54, GC2: 21<br>1265ms, GC0: 93, GC1: 56, GC2: 22<br>Min: 1205, Avg: 1350<\/p>\n\n\n\n<p>GC Server: True, GC LatencyMode: Interactive, .NETCoreApp,Version=v5.0<br>792ms, GC0: 5, GC1: 3, GC2: 2<br>561ms, GC0: 5, GC1: 3, GC2: 2<br>1003ms, GC0: 6, GC1: 4, GC2: 2<br>563ms, GC0: 6, GC1: 4, GC2: 2<br>558ms, GC0: 6, GC1: 4, GC2: 2<br>907ms, GC0: 7, GC1: 4, GC2: 2<br>555ms, GC0: 7, GC1: 4, GC2: 2<br>550ms, GC0: 7, GC1: 4, GC2: 2<br>1182ms, GC0: 9, GC1: 5, GC2: 3<br>579ms, GC0: 9, GC1: 5, GC2: 3<br>551ms, GC0: 9, GC1: 5, GC2: 3<br>874ms, GC0: 10, GC1: 6, GC2: 4<br>400ms, GC0: 10, GC1: 6, GC2: 4<br>414ms, GC0: 11, GC1: 7, GC2: 5<br>536ms, GC0: 11, GC1: 7, GC2: 5<br>888ms, GC0: 12, GC1: 8, GC2: 5<br>402ms, GC0: 12, GC1: 8, GC2: 5<br>414ms, GC0: 12, GC1: 8, GC2: 5<br>799ms, GC0: 14, GC1: 9, GC2: 6<br>693ms, GC0: 14, GC1: 9, GC2: 6<br>Min: 400, Avg: 654<\/p>\n\n\n\n<p>GC Server: True, GC LatencyMode: Batch, .NETCoreApp,Version=v5.0<br>804ms, GC0: 4, GC1: 2, GC2: 2<br>543ms, GC0: 4, GC1: 2, GC2: 2<br>544ms, GC0: 4, GC1: 2, GC2: 2<br>694ms, GC0: 5, GC1: 3, GC2: 3<br>672ms, GC0: 6, GC1: 4, GC2: 4<br>402ms, GC0: 6, GC1: 4, GC2: 4<br>734ms, GC0: 7, GC1: 5, GC2: 5<br>395ms, GC0: 7, GC1: 5, GC2: 5<br>419ms, GC0: 7, GC1: 5, GC2: 5<br>722ms, GC0: 8, GC1: 6, GC2: 6<br>401ms, GC0: 8, GC1: 6, GC2: 6<br>394ms, GC0: 8, GC1: 6, GC2: 6<br>626ms, GC0: 9, GC1: 7, GC2: 7<br>402ms, GC0: 9, GC1: 7, GC2: 7<br>670ms, GC0: 10, GC1: 8, GC2: 8<br>405ms, GC0: 10, GC1: 8, GC2: 8<br>408ms, GC0: 10, GC1: 8, GC2: 8<br>638ms, GC0: 11, GC1: 9, GC2: 9<br>408ms, GC0: 11, GC1: 9, GC2: 9<br>637ms, GC0: 12, GC1: 10, GC2: 10<br>Min: 394, Avg: 532<\/p>\n\n\n\n<p>Na, az\u00e9rt ezek a sz\u00e1mok m\u00e1r durv\u00e1k! .NET 4.8 alatt a legjobb \u00e1tlag 678ms volt Server: True, LatencyMode: Batch be\u00e1ll\u00edt\u00e1sok mellett.<\/p>\n\n\n\n<p>.NET 5.0 (RC2) alatt GC Server: True, GC LatencyMode: Batch mellett 532 az \u00e1tlag. Ez 21% teljes\u00edtm\u00e9nyn\u00f6veked\u00e9s, egy egyszer\u0171 \u00fajraford\u00edt\u00e1ssal.<\/p>\n\n\n\n<p>\u00c9rdekes, hogy mink\u00e9t esetben a server \u00e9s a batch volt a nyertes.<\/p>\n\n\n\n<p>A minimum is 471-r\u0151l leesett 394-re. Ez is 16%. Mi\u00e9rt fontos nekem a minimum? Mert, ha tudom cs\u00f6kkenteni a felesleges heap allok\u00e1l\u00e1sok sz\u00e1m\u00e1t, akkor az \u00e1tlagot k\u00f6zel  tudom  h\u00fazni ehhez a sz\u00e1mhoz. A teszt alatt gigab\u00e1jtokat szemetelek, lesz mit faragni bel\u0151le.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00dajra neki\u00e1lltam m\u00e9rni. El\u0151z\u0151 alkalommal az\u00e9rt voltak rosszabbak a .NET Core sz\u00e1mai, mert sz\u00e1nd\u00e9kaim ellen\u00e9re els\u0151re nem optimaliz\u00e1lt k\u00f3dot m\u00e9rtem. A r\u00e9gi&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,100,99,4],"tags":[],"class_list":["post-2276","post","type-post","status-publish","format-standard","hentry","category-net","category-net-5","category-net-core","category-szakmai-elet"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=2276"}],"version-history":[{"count":4,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2276\/revisions"}],"predecessor-version":[{"id":2280,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2276\/revisions\/2280"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=2276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=2276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=2276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}