diff options
author | bazeltsev <bazeltsev@ydb.tech> | 2023-02-08 12:55:14 +0300 |
---|---|---|
committer | bazeltsev <bazeltsev@ydb.tech> | 2023-02-08 12:55:14 +0300 |
commit | 276e61af9d8785166ff14771a61e0acd8527b282 (patch) | |
tree | 93ac0b9d119a5c2339b1566efca8d0e59142df61 | |
parent | 66c3b6b4a9837176622fe2f2df4282620f8d72bb (diff) | |
download | ydb-276e61af9d8785166ff14771a61e0acd8527b282.tar.gz |
Added actors examples
updated
-rw-r--r-- | ydb/docs/ru/core/_assets/pdisklogload.drawio | 1 | ||||
-rw-r--r-- | ydb/docs/ru/core/_assets/pdisklogload.svg | 3 | ||||
-rw-r--r-- | ydb/docs/ru/core/_includes/load-actors-params.md | 1 | ||||
-rw-r--r-- | ydb/docs/ru/core/concepts/datamodel/_includes/table.md | 2 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-key-value.md | 2 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-kqp.md | 125 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-memory.md | 46 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-overview.md | 22 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-pdisk-log.md | 80 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-pdisk-read.md | 71 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-pdisk-write.md | 95 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-stop.md | 51 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-storage.md | 172 | ||||
-rw-r--r-- | ydb/docs/ru/core/development/load-actors-vdisk.md | 4 |
14 files changed, 321 insertions, 354 deletions
diff --git a/ydb/docs/ru/core/_assets/pdisklogload.drawio b/ydb/docs/ru/core/_assets/pdisklogload.drawio new file mode 100644 index 0000000000..5c3c75c858 --- /dev/null +++ b/ydb/docs/ru/core/_assets/pdisklogload.drawio @@ -0,0 +1 @@ +<mxfile host="Electron" modified="2023-02-02T08:58:52.149Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.10 Chrome/106.0.5249.199 Electron/21.3.5 Safari/537.36" etag="LAALob26ouHMXcQx7Ymz" version="20.8.10" type="device"><diagram name="Страница 1" id="1oKlUCA-fBf30r2XWTPk">7VttU6s4FP41/ShDXnj7eFt1r7vrrDu94/24gyW2GSnphlRbf/2GltcktYw2vW4tOgqHEOB5OCfPOYEBGs1Xv/F4MbtlCUkH0E1WA3Q5gBAACAfFr5ust5YgQlvDlNOkbNQYxvSVlEa3tC5pQvJOQ8FYKuiia5ywLCMT0bHFnLOXbrNHlnbPuoinRDOMJ3GqW3/SRMy21hAGjf07odNZdWbgR9s987hqXN5JPosT9tIyoasBGnHGxHZtvhqRtACvwmV73PWOvfWFcZKJPge8us9/3f97M/4x+vb7H6PFLb15jS7KXp7jdFnecHmxYl0hwNkyS0jRiTtAw5cZFWS8iCfF3hfJubTNxDyVW0CuPtI0HbGUcbmdsUw2GuaCsyeiGMvTEi7Iauf9gBol+XgRNieCr2WT8oAK13V386VhKfBK26zFEI5KY1w+GdO65wY8uVLiZ8aSL/5eTa/T+f3t+J9klK+GYEitYjmAyB+FV8PrGjsNKAOcO7HzVPCw6/hQAxAb8IO24ENHgq/7PMo97mYpjxiXZ4uXgh0Ga4x7YR0eE+squr4FtoxXi2J1suTpesjjyRMR+1FvKNpwkNLF93I9jR9IesdyKijLpI1v73NYIEllwP1T2T+nSVJcyzBO6bQwpOSx3f5baa7bGWIPZyIuu7uI3APxGXT5BKGRT2jgMwidwLNFKdQoLUbTm0wQLm0D6KcFeg9crk2LtftLmj8BjXaJguhSagzgBrArniakOOdbTJmeoa5vH4InrxdPvoEnZM3v/P1+R7LkWyFcGmCTOJ/VLtUiprDfxUKCnW0s0EU1XZVYgZpP7oSWJB0ppAPbQs00slY2TlLpdM9dAWWCsjzDHaPySpqxSeFNi4I5W/IJKY9qCx61I7SnIxHzKRFaRxtm69v+ANnBOci+23kjxXmBLu9MERbYGzJDjc3hkudik7JA9+SjKfa6hCDXqVK5Fic1T0cJp7CH5D572K4UIHI8rARIx/f6uVkUOCG0xaquZDae9nWljAe60TDUg+FRZQzsIWPOfreDS0XeXHiu47YXgHu5YJ2cH57dHrrlq4tUX00CvcgJu530lam+mqfoXVkWqlCXNmPBeDwll0u+dYAvIHAi6ISg5Yd+hxUUOVHU9lJd+iDsoOCYUTja76cfqZglMQkfJ29WzA4RD30lS/sE5bGKsv9DKdfvV148binXcik8hEPk+4fBD6ilcP8T4KcrYDv4WfVs9cE0A3tcx7Y8yfDoFT+FnWWiZd8utgEHaig1I35kyL39kJ9YrnCoVCHoR+eRJxqQnvz1mGjQST8Z5ajWqyO9hmLKzj2bHJ1TuL0pHNB4e3cKB9SZBr0ryykc0lO4c5Tt576Ryl3vKGtvsgH3SEDOdBrpRKCZmFjXPJnmKkyU1tno4SnVc6I+Ve0THjcLT1OYwuDXz9HjHsnX2ffMvocjJ+i6nnma0OR6vrWCNu6R9X11NeTjwAlB1CwdGgtiQ9Qqf+L3CSUffuQsljUUxtpjsqMMftJBGToe1DmoArRvnvY/du0b61UF7W2ME2ZJeRkDeVEN/y97GcProVk/S9HXdz9fbdKzXDRPPBIm2HrRt1/VF5gknT1ov56kO9j7Cmp+3P9tZ6tVSE/XdJexiKVFzOJCcdBc/nkgNJvK/wlJiZA0neyAAJUK1I6XnYFpGsveiKALqp1ul0uiUlJK8D6RTflQ4+2vOkz2zddhlWB3HTfAjSwNYYSrJuU3abIFAqEUsNhzo9BFETjQWKQGTM+cAh93LNLrxz/onKRUPvtwpJcqHtaC5KfrXb5aI7RappCbzVeB2+Sm+bYSXf0H</diagram></mxfile>
\ No newline at end of file diff --git a/ydb/docs/ru/core/_assets/pdisklogload.svg b/ydb/docs/ru/core/_assets/pdisklogload.svg new file mode 100644 index 0000000000..e0eae54ecc --- /dev/null +++ b/ydb/docs/ru/core/_assets/pdisklogload.svg @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="751px" height="491px" viewBox="-0.5 -0.5 751 491" style="background-color: rgb(255, 255, 255);"><defs/><g><rect x="0" y="0" width="750" height="490" fill="none" stroke="none" pointer-events="all"/><rect x="500" y="220.62" width="40" height="20" fill="#6c8ebf" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="420" y="220.62" width="80" height="20" fill="#6c8ebf" stroke="#000000" pointer-events="all"/><path d="M 470 160.62 L 465 160.62 Q 460 160.62 460 170.62 L 460 190 Q 460 200 455 200 L 452.5 200 Q 450 200 455 200 L 457.5 200 Q 460 200 460 210 L 460 229.37 Q 460 239.37 465 239.37 L 470 239.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(460,0)scale(-1,1)translate(-460,0)rotate(90,460,200)" pointer-events="all"/><rect x="430" y="160.62" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 176px; margin-left: 431px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SizeInterval<br />VDisk1</div></div></div></foreignObject><text x="460" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SizeInterv...</text></switch></g><path d="M 530 200 L 510 200" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 490 90 L 485 90 Q 480 90 480 100 L 480 140 Q 480 150 475 150 L 472.5 150 Q 470 150 475 150 L 477.5 150 Q 480 150 480 160 L 480 200 Q 480 210 485 210 L 490 210" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(480,0)scale(-1,1)translate(-480,0)rotate(90,480,150)" pointer-events="all"/><rect x="425" y="110.93" width="110" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 126px; margin-left: 426px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BurstSize VDisk1</div></div></div></foreignObject><text x="480" y="130" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BurstSize VDisk1</text></switch></g><path d="M 529.54 2.65 L 524.54 2.65 Q 519.54 2.65 519.54 12.65 L 519.54 91.56 Q 519.54 101.56 514.54 101.56 L 512.04 101.56 Q 509.54 101.56 514.54 101.56 L 517.04 101.56 Q 519.54 101.56 519.54 111.56 L 519.54 190.47 Q 519.54 200.47 524.54 200.47 L 529.54 200.47" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(519.54,0)scale(-1,1)translate(-519.54,0)rotate(90,519.54,101.56)" pointer-events="all"/><rect x="490" y="60" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 491px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BurstInterval<br />VDisk1</div></div></div></foreignObject><text x="520" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BurstInter...</text></switch></g><path d="M 550 -70 L 545 -70 Q 540 -70 540 -60 L 540 40 Q 540 50 535 50 L 532.5 50 Q 530 50 535 50 L 537.5 50 Q 540 50 540 60 L 540 160 Q 540 170 545 170 L 550 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(540,0)scale(-1,1)translate(-540,0)rotate(90,540,50)" pointer-events="all"/><path d="M 650 139.8 L 630 139.8" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><rect x="472.81" y="19.99" width="134.37" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 132px; height: 1px; padding-top: 35px; margin-left: 474px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">StorageDuration VDisk1</div></div></div></foreignObject><text x="540" y="39" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">StorageDuration VDisk1</text></switch></g><rect x="540" y="220.62" width="80" height="20" fill="#dae8fc" stroke="#000000" pointer-events="all"/><rect x="620" y="220.62" width="40" height="20" fill="#6c8ebf" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="100" y="240.62" width="40" height="20" fill="#82b366" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="20" y="240.62" width="80" height="20" fill="#82b366" stroke="#000000" pointer-events="all"/><rect x="140" y="240.62" width="280" height="20" fill="#f5f5f5" stroke="#000000" pointer-events="all"/><path d="M 70 240.62 L 65 240.62 Q 60 240.62 60 250.62 L 60 269.99 Q 60 279.99 55 279.99 L 52.5 279.99 Q 50 279.99 55 279.99 L 57.5 279.99 Q 60 279.99 60 289.99 L 60 309.37 Q 60 319.37 65 319.37 L 70 319.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(60,0)scale(-1,1)translate(-60,0)rotate(-90,60,279.99)" pointer-events="all"/><rect x="30" y="275" width="60" height="58.75" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 304px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SizeInterval<br />VDisk2</div></div></div></foreignObject><text x="60" y="308" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SizeInterv...</text></switch></g><path d="M 130 279.8 L 110 279.8" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 90 270.62 L 85 270.62 Q 80 270.62 80 280.62 L 80 320.62 Q 80 330.62 75 330.62 L 72.5 330.62 Q 70 330.62 75 330.62 L 77.5 330.62 Q 80 330.62 80 340.62 L 80 380.62 Q 80 390.62 85 390.62 L 90 390.62" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(80,0)scale(-1,1)translate(-80,0)rotate(-90,80,330.62)" pointer-events="all"/><path d="M 310.93 100.93 L 305.93 100.93 Q 300.93 100.93 300.93 110.93 L 300.93 370.93 Q 300.93 380.93 295.93 380.93 L 293.43 380.93 Q 290.93 380.93 295.93 380.93 L 298.43 380.93 Q 300.93 380.93 300.93 390.93 L 300.93 650.93 Q 300.93 660.93 305.93 660.93 L 310.93 660.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(300.93,0)scale(-1,1)translate(-300.93,0)rotate(-90,300.93,380.93)" pointer-events="all"/><rect x="270.93" y="390.62" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 406px; margin-left: 272px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BurstInterval<br />VDisk2</div></div></div></foreignObject><text x="301" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BurstInter...</text></switch></g><path d="M 349.7 110.93 L 344.7 110.93 Q 339.7 110.93 339.7 120.93 L 339.7 420.93 Q 339.7 430.93 334.7 430.93 L 332.2 430.93 Q 329.7 430.93 334.7 430.93 L 337.2 430.93 Q 339.7 430.93 339.7 440.93 L 339.7 740.93 Q 339.7 750.93 344.7 750.93 L 349.7 750.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(339.7,0)scale(-1,1)translate(-339.7,0)rotate(-90,339.7,430.93)" pointer-events="all"/><path d="M 627.82 329.83 L 607.82 329.83" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><rect x="272.52" y="440.93" width="134.37" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 132px; height: 1px; padding-top: 456px; margin-left: 274px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">StorageDuration VDisk2</div></div></div></foreignObject><text x="340" y="460" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">StorageDuration VDisk2</text></switch></g><rect x="25" y="339.37" width="110" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 354px; margin-left: 26px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BurstSize VDisk2</div></div></div></foreignObject><text x="80" y="358" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">BurstSize VDisk2</text></switch></g><rect x="580" y="240.62" width="80" height="20" fill="#82b366" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="420" y="240.62" width="160" height="20" fill="#d5e8d4" stroke="#000000" pointer-events="all"/><path d="M 290 60.62 L 285 60.62 Q 280 60.62 280 70.62 L 280 190 Q 280 200 275 200 L 272.5 200 Q 270 200 275 200 L 277.5 200 Q 280 200 280 210 L 280 329.37 Q 280 339.37 285 339.37 L 290 339.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(280,0)scale(-1,1)translate(-280,0)rotate(90,280,200)" pointer-events="all"/><rect x="210" y="160.62" width="140" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 176px; margin-left: 211px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data that is being deleted</div></div></div></foreignObject><text x="280" y="179" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data that is being dele...</text></switch></g><path d="M 20 239.87 L 678.33 239.87 L 678.33 230.62 L 700 240.62 L 678.33 250.62 L 678.33 241.37 L 20 241.37 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="670" y="190.62" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 206px; margin-left: 671px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Timeline,<br />bytes</div></div></div></foreignObject><text x="700" y="209" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Timeline,...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/ydb/docs/ru/core/_includes/load-actors-params.md b/ydb/docs/ru/core/_includes/load-actors-params.md new file mode 100644 index 0000000000..063b28fae1 --- /dev/null +++ b/ydb/docs/ru/core/_includes/load-actors-params.md @@ -0,0 +1 @@ +Ниже описаны основные параметры актора. Полный список параметров смотрите в файле [load_test.proto](https://github.com/ydb-platform/ydb/blob/main/ydb/core/protos/load_test.proto) Git-репозитория {{ ydb-short-name }}. diff --git a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md index 4e3dd5fce3..b30d966294 100644 --- a/ydb/docs/ru/core/concepts/datamodel/_includes/table.md +++ b/ydb/docs/ru/core/concepts/datamodel/_includes/table.md @@ -26,7 +26,7 @@ В схеме данных определяются следующие параметры партиционирования таблицы: -#### AUTO_PARTITIONING_BY_SIZE +#### AUTO_PARTITIONING_BY_SIZE {#auto-part-by-load} * Тип: `Enum` (`ENABLED`, `DISABLED`). * Значение по умолчанию: `ENABLED`. diff --git a/ydb/docs/ru/core/development/load-actors-key-value.md b/ydb/docs/ru/core/development/load-actors-key-value.md index f5fa939cc7..925c36340d 100644 --- a/ydb/docs/ru/core/development/load-actors-key-value.md +++ b/ydb/docs/ru/core/development/load-actors-key-value.md @@ -4,7 +4,7 @@ {% include notitle [addition](../_includes/addition.md) %} -## Спецификация актора {#proto} +## Конфигурация актора {#options} ```proto message TKeyValueLoad { diff --git a/ydb/docs/ru/core/development/load-actors-kqp.md b/ydb/docs/ru/core/development/load-actors-kqp.md index e89db74350..e9e12b673b 100644 --- a/ydb/docs/ru/core/development/load-actors-kqp.md +++ b/ydb/docs/ru/core/development/load-actors-kqp.md @@ -1,110 +1,49 @@ # KqpLoad -Подает нагрузку на слой Query Processor и нагружает все компоненты кластера {{ ydb-short-name }}. Нагрузка, которую генерирует актор, аналогична нагрузке от подкоманды [workload](../reference/ydb-cli/commands/workload/index.md) {{ ydb-short-name }} CLI, но запускается изнутри кластера. Позволяет запускать два типа нагрузки: +Тестирует производительности кластера {{ ydb-short-name }} в целом, нагружая все компоненты через слой Query Processor. Нагрузка, аналогична нагрузке от подкоманды [workload](../reference/ydb-cli/commands/workload/index.md) {{ ydb-short-name }} CLI, но запускается изнутри кластера. + +Вы можете запустить два вида нагрузки: * **Stock** — симулирует работу склада интернет-магазина: создает заказы из нескольких товаров, получает список заказов по клиенту. * **Key-value** — использует БД как key-value хранилище. -Результатом теста является количество успешных транзакций в секунду, количество повторных попыток исполнения транзакций и количество ошибок. - -{% include notitle [addition](../_includes/addition.md) %} - -## Спецификация актора {#proto} - -```proto -message TKqpLoad { - message TStockWorkload { - optional uint64 ProductCount = 1 [default = 100]; - optional uint64 Quantity = 2 [default = 1000]; - optional uint64 OrderCount = 3 [default = 100]; - optional uint64 Limit = 4 [default = 10]; - optional bool PartitionsByLoad = 5 [default = true]; - } - message TKvWorkload { - optional uint64 InitRowCount = 1 [default = 1000]; - optional bool PartitionsByLoad = 2 [default = true]; - optional uint64 MaxFirstKey = 3 [default = 18446744073709551615]; - optional uint64 StringLen = 4 [default = 8]; - optional uint64 ColumnsCnt = 5 [default = 2]; - optional uint64 RowsCnt = 6 [default = 1]; - } - optional uint64 Tag = 1; - optional uint32 DurationSeconds = 2; - optional uint32 WindowDuration = 3; - optional string WorkingDir = 4; - optional uint32 NumOfSessions = 5; - optional bool IncreaseSessions = 11; - optional bool DeleteTableOnFinish = 6; - optional uint32 UniformPartitionsCount = 7; - optional uint32 WorkloadType = 8; - oneof Workload { - TStockWorkload Stock = 9; - TKvWorkload Kv = 10; - } -} -``` +Перед началом работы создаются необходимые таблицы, после завершения они удаляются. ## Параметры актора {#options} -Параметр | Описание ---- | --- -`TStockWorkload[]` | [Параметры нагрузки stock](#stock-workload). -`TKvWorkload[]` | [Параметры нагрузки key-value](#kv-workload). -`Tag` | Тег нагрузки. Если не задан, то тег будет присвоен автоматически.<br>Тип: `uint64`.<br>Необязательный. -`DurationSeconds` | Длительность теста в секундах.<br>Тип: `uint32`.<br>Обязательный. -`WindowDuration` | Размер окна для агрегации статистики.<br>Тип: `uint32`.<br>Обязательный. -`WorkingDir` | Путь директории, в которой будут созданы тестовые таблицы.<br>Тип: `string`.<br>Обязательный. -`NumOfSessions` | Количество параллельных потоков, подающих нагрузку. Каждый поток пишет в свою сессию.<br>Тип: `uint32`.<br>Обязательный. -`DeleteTableOnFinish` | Удалять ли таблицы после завершения работы нагрузки. Например, Оставлять таблицы может быть полезно в сценарии долгого предварительного создания большой таблицы и последующими (читающими) тестами.<br>Тип: `bool`.<br>Обязательный. -`UniformPartitionsCount` | Количество партиций, создаваемых в тестовых таблицах.<br>Тип: `uint32`.<br>Обязательный. -`WorkloadType` | Позволяет выбрать тип нагрузки.<br>Key-Value:<ul><li>`0` — UpsertRandom;</li><li>`1` — InsertRandom;</li><li>`2` — SelectRandom.</li></ul>Stok:<ul><li>`0` — InsertRandomOrder;</li><li>`1` — SubmitRandomOrder;</li><li>`2` — SubmitSameOrder;</li><li>`3` — GetRandomCustomerHistory;</li><li>`4` — GetCustomerHistory.</li></ul>Тип: `uint32`.<br>Обязательный. -`Workload` | Одно из значений:<ul><li>`TStockWorkload Stock` — тип нагрузки Stock;</li><li>`TKvWorkload Kv` — тип нагрузки key-value.</li></ul> - -### TStockWorkload {#stock-workload} - -Параметр | Описание ---- | --- -`ProductCount` | Количество видов товаров.<br>Тип: `uint64`.<br>Значение по умолчанию: `100`.<br>Необязательный. -`Quantity` | Количество товаров каждого вида на складе.<br>Тип: `uint64`.<br>Значение по умолчанию: `1000`.<br>Необязательный. -`OrderCount` | Первоначальное количество заказов в БД.<br>Тип: `uint64`.<br>Значение по умолчанию: `100`.<br>Необязательный. -`Limit` | Минимальное количество шардов для таблиц.<br>Тип: `uint64`.<br>Значение по умолчанию: `10`.<br>Необязательный. -`PartitionsByLoad` | Включение/выключение автошардирования.<br>Тип: `bool`.<br>Значение по умолчанию: `true`.<br>Необязательный. - -### TKvWorkload {#kv-workload} +{% include [load-actors-params](../_includes/load-actors-params.md) %} Параметр | Описание --- | --- -`InitRowCount` | До начала нагрузки нагружающий актор запишет в таблицу указанное количество строк.<br>Тип: `uint64`.<br>Значение по умолчанию: — `1000`.<br>Необязательный. -`PartitionsByLoad` | Добавлять ли к тестовой таблице аттрибут `AUTO_PARTITIONING_BY_LOAD`.<br>Тип: `bool`.<br>Значение по умолчанию: — `true`.<br>Необязательный. -`MaxFirstKey` | Ограничивает диапазон значений ключа. Создан для того, чтобы при читающей нагрузке случайные ключи попадал в диапазон ключей таблицы.<br>Тип: `uint64`.<br>Значение по умолчанию: — `18446744073709551615`.<br>Необязательный. -`StringLen` | Длина строки `value`.<br>Тип: `uint64`.<br>Значение по умолчанию: — `8`.<br>Необязательный. -`ColumnsCnt` | Сколько столбцов использовать в таблице.<br>Тип: `uint64`.<br>Значение по умолчанию: — `2` (столбцы для key и value).<br>Необязательный. -`RowsCnt` | Сколько строк вставлять/читать в одном SQL запросе<br>Тип: `uint64`.<br>Значение по умолчанию: — `1`.<br>Необязательный. +`DurationSeconds` | Продолжительность нагрузки в секундах. +`WindowDuration` | Размер окна для агрегации статистики. +`WorkingDir` | Путь директории, в которой будут созданы тестовые таблицы. +`NumOfSessions` | Количество параллельных потоков, подающих нагрузку. Каждый поток пишет в свою сессию. +`DeleteTableOnFinish` | Если `False`, то созданные таблицы не удаляются после завершения работы нагрузки. Может быть полезно в случае, когда при первом запуске актора создается большая таблица, а при последующих выполняются запросы к ней. +`UniformPartitionsCount` | Количество партиций, создаваемых в тестовых таблицах. +`WorkloadType` | Тип нагрузки.<br>В случае Stoсk:<ul><li>`0` — InsertRandomOrder;</li><li>`1` — SubmitRandomOrder;</li><li>`2` — SubmitSameOrder;</li><li>`3` — GetRandomCustomerHistory;</li><li>`4` — GetCustomerHistory.</li></ul>В случае Key-Value:<ul><li>`0` — UpsertRandom;</li><li>`1` — InsertRandom;</li><li>`2` — SelectRandom.</li></ul> +`Workload` | Вид нагрузки.<br>`Stock`:<ul><li>`ProductCount` — количество видов товаров.</li><li>`Quantity` — количество товаров каждого вида на складе.</li><li>`OrderCount` — первоначальное количество заказов в БД.</li><li>`Limit` — минимальное количество шардов для таблиц.</li></ul>`Kv`:<ul><li>`InitRowCount` — до начала нагрузки нагружающий актор запишет в таблицу указанное количество строк.</li><li>`StringLen` — длина строки `value`.</li><li>`ColumnsCnt` — сколько столбцов использовать в таблице.</li><li>`RowsCnt` — сколько строк вставлять или читать в одном SQL запросе.</li></ul> ## Примеры {#example} -Ниже приведена спецификация актора, который запускает stock-нагрузку БД `/slice/db`, выполняя простые UPSERT-запросы в 64 потока в течение 30 секунд. Перед началом работы создаются необходимые таблицы, после завершения они удаляются. - -{% list tabs %} +Следующий актор запускает stock-нагрузку БД `/slice/db`, выполняя простые UPSERT-запросы в `64` потока в течение `30` секунд. -- Embedded UI - - ```proto - KqpLoad: { - DurationSeconds: 30 - WindowDuration: 1 - WorkingDir: "/slice/db" - NumOfSessions: 64 - UniformPartitionsCount: 1000 - DeleteTableOnFinish: 1 - WorkloadType: 0 - Stock: { - ProductCount: 100 - Quantity: 1000 - OrderCount: 100 - Limit: 10 - } - } - ``` +```proto +KqpLoad: { + DurationSeconds: 30 + WindowDuration: 1 + WorkingDir: "/slice/db" + NumOfSessions: 64 + UniformPartitionsCount: 1000 + DeleteTableOnFinish: 1 + WorkloadType: 0 + Stock: { + ProductCount: 100 + Quantity: 1000 + OrderCount: 100 + Limit: 10 + } +} +``` -{% endlist %} +Результатом теста является количество успешных транзакций в секунду, количество повторных попыток исполнения транзакций и количество ошибок. diff --git a/ydb/docs/ru/core/development/load-actors-memory.md b/ydb/docs/ru/core/development/load-actors-memory.md index f6c559c5dc..81b1f0bd66 100644 --- a/ydb/docs/ru/core/development/load-actors-memory.md +++ b/ydb/docs/ru/core/development/load-actors-memory.md @@ -1,43 +1,29 @@ # MemoryLoad -Тестирует производительность аллокаторов памяти. Аллоцирует блоки памяти указанного размера через заданные промежутки времени. +Аллоцирует блоки памяти указанного размера через заданные промежутки времени. После снятия нагрузки аллоцированная память освобождается. С помощью этого актора вы можете протестировать работу логики, например срабатывание некоторого триггера при достижении лимита по [RSS]{% if lang == "en" %}(https://en.wikipedia.org/wiki/Resident_set_size){% endif %}{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Resident_set_size){% endif %}. -{% include notitle [addition](../_includes/addition.md) %} +{% note info %} -## Спецификация актора {#proto} +Это узкоспециализированный актор для тестирования конкретной функциональности. Не является нагружающим, его назначение — проверка корректности работы. + +{% endnote %} -```proto -message TMemoryLoad { - optional uint64 Tag = 1; - optional uint32 DurationSeconds = 2; - optional uint64 BlockSize = 3; - optional uint64 IntervalUs = 4; -} -``` -<!-- ## Параметры актора {#options} Параметр | Описание --- | --- -`Tag` | Тип: `uint64`. -`DurationSeconds` | Тип: `uint32`. -`BlockSize` | Тип: `uint64`. -`IntervalUs` | Тип: `uint64`. ---> +`DurationSeconds` | Продолжительность нагрузки в секундах. +`BlockSize` | Размер аллоцируемого блока в байтах. +`IntervalUs` | Интервал времени между аллоцированиями блоков в микросекундах. ## Примеры {#examples} -{% list tabs %} - -- CLI +Следующий актор аллоцирует блоки по `1048576` байт каждые `9000000` микросекунд в течение `3600` секунд и за время работы займет 32 ГБ: - ```proto - NodeId: 1 - Event: { MemoryLoad: { - DurationSeconds: 120 - BlockSize: 4096 - IntervalUs: 1000 - }} - ``` - -{% endlist %} +```proto +MemoryLoad: { + DurationSeconds: 3600 + BlockSize: 1048576 + IntervalUs: 9000000 +} +``` diff --git a/ydb/docs/ru/core/development/load-actors-overview.md b/ydb/docs/ru/core/development/load-actors-overview.md index 4fe68b9964..197fd9c1b7 100644 --- a/ydb/docs/ru/core/development/load-actors-overview.md +++ b/ydb/docs/ru/core/development/load-actors-overview.md @@ -17,6 +17,8 @@ Например, вы можете подать [нагрузку на Distributed Storage](load-actors-storage.md) без задействования слоев таблеток и Query Processor. Таким образом можно изолированно тестировать отдельные слои системы и эффективно находить узкие места. Комбинация акторов разных типов позволяет запускать множество видов нагрузки. +{% include [release-candidate](../_includes/trunk.md) %} + ## Типы акторов {#load-actor-type} Тип | Описание @@ -28,24 +30,24 @@ [PDiskWriteLoad](load-actors-pdisk-write.md) | Тестирует производительность записи на PDisk. [PDiskReadLoad](load-actors-pdisk-read.md) | Тестирует производительность чтения с PDisk. [PDiskLogLoad](load-actors-pdisk-log.md) | Тестирует корректность вырезания из середины лога PDisk. -[MemoryLoad](load-actors-memory.md) | Тестирует производительность аллокаторов памяти. -[Stop](load-actors-stop.md) | С помощью этого актора можно остановить все акторы, либо только указанные. +[MemoryLoad](load-actors-memory.md) | Аллоцирует память, полезен при тестировании логики. +[Stop](load-actors-stop.md) | Останавливает все акторы, либо только указанные. ## Запуск нагрузки {load-actor-start} -Вы можете запустить нагрузку следующими способами: +Запустить нагрузку можно с помощью следующих инструментов: -* Embedded UI кластера — позволяет создать по спецификации и запустить нагружающий актор либо на текущем узле, либо сразу на всех узлах тенанта. -* Утилита `ydbd` — позволяет на любой узел кластера отправить спецификацию актора с указанием, на каких узлах необходимо создать и запустить актор. +* Embedded UI кластера — позволяет создать по конфигурации и запустить нагружающий актор либо на текущем узле, либо сразу на всех узлах тенанта. +* Утилита `ydbd` — позволяет на любой узел кластера отправить конфигурацию актора с указанием, на каких узлах необходимо создать и запустить актор. -В качестве примера рассмотрим создание и запуск актора KqpLoad. Актор обращается к БД `/slice/db` как к key-value хранилищу в 64 потока, длительность нагрузки — 30 секунд. Перед началом работы актор создает необходимые таблицы, после окончания удаляет их. При создании актору будет присвоен автоматически сгенерированный тег. Этот же тег будет присвоен и результату теста. +В качестве примера рассмотрим создание и запуск актора KqpLoad. Актор обращается к БД `/slice/db` как к key-value хранилищу в 64 потока, длительность нагрузки — 30 секунд. Перед началом работы актор создает необходимые таблицы, после окончания удаляет их. При создании актору будет автоматически присвоен тег. Этот же тег будет присвоен и результату теста. {% list tabs %} - Embedded UI 1. Откройте страницу управления нагружающими акторами на узле (например, `http://<address>:8765/actors/load`, где `address` — адрес узла кластера, на котором нужно запустить нагрузку). - 1. В поле ввода/вывода вставьте спецификацию актора: + 1. В поле ввода/вывода вставьте конфигурацию актора: ```proto KqpLoad: { @@ -82,7 +84,7 @@ - CLI - 1. Создайте файл со спецификацией актора: + 1. Создайте файл с конфигурацией актора: ```proto NodeId: 1 @@ -118,7 +120,7 @@ ... ``` - * `Event` — спецификация актора. + * `Event` — конфигурация актора. 1. Запустите актор: @@ -127,7 +129,7 @@ ``` * `endpoint` — grpc-эндпоит узла (например, `grpc://<address>:<port>`, где `address` — адрес узла, `port` — grpc-порт узла). - * `proto_file` — путь к файлу со спецификацией актора. + * `proto_file` — путь к файлу с конфигурацией актора. {% endlist %} diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-log.md b/ydb/docs/ru/core/development/load-actors-pdisk-log.md index 0fcc5c33e5..a2af5e2547 100644 --- a/ydb/docs/ru/core/development/load-actors-pdisk-log.md +++ b/ydb/docs/ru/core/development/load-actors-pdisk-log.md @@ -1,34 +1,66 @@ # PDiskLogLoad -Тестирует вырезание из середины лога PDisk. Не является нагружающим, в первую очередь направлен на тестирование корректности. +Все VDisk, размещенные на некотором PDisk, пишут данные о своей работе в общий лог PDisk. VDisk постепенно удаляют свои устаревшие данные в начале лога для освобождения места на диске. В некоторых случаях между окончанием записи одного VDisk и началом записи другого может образоваться участок, содержащий ненужные устаревшие данные. Такие данные автоматически удаляются. Корректность этой операции тестирует актор PDiskLogLoad. -{% include notitle [addition](../_includes/addition.md) %} +<center> -## Спецификация актора {#proto} +![load-actors](../_assets/pdisklogload.svg) -```proto -message TPDiskLogLoad { - message TWorkerConfig { - optional NKikimrBlobStorage.TVDiskID VDiskId = 1; - optional uint32 MaxInFlight = 2; - - // Measurement units of all parameters is bytes - optional uint32 SizeIntervalMin = 3; - optional uint32 SizeIntervalMax = 4; - optional uint64 BurstInterval = 5; - optional uint64 BurstSize = 6; - optional uint64 StorageDuration = 7; - - optional uint64 MaxTotalBytesWritten = 8; - } +</center> + +{% note info %} + +Это узкоспециализированный актор для тестирования конкретной функциональности. Не является нагружающим, его назначение — проверка корректности работы. + +{% endnote %} + +## Параметры актора {#options} - optional uint64 Tag = 1; - optional uint32 PDiskId = 2; - optional uint64 PDiskGuid = 3; +{% include [load-actors-params](../_includes/load-actors-params.md) %} - optional uint32 DurationSeconds = 5; - repeated TWorkerConfig Workers = 7; +Параметр | Описание +--- | --- +`PDiskId` | Идентификатор нагружаемого PDisk на узле. +`PDiskGuid` | Глобально-уникальный идентификатор нагружаемого PDisk. +`VDiskId` | Параметры VDisk, от имени которого подается нагрузка.<ul><li>`GroupID` — идентификатор группы.</li><li>`GroupGeneration` — поколение группы.</li><li>`Ring` — идентификатор кольца в группе.</li><li>`Domain` — идентификатор фэйл-домена в кольце.</li><li>`VDisk` — индекс VDisk в фэйл-домене.</li></ul> +`MaxInFlight` | Количество одновременно обрабатываемых запросов. +`SizeIntervalMin` | Минимальный размер записи в лог в байтах. +`SizeIntervalMax` | Максимальный размер записи в лог в байтах. +`BurstInterval` | Интервал между сеансами записи в лог в байтах. +`BurstSize` | Общее количество данных, которое будет записано в одном сеансе, в байтах. +`StorageDuration` | Виртуальное время в байтах. Показывает, как долго VDisk должен хранить свои данные в логе. +`IsWardenlessTest` | Если PDiskReadLoad запускается на кластере, укажите `false`. Иначе (например, при запуске в юнит-тестах) укажите `true`. - optional bool IsWardenlessTest = 8 [default = false]; +## Примеры {#example} + +Следующий актор имитирует работу двух VDisk. Первый VDisk через каждые `65536` байт записывает в лог сообщение размером `65536` байт, удаляет данные свыше `1048576` байт. Второй через каждые `2147483647` байт записывает `1024` байт сообщениями по `128` байт, удаляет данные свыше `2147483647` байт. + +```proto +PDiskLogLoad: { + Tag: 1 + PDiskId: 1 + PDiskGuid: 12345 + DurationSeconds: 60 + Workers: { + VDiskId: {GroupID: 1 GroupGeneration: 5 Ring: 1 Domain: 1 VDisk: 1} + MaxInFlight: 1 + SizeIntervalMin: 65536 + SizeIntervalMax: 65536 + BurstInterval: 65536 + BurstSize: 65536 + StorageDuration: 1048576 + } + Workers: { + VDiskId: {GroupID: 2 GroupGeneration: 5 Ring: 1 Domain: 1 VDisk: 1} + MaxInFlight: 1 + SizeIntervalMin: 128 + SizeIntervalMax: 128 + BurstInterval: 2147483647 + BurstSize: 1024 + StorageDuration: 2147483647 + } + IsWardenlessTest: false } ``` + +Тест завершился успешно, если в течение проверки все узлы кластера работали без перезагрузок и тестируемый PDisk имел состояние `Normal`. Убедиться в этом можно c помощью Embedded UI кластера. diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-read.md b/ydb/docs/ru/core/development/load-actors-pdisk-read.md index a7bfb6467a..849859dd46 100644 --- a/ydb/docs/ru/core/development/load-actors-pdisk-read.md +++ b/ydb/docs/ru/core/development/load-actors-pdisk-read.md @@ -1,29 +1,60 @@ # PDiskReadLoad -Подает на PDisk нагрузку read-only. Имитирует VDisk. Актор создает на указанном PDisk чанки, записывает в них случайные данные и выполняет чтение из них с указанными параметрами. Результатом теста является производительность чтения в байтах в секунду. +Тестирует производительность чтения с PDisk. Нагрузка подается от имени VDisk. Актор создает на указанном PDisk чанки, записывает в них случайные данные и выполняет чтение из них с указанными параметрами. После снятия нагрузки записанные актором данные удаляются. -{% include notitle [addition](../_includes/addition.md) %} +Вы можете подать нагрузку двух видов: -## Спецификация актора {#proto} +* _Постоянная_ — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, `IntervalMsMin: 0`, `IntervalMsMax: 0`) и отличный от нуля `InFlightReads`. +* _Интервальная_ — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, `IntervalMsMin: 10`, `IntervalMsMax: 100`). Максимальное количество одновременно выполняемых запросов задается параметром `InFlightReads`. Если его значение равно `0`, то ограничения нет. + +## Параметры актора {#options} + +{% include [load-actors-params](../_includes/load-actors-params.md) %} + +Параметр | Описание +--- | --- +`PDiskId` | Идентификатор нагружаемого PDisk на узле. +`PDiskGuid` | Глобально-уникальный идентификатор нагружаемого PDisk. +`VDiskId` | Нагрузка подается от имени VDisk со следующими реквизитами:<ul><li>`GroupID` — идентификатор группы.</li><li>`GroupGeneration` — поколение группы.</li><li>`Ring` — идентификатор кольца в группе.</li><li>`Domain` — идентификатор фэйл-домена в кольце.</li><li>`VDisk` — индекс VDisk в фэйл-домене.</li></ul> +`Chunks` | Параметры чанка.<br>`Slots` — количество слотов в чанке, определяет размер записи.<br>Вы можете указать несколько `Chunks`, и тогда выбор конкретного чанка для чтения будет определяться его `Weight`. +`DurationSeconds` | Продолжительность нагрузки в секундах. +`IntervalMsMin`,<br>`IntervalMsMax` | Минимальный и максимальный промежутки времени между запросами при интервальной нагрузке в миллисекундах. Значение промежутка выбирается случайно из указанного диапазона. +`InFlightReads` | Количество одновременно обрабатываемых запросов на чтение. +`Sequential` | Тип чтения.<ul><li>`True` — последовательное.</li><li>`False` — случайное.</li></ul> +`IsWardenlessTest` | Если PDiskReadLoad запускается на кластере, укажите `False`. Иначе (например, при запуске в юнит-тестах) укажите `True`. + +## Примеры {#examples} + +Следующий актор читает данные блоками по `32` МБ, в течение `120` секунд, одновременно выполняются `64` запроса (постоянная нагрузка): ```proto -message TPDiskReadLoad { - message TChunkInfo { - optional uint32 Slots = 1; // number of slots per chunk - optional uint32 Weight = 2; // probability weight +PDiskReadLoad: { + PDiskId: 1000 + PDiskGuid: 2258451612736857634 + VDiskId: { + GroupID: 11234 + GroupGeneration: 5 + Ring: 1 + Domain: 1 + VDisk: 3 } - optional uint64 Tag = 1; - optional uint32 PDiskId = 2; - optional uint64 PDiskGuid = 3; - optional NKikimrBlobStorage.TVDiskID VDiskId = 4; - repeated TChunkInfo Chunks = 5; - optional uint32 DurationSeconds = 6; - optional uint32 InFlightReads = 7; - optional bool Sequential = 9 [default = false]; - - optional uint32 IntervalMsMin = 10; - optional uint32 IntervalMsMax = 11; - - optional bool IsWardenlessTest = 13 [default = false]; + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + DurationSeconds: 120 + IntervalMsMin: 0 + IntervalMsMax: 0 + InFlightReads: 64 + Sequential: false + IsWardenlessTest: false } ``` + +При просмотре результата тестирования наибольший интерес представляет следующее значение: + +* `Average speed since start` — средняя скорость чтения с момента запуска в МБ/с, например `1257.148154`. diff --git a/ydb/docs/ru/core/development/load-actors-pdisk-write.md b/ydb/docs/ru/core/development/load-actors-pdisk-write.md index 9a31655663..34e9e65931 100644 --- a/ydb/docs/ru/core/development/load-actors-pdisk-write.md +++ b/ydb/docs/ru/core/development/load-actors-pdisk-write.md @@ -1,42 +1,33 @@ # PDiskWriteLoad -Подает на PDisk нагрузку write-only. Имитирует VDisk. Актор создает на указанном PDisk чанки и записывает в них случайные данные с указанными параметрами. Результатом теста является производительность записи в байтах в секунду. +Тестирует производительность записи на PDisk. Нагрузка подается от имени VDisk. Актор создает на указанном PDisk чанки и записывает в них случайные данные. После снятия нагрузки записанные актором данные удаляются. -{% include notitle [addition](../_includes/addition.md) %} +Вы можете подать нагрузку двух видов: -## Спецификация актора {#proto} +* _Постоянная_ — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, `IntervalMsMin: 0`, `IntervalMsMax: 0`) и отличный от нуля `InFlightWrites`. +* _Интервальная_ — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, `IntervalMsMin: 10`, `IntervalMsMax: 100`). Максимальное количество одновременно выполняемых запросов задается параметром `InFlightWrites`. Если его значение равно `0`, то ограничения нет. -<!-- -```proto -enum ELogMode { - LOG_PARALLEL = 1; - LOG_SEQUENTIAL = 2; - LOG_NONE = 3; -} -message TPDiskWriteLoad { - message TChunkInfo { - optional uint32 Slots = 1; // number of slots per chunk - optional uint32 Weight = 2; // probability weight - } - optional uint64 Tag = 1; - optional uint32 PDiskId = 2; - optional uint64 PDiskGuid = 3; - optional NKikimrBlobStorage.TVDiskID VDiskId = 4; - repeated TChunkInfo Chunks = 5; - optional uint32 DurationSeconds = 6; - optional uint32 InFlightWrites = 7; - optional ELogMode LogMode = 8; - optional bool Sequential = 9 [default = true]; - optional uint32 IntervalMsMin = 10; - optional uint32 IntervalMsMax = 11; - optional bool Reuse = 12 [default = false]; - optional bool IsWardenlessTest = 13 [default = false]; -} -``` ---> +## Параметры актора {#options} -```proto -enum ELogMode { +{% include [load-actors-params](../_includes/load-actors-params.md) %} + +Параметр | Описание +--- | --- +`PDiskId` | Идентификатор нагружаемого PDisk на узле. +`PDiskGuid` | Глобально-уникальный идентификатор нагружаемого PDisk. +`VDiskId` | Нагрузка подается от имени VDisk со следующими реквизитами:<ul><li>`GroupID` — идентификатор группы.</li><li>`GroupGeneration` — поколение группы.</li><li>`Ring` — идентификатор кольца в группе.</li><li>`Domain` — идентификатор фэйл-домена в кольце.</li><li>`VDisk` — индекс VDisk в фэйл-домене.</li></ul> +`Chunks` | Параметры чанка.<br>`Slots` — количество слотов в чанке, определяет размер записи.<br>Вы можете указать несколько `Chunks`, и тогда выбор конкретного чанка для записи будет определяться его `Weight`. +`DurationSeconds` | Продолжительность нагрузки в секундах. +`IntervalMsMin`,<br>`IntervalMsMax` | Минимальный и максимальный промежутки времени между запросами при интервальной нагрузке в миллисекундах. Значение промежутка выбирается случайно из указанного диапазона. +`InFlightWrites` | Количество одновременно обрабатываемых запросов на запись. +`LogMode` | Режим записи лога. В режиме `LOG_SEQUENTIAL` сначала происходит запись в чанк, а после ее подтверждения запись — в лог. +`Sequential` | Тип записи.<ul><li>`True` — последовательная.</li><li>`False` — случайная.</li></ul> +`IsWardenlessTest` | Если PDiskReadLoad запускается на кластере, укажите `False`. Иначе (например, при запуске в юнит-тестах) укажите `True`. + +<!-- +Параметр | Описание +--- | --- +`LogMode` | { LOG_PARALLEL = 1; // Писать в чанк и писать в лог (о факте записи) параллельно, и считать запись завершенной только если обе записи прошли LOG_SEQUENTIAL = 2; // Писать сначала в чанк, потом в лог. Считать запись завершенной после записи в лог LOG_NONE = 3; @@ -70,3 +61,41 @@ message TPDiskWriteLoad { optional bool IsWardenlessTest = 13 [default = false]; // позволяет использовать в тестах, где нет NodeWarden } ``` + --> + +## Примеры {#example} + +Следующий актор пишет данные блоками по `32` МБ, в течение `120` секунд, одновременно выполняются `64` запроса (постоянная нагрузка): + +```proto +PDiskWriteLoad: { + PDiskId: 1000 + PDiskGuid: 2258451612736857634 + VDiskId: { + GroupID: 11234 + GroupGeneration: 5 + Ring: 1 + Domain: 1 + VDisk: 3 + } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + Chunks: { Slots: 4096 Weight: 1 } + DurationSeconds: 120 + IntervalMsMin: 0 + IntervalMsMax: 0 + InFlightWrites: 64 + LogMode: LOG_SEQUENTIAL + Sequential: false + IsWardenlessTest: false +} +``` + +При просмотре результата тестирования наибольший интерес представляют следующее значение: + +* `Average speed since start` — средняя скорость записи с момента запуска в МБ/с, например `615.484013`. diff --git a/ydb/docs/ru/core/development/load-actors-stop.md b/ydb/docs/ru/core/development/load-actors-stop.md index cf3e9db082..ad1e5bbf97 100644 --- a/ydb/docs/ru/core/development/load-actors-stop.md +++ b/ydb/docs/ru/core/development/load-actors-stop.md @@ -1,49 +1,28 @@ # Stop -С помощью этого актора можно остановить все или только указанные акторы. - -## Спецификация актора {#proto} - -```proto -message TStop { - optional uint64 Tag = 1; - optional bool RemoveAllTags = 2; -} -``` +С помощью этой команды можно остановить всю или только указанную нагрузку. ## Параметры актора {#options} Параметр | Описание --- | --- -`Tag` | Тег нагрузки, может быть задан для остановки конкретной нагрузки. Тег можно посмотреть в Embedded UI.<br>Тип: `uint64`. -`RemoveAllTags` | Остановить все нагрузочные акторы на узле.<br>Тип: `bool`. +`Tag` | Тег нагружающего актора, который нужно остановить. Тег можно посмотреть в Embedded UI кластера. +`RemoveAllTags` | При значении параметра `True` будут остановлены все нагружающие акторы. ## Примеры {#examples} -{% list tabs %} - -- CLI - - Спецификация актора для остановки нагрузки с тегом `123` на узле с идентификатором `1`: +Следующая команда остановит нагрузку с тегом `123`: - ```proto - NodeId: 1 - Event: { - Stop: { - Tag: 123 - } - } - ``` - - Спецификация актора для остановки всей нагрузки на узле с идентификатором `1`: +```proto +Stop: { + Tag: 123 +} +``` - ```proto - NodeId: 1 - Event: { - Stop: { - RemoveAllTags: true - } - } - ``` +Команда для остановки всей нагрузки: -{% endlist %} +```proto +Stop: { + RemoveAllTags: true +} +``` diff --git a/ydb/docs/ru/core/development/load-actors-storage.md b/ydb/docs/ru/core/development/load-actors-storage.md index 7a5a91c1be..f7f5198223 100644 --- a/ydb/docs/ru/core/development/load-actors-storage.md +++ b/ydb/docs/ru/core/development/load-actors-storage.md @@ -1,114 +1,78 @@ # StorageLoad -Нагружает Distributed Storage без задействования слоев таблеток и Query Processor. Результатом теста является производительность записи на Distributed Storage в блобах в секунду. +Тестирует производительность записи и чтения с Distributed Storage. Нагрузка подается непосредственно на Distributed Storage без задействования слоев таблеток и Query Processor. При тестировании производительности записи актор записывает данные в указанную группу VDisk. Для тестирования чтения актор предварительно записывает данные в указанную группу VDisk, а потом читает их. После снятия нагрузки все данные, записанные актором, удаляются. -{% include notitle [addition](../_includes/addition.md) %} +Вы можете подать нагрузку двух видов: -## Спецификация актора {#proto} +* _Постоянная_ — актор следит, чтобы одновременно было запущено указанное число запросов. Чтобы подать постоянную нагрузку, задайте нулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } }`) и отличный от нуля `MaxInFlightWriteRequests`. +* _Интервальная_ — актор запускает запросы через заданные промежутки времени. Чтобы подать интервальную нагрузку, задайте ненулевую паузу между запросами (например, `WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } }`). Максимальное число одновременно выполняемых запросов задается параметром `InFlightReads`. Если его значение равно `0`, то ограничения нет. + +## Параметры актора {#options} + +{% include [load-actors-params](../_includes/load-actors-params.md) %} + +Параметр | Описание +--- | --- +` DurationSeconds` | Продолжительность нагрузки. +` Tablets` | Нагрузка подается от имени таблетки со следующими реквизитами:<ul><li>` TabletId` — идентификатор таблетки. Должен быть уникальным для каждого нагружающего актора.</li><li>` Channel` — канал таблетки.</li><li>` GroupId` — идентификатор группы VDisk'ов, на которую будет подана нагрузка.</li><li>` Generation` — поколение таблетки.</li></ul> +` WriteSizes` | Размер записываемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `WriteSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +` WriteIntervals` | Пауза между запросами для интервальной нагрузки в микросекундах. Для каждого запроса выбирается случайным образом из интервала `MinUs`-`MaxUs`. Вы можете задать несколько диапазонов `WriteIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +` MaxInFlightWriteRequests` | Максимальное количество одновременно обрабатываемых запросов на запись. +` ReadSizes` | Размер читаемых данных. Для каждого запроса выбирается случайным образом из интервала `Min`-`Max`. Вы можете задать несколько диапазонов `ReadSizes`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +` ReadIntervals` | Пауза между запросами для интервальной нагрузки в микросекундах. Для каждого запроса выбирается случайным образом из интервала `MinUs`-`MaxUs`. Вы можете задать несколько диапазонов `ReadIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +` MaxInFlightReadRequests` | Максимальное количество одновременно обрабатываемых запросов на чтение. +` FlushIntervals` | Интервал времени между запросами на удаление записанных StorageLoad данных в микросекундах. Выбирается случайным образом из интервала `MinUs`-`MaxUs`. Вы можете задать несколько диапазонов `FlushIntervals`, и тогда выбор значения из конкретного диапазона будет определяться его `Weight`. +` PutHandleClass` | Класс записи данных в дисковую подсистему. В случае `TabletLog` запись выполняется с максимальным приоритетом. +` GetHandleClass` | Класс чтения данных с дисковой подсистемы. В случае `FastRead` чтение выполняется с максимальной скоростью. + +## Примеры {#examples} + +### Нагрузка на запись {#write} + +Следующий актор будет писать в группу с идентификатором `2181038080` в течение `60` секунд. Размер одной записи `4096` байт, число одновременно выполняемых запросов не более `256` (постоянная нагрузка): ```proto -message TStorageLoad { - message TRequestInfo { - optional float SendTime = 1; - optional uint64 Type = 2; - optional uint32 Size = 3; - optional NKikimrBlobStorage.EPutHandleClass PutHandleClass = 4; +StorageLoad: { + DurationSeconds: 60 + Tablets: { + Tablets: { TabletId: 1000 Channel: 0 GroupId: 2181038080 Generation: 1 } + WriteSizes: { Weight: 1.0 Min: 4096 Max: 4096 } + WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } } + MaxInFlightWriteRequests: 256 + FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } } + PutHandleClass: TabletLog } - message TTabletInfo { - optional uint64 TabletId = 1; - optional uint32 Channel = 2; - optional uint32 GroupId = 3; - optional uint32 Generation = 4; - repeated TRequestInfo Requests = 5; - optional float ScriptedCycleDurationSec = 6; +} +``` + +При просмотре результата тестирования наибольший интерес представляют следующие значения: + +* ` Writes per seconds` — количество записей в секунду, например `28690.29`. +* ` Speed@ 100%` — 100 перцентиль скорости записи в МБ/с, например `108.84`. + +### Нагрузка на чтение {#read} + +Чтобы подать нагрузку на чтение, необходимо сначала записать данные. Данные записываются запросами по `4096` байт каждые `50` мс, при этом число одновременно выполняемых запросов не более `1` (интервальная нагрузка). Если запрос не успеет завершиться за `50` мс, актор дождется его завершения и через `50` мс запустит следующий запрос. Данные старше `10` с удаляются. Чтение данных выполнятся запросами по `4096` байт, число одновременно выполняемых запросов `16` (постоянная нагрузка): + +```proto +StorageLoad: { + DurationSeconds: 60 + Tablets: { + Tablets: { TabletId: 5000 Channel: 0 GroupId: 2181038080 Generation: 1 } + WriteSizes: { Weight: 1.0 Min: 4096 Max: 4096} + WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } } + MaxInFlightWriteRequests: 1 + + ReadSizes: { Weight: 1.0 Min: 4096 Max: 4096 } + ReadIntervals: { Weight: 1.0 Uniform: { MinUs: 0 MaxUs: 0 } } + MaxInFlightReadRequests: 16 + FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } } + PutHandleClass: TabletLog + GetHandleClass: FastRead } - message TPerTabletProfile { - repeated TTabletInfo Tablets = 1; - repeated TSizeInfo Sizes = 2; - repeated TIntervalInfo WriteIntervals = 3; - optional uint32 MaxInFlightRequests = 4; - optional uint32 MaxInFlightBytes = 5; - repeated TIntervalInfo FlushIntervals = 6; - optional NKikimrBlobStorage.EPutHandleClass PutHandleClass = 7; - optional bool Soft = 8; - optional uint32 MaxInFlightReadRequests = 9; - optional uint32 MaxInFlightReadBytes = 10; - repeated TIntervalInfo ReadIntervals = 11; - repeated TSizeInfo ReadSizes = 12; - optional uint64 MaxTotalBytesWritten = 13; - optional NKikimrBlobStorage.EGetHandleClass GetHandleClass = 14; - }; - optional uint64 Tag = 1; - optional uint32 DurationSeconds = 2; - optional bool RequestTracking = 3 [default = false]; - repeated TPerTabletProfile Tablets = 4; - optional uint64 ScheduleThresholdUs = 5; - optional uint64 ScheduleRoundingUs = 6; } ``` -<!-- -## Примеры {#example} - -**Читающая нагрузка** - -Нагрузка пишет в группу `$GROUPID`, состоит из двух частей. Первая - пишущая, подает небольшой фон пишущих запросов размера `$SIZE` каждые 50 мс, при этом ограничивает `InFlight` 1. То есть если запрос не успевает завершиться, то актор будет ждать завершения и после этого через 50мс, будет запущен следующий запрос. - -Вторая часть основная, читающая. Читает запросами размера `$SIZE`, запросы отправляет каждые `${INTERVAL}` микросекунд. Можно его задать в 0, тогда этот параметр не будет играть роли. Конфигурация ограничивает количество запросов в полете числом `${IN_FLIGHT}`. - -{% list tabs %} - -- CLI - - ```proto - NodeId: ${NODEID} - Event: { StorageLoad: { - DurationSeconds: ${DURATION} - ScheduleThresholdUs: 0 - ScheduleRoundingUs: 0 - Tablets: { - Tablets: { TabletId: ${TABLETID} Channel: 0 GroupId: ${GROUPID} Generation: 1 } - Sizes: { Weight: 1.0 Min: ${SIZE} Max: ${SIZE} } - WriteIntervals: { Weight: 1.0 Uniform: { MinUs: 50000 MaxUs: 50000 } } - MaxInFlightRequests: 1 - - ReadSizes: { Weight: 1.0 Min: ${SIZE} Max: ${SIZE} } - ReadIntervals: { Weight: 1.0 Uniform: { MinUs: ${INTERVAL} MaxUs: ${INTERVAL} } } - MaxInFlightReadRequests: ${IN_FLIGHT} - FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } } - PutHandleClass: ${PUT_HANDLE_CLASS} - GetHandleClass: ${GET_HANDLE_CLASS} - Soft: true - } - }} - ``` - -{% endlist %} - -**Пишущая нагрузка** - -Пишет в группу `$GROUPID` нагрузку длительностью `$DURATION` секунд. Пишет размерами `$SIZE`, ограничивая количество запросов в полете числом `$IN_FLIGHT`. - -{% list tabs %} - -- CLI - - ```proto - NodeId: ${NODEID} - Event: { StorageLoad: { - DurationSeconds: ${DURATION} - ScheduleThresholdUs: 0 - ScheduleRoundingUs: 0 - Tablets: { - Tablets: { TabletId: ${TABLETID} Channel: 0 GroupId: ${GROUPID} Generation: 1 } - Sizes: { Weight: 1.0 Min: ${SIZE} Max: ${SIZE} } - WriteIntervals: { Weight: 1.0 Uniform: { MinUs: ${INTERVAL} MaxUs: ${INTERVAL} } } - MaxInFlightRequests: ${IN_FLIGHT} - FlushIntervals: { Weight: 1.0 Uniform: { MinUs: 10000000 MaxUs: 10000000 } } - PutHandleClass: ${PUT_HANDLE_CLASS} - Soft: true - } - }} - ``` - -{% endlist %} - --> + +При просмотре результата тестирования наибольший интерес представляют следующие значение: + +* ` ReadSpeed@ 100%` — 100 перцентиль скорости чтения МБ/с, например `60.86`. diff --git a/ydb/docs/ru/core/development/load-actors-vdisk.md b/ydb/docs/ru/core/development/load-actors-vdisk.md index b592230b0b..abcd06d003 100644 --- a/ydb/docs/ru/core/development/load-actors-vdisk.md +++ b/ydb/docs/ru/core/development/load-actors-vdisk.md @@ -1,10 +1,10 @@ # VDiskLoad -Подает на VDisk нагрузку write-only. Имитирует Distributed Storage Proxy. Результатом теста является производительность записи в операциях в секунду. +Подает нагрузку write-only на VDisk. Имитирует Distributed Storage Proxy. Результатом теста является производительность записи в операциях в секунду. {% include notitle [addition](../_includes/addition.md) %} -## Спецификация актора {#proto} +## Параметры актора {#options} ```proto message TVDiskLoad { |