diff options
| author | potapenko-k <[email protected]> | 2023-02-03 17:05:26 +0300 |
|---|---|---|
| committer | potapenko-k <[email protected]> | 2023-02-03 17:05:26 +0300 |
| commit | 927d16c3d0ce77bde43ad1bc63773dc22b95c124 (patch) | |
| tree | ccd591691e29f2fd01dc9bc7284be8c8cddb52d2 | |
| parent | 954d287a9a6add755a63d6ccfdea112f12189024 (diff) | |
[review][YDB] Перевод Разработка/Ядро/Тестирование/Load actor
Тикет:
Ключи:
| -rw-r--r-- | ydb/docs/en/core/_assets/load-actors-finished-tests.png | bin | 0 -> 118212 bytes | |||
| -rw-r--r-- | ydb/docs/en/core/_assets/load-actors.svg | 4 | ||||
| -rw-r--r-- | ydb/docs/en/core/_includes/addition.md | 5 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-key-value.md | 23 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-kqp.md | 110 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-memory.md | 43 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-overview.md | 149 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-pdisk-log.md | 34 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-pdisk-read.md | 29 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-pdisk-write.md | 72 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-stop.md | 49 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-storage.md | 114 | ||||
| -rw-r--r-- | ydb/docs/en/core/development/load-actors-vdisk.md | 49 | ||||
| -rw-r--r-- | ydb/docs/en/core/toc_i.yaml | 47 |
14 files changed, 718 insertions, 10 deletions
diff --git a/ydb/docs/en/core/_assets/load-actors-finished-tests.png b/ydb/docs/en/core/_assets/load-actors-finished-tests.png Binary files differnew file mode 100644 index 00000000000..d7769d481e1 --- /dev/null +++ b/ydb/docs/en/core/_assets/load-actors-finished-tests.png diff --git a/ydb/docs/en/core/_assets/load-actors.svg b/ydb/docs/en/core/_assets/load-actors.svg new file mode 100644 index 00000000000..94ca021c11b --- /dev/null +++ b/ydb/docs/en/core/_assets/load-actors.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!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="461px" height="641px" viewBox="-0.5 -0.5 461 641" content="<mxfile host="Electron" modified="2022-12-29T11:51:36.536Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="fmLuNjrHHU_9gJvZfuO-" version="20.7.4" type="device"><diagram id="ubN0F7Ct8m74YTRy8KRH" name="Page-1">5Vtde6I4FP41XnYf+ay9bLWd3R3nWbvd7dSrfSKkyhYJE+Io8+s3kQQliYUqIM7e+CQHOAlv3pycD+xZw+XmEwbx4gvyYdgz+/6mZ416pnnj2PSXCdJM4F5zwRwHfiYydoKn4Afkwj6XrgIfJoUbCUIhCeKi0ENRBD1SkAGM0bp42ysKi6PGYA4VwZMHQlX6NfDJIpMOnP5O/isM5gsxstHnV5ZA3MwFyQL4aL0nsu571hAjRLLWcjOEIcNO4JI993Dgaj4xDCNS5YFkfPcwXKcvj5Pp/T9mOnp4TV6uTCdT8x2EK/7GfLYkFRBgtIp8yLT0e9bdehEQ+BQDj11d0zWnsgVZhrRn0OYrighfRcNm/SAMhyhEmAoiFFH5XUIweoOSkE8DYgI3B1/QyGGjdINoCQlO6S3iAYH0erdQtstli71Fcm0uBJwc81zXDj/a4BB+BM6PoGlUQFNFrwagLAFUKvX3gMtpuw/coAbcXsHfky8/pm/j32e/PbqbB2uEn68MBbfJKEjeTgPvACwa8A4jZReRsm0VqYEGqDoIpgXKUoB67iRQlnNmoFS7NoLfAwqAjBQ1yzFremkYUMiwVY7XLAN3PMsFwHubbyH/Y0WoGsjlCTeETk0gO0WQHc2+1dm7xrbtTbm5g5F/y45hhnAIkiTwilgWiQo3AXlhB80vDu9N966MNvwM2nZS0fHpgc0HRJgs0BxFILzfSe8o4jjdU8u6U/E06+wUb3tC88ElS9AKe7B8m7KpFV0XgOeQlBlClQB7C+xoFljIMAwBCb4Xx9StOh9hggL6Zjm/XEPaxDcScbL35k/tuxqSIuvG0ZtNoSjDQVG0JWH+2iccJ+p5cg5iHkm7bW8CcUBhgLgyy49na1VyOlpWn4utdl8imXUkWxVFTstsHVRga+nyF/m6u2eMUMyF/0JCUu6cgxVBRcIfQ/ETOGdVtYh2RdZVptNpnqrqgX2G6VXWNd2QMHcA09actf4CsxCS83tnksNvuKrjcNOmdybmc27Kt+4YCDbv0/69SLIrrLeV9aJhB8HBbEXoApj9J4Iwy6SY/QlGm7RzjDc1gZs2xG2M8kYVZ7l5yp9AXedCLbYmFAQEMNIuAPY7a7Rtp2NG27i+dAa7VRlc1dNticGuAvzjCm4nQK2tB5ME4bPT1bou0nWgstVoyuBqT9AGU2UnZV/tM6bKtEBVKAFcfhZHScWUGJD3KFXqvLl6ArQTF8tZQrt/bFwsJ7+bi4sPo9hMUaDWDdxmUUALVJVz+YI3sDYfVuOu1ngF+pDsvNt6ILHu2ORsnicTVQSj3W0thqsQS36itIwVLtOdS4rs1VaUNbVTEAbziG0ByhHGpDtmBwIPhLf8wjLw/S1XdVakWAevwZBYTjHxqKvDGjpKyZnO2iyJJnH++Vs8RsA/zeo2U8fOI6KuuJyGqcIH02fWuxQMdVFmyyCqjju3CJeCoS7Z1DKGar5uG/xcCoK6mKhlBNWoaOt9fsUUngzGIYu/mexPCHxJNEbzS8E69wfKsHYbw7obiSXh9Yr2tOABl9V4Cx7tzsFtPigVZ3Z5VuuA/3pyHVY6QY6vw0qKrlt2TLtVh/0IDeukk9kIS/JUtVhcOeqo/G2JXMuUv25qmiXdqONcqrH6WNm/dhpaso0xj6WhXJ2RFTVMw65U0M9srBpiiVHTkaZ8FtvykWaq8fz/kSVOMyyRTyI5GDmWJbbsaTfNEjVtobJkl0DmoYgPkkVOioOp5KrLeLa0qnQguMdWS2RFzX3yql9DNWuSf9kgPmwQAvYfncLqut9WSFy4yj5av6U3GHa8yR7j14WiLLTtA48gnAitdNqZ4uJgVLw3AYlVP00q17iWUrnVvtVoLJFrqgmg5ugwHbEmWDJko1kSF1e/nBSZLIlBdNI0lBf00DKmbIlI8t64VJYN/bNz1HJLOZo7Ou2QVK3wduJPOqdVh9v7kw7t7v4+mh0ku//gWvf/AQ==</diagram></mxfile>" style="background-color: rgb(255, 255, 255);"><defs/><g><rect x="0" y="0" width="460" height="640" fill="none" stroke="none" pointer-events="all"/><rect x="200" y="320" width="220" height="80" rx="12" ry="12" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="220" y="440" width="80" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 78px; height: 1px; padding-top: 460px; margin-left: 221px;"><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;">PDisk</div></div></div></foreignObject><text x="260" y="464" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PDisk</text></switch></g><rect x="220" y="350" width="80" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 78px; height: 1px; padding-top: 370px; margin-left: 221px;"><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;">VDisk</div></div></div></foreignObject><text x="260" y="374" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">VDisk</text></switch></g><path d="M 230 535 C 230 526.72 243.43 520 260 520 C 267.96 520 275.59 521.58 281.21 524.39 C 286.84 527.21 290 531.02 290 535 L 290 585 C 290 593.28 276.57 600 260 600 C 243.43 600 230 593.28 230 585 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 290 535 C 290 543.28 276.57 550 260 550 C 243.43 550 230 543.28 230 535" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" 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: 573px; margin-left: 231px;"><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;">Device</div></div></div></foreignObject><text x="260" y="576" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Device</text></switch></g><path d="M 260 390 L 260 433.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 260 438.88 L 256.5 431.88 L 260 433.63 L 263.5 431.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 260 480 L 260 513.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 260 518.88 L 256.5 511.88 L 260 513.63 L 263.5 511.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 245 200 L 245 210 Q 245 220 255 220 L 300 220 Q 310 220 310 226.82 L 310 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310 238.88 L 306.5 231.88 L 310 233.63 L 313.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="200" y="160" width="90" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 88px; height: 1px; padding-top: 180px; margin-left: 201px;"><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;">Key-value<br />Tablet</div></div></div></foreignObject><text x="245" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Key-value...</text></switch></g><path d="M 310 280 L 310 313.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310 318.88 L 306.5 311.88 L 310 313.63 L 313.5 311.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="200" y="240" width="220" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 218px; height: 1px; padding-top: 260px; margin-left: 201px;"><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;">Distributed Storage Proxy</div></div></div></foreignObject><text x="310" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Distributed Storage Proxy</text></switch></g><path d="M 375 200 L 375 210 Q 375 220 365 220 L 320 220 Q 310 220 310 226.82 L 310 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310 238.88 L 306.5 231.88 L 310 233.63 L 313.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="160" width="90" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 88px; height: 1px; padding-top: 180px; margin-left: 331px;"><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 Shard<br />Tablet</div></div></div></foreignObject><text x="375" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data Shard...</text></switch></g><path d="M 310 120 L 310 130 Q 310 140 320 140 L 365 140 Q 375 140 375 146.82 L 375 153.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 375 158.88 L 371.5 151.88 L 375 153.63 L 378.5 151.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="250" y="80" width="120" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 100px; margin-left: 251px;"><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;">Query Processor</div></div></div></foreignObject><text x="310" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Query Processor</text></switch></g><rect x="320" y="350" width="80" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 78px; height: 1px; padding-top: 370px; margin-left: 321px;"><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;">VDisk</div></div></div></foreignObject><text x="360" y="374" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">VDisk</text></switch></g><path d="M 360 390 L 360 433.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 360 438.88 L 356.5 431.88 L 360 433.63 L 363.5 431.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="320" y="440" width="80" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" 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: 78px; height: 1px; padding-top: 460px; margin-left: 321px;"><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;">PDisk</div></div></div></foreignObject><text x="360" y="464" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PDisk</text></switch></g><path d="M 360 480 L 360 513.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 360 518.88 L 356.5 511.88 L 360 513.63 L 363.5 511.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="235" y="320" width="150" 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: 148px; height: 1px; padding-top: 335px; margin-left: 236px;"><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;">Distributed Storage Group</div></div></div></foreignObject><text x="310" y="339" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Distributed Storage Group</text></switch></g><rect x="40" y="80" width="120" height="40" rx="6" ry="6" fill="none" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 100px; margin-left: 41px;"><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;">KqpLoad</div></div></div></foreignObject><text x="100" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">KqpLoad</text></switch></g><rect x="40" y="160" width="120" height="40" rx="6" ry="6" fill="none" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 180px; margin-left: 41px;"><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;">KeyValueLoad</div></div></div></foreignObject><text x="100" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">KeyValueLoad</text></switch></g><rect x="40" y="240" width="120" height="40" rx="6" ry="6" fill="none" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 260px; margin-left: 41px;"><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;">StorageLoad</div></div></div></foreignObject><text x="100" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">StorageLoad</text></switch></g><rect x="40" y="350" width="120" height="40" rx="6" ry="6" fill="none" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 370px; margin-left: 41px;"><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;">VDiskLoad</div></div></div></foreignObject><text x="100" y="374" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">VDiskLoad</text></switch></g><rect x="40" y="430" width="120" height="60" rx="9" ry="9" fill="none" stroke="rgb(0, 0, 0)" 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: 118px; height: 1px; padding-top: 460px; margin-left: 41px;"><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;">PDiskWriteLoad, PDiskReadLoad, PDiskLogLoad</div></div></div></foreignObject><text x="100" y="464" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">PDiskWriteLoad, PDis...</text></switch></g><path d="M 160 100 L 243.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 248.88 100 L 241.88 103.5 L 243.63 100 L 241.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 160 180 L 193.63 180" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.88 180 L 191.88 183.5 L 193.63 180 L 191.88 176.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 160 260 L 193.63 260" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.88 260 L 191.88 263.5 L 193.63 260 L 191.88 256.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 160 370 L 213.63 370" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 218.88 370 L 211.88 373.5 L 213.63 370 L 211.88 366.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 160 460 L 213.63 460" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 218.88 460 L 211.88 463.5 L 213.63 460 L 211.88 456.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 180 600 L 180 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><rect x="55" y="30" width="90" 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: 88px; height: 1px; padding-top: 45px; margin-left: 56px;"><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;"><b><font style="font-size: 14px;">Load actors</font></b></div></div></div></foreignObject><text x="100" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Load actors</text></switch></g><rect x="245" y="30" width="130" 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: 128px; height: 1px; padding-top: 45px; margin-left: 246px;"><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;"><b><font style="font-size: 14px;">YDB </font></b><span style="font-size: 14px;"><b>components</b></span></div></div></div></foreignObject><text x="310" y="49" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">YDB components</text></switch></g><path d="M 330 535 C 330 526.72 343.43 520 360 520 C 367.96 520 375.59 521.58 381.21 524.39 C 386.84 527.21 390 531.02 390 535 L 390 585 C 390 593.28 376.57 600 360 600 C 343.43 600 330 593.28 330 585 Z" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 390 535 C 390 543.28 376.57 550 360 550 C 343.43 550 330 543.28 330 535" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" 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: 573px; margin-left: 331px;"><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;">Device</div></div></div></foreignObject><text x="360" y="576" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Device</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/en/core/_includes/addition.md b/ydb/docs/en/core/_includes/addition.md new file mode 100644 index 00000000000..225e85e098f --- /dev/null +++ b/ydb/docs/en/core/_includes/addition.md @@ -0,0 +1,5 @@ +{% note info %} + +The article is being updated. + +{% endnote %} diff --git a/ydb/docs/en/core/development/load-actors-key-value.md b/ydb/docs/en/core/development/load-actors-key-value.md new file mode 100644 index 00000000000..6e35d3ba824 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-key-value.md @@ -0,0 +1,23 @@ +# KeyValueLoad + +Loads a key-value tablet. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```proto +message TKeyValueLoad { + message TWorkerConfig { + optional string KeyPrefix = 1; + optional uint32 MaxInFlight = 2; + optional uint32 Size = 11; // data size, bytes + optional bool IsInline = 9 [default = false]; + optional uint32 LoopAtKeyCount = 10 [default = 0]; // 0 means "do not loop" + } + optional uint64 Tag = 1; + optional uint64 TargetTabletId = 2; + optional uint32 DurationSeconds = 5; + repeated TWorkerConfig Workers = 7; +} +``` diff --git a/ydb/docs/en/core/development/load-actors-kqp.md b/ydb/docs/en/core/development/load-actors-kqp.md new file mode 100644 index 00000000000..1ab0838c559 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-kqp.md @@ -0,0 +1,110 @@ +# KqpLoad + +Generates a load on the Query Processor layer and loads all {{ ydb-short-name }} cluster components. The load generated by the actor is similar to that from the [workload](../reference/ydb-cli/commands/workload/index.md) {{ ydb-short-name }} CLI subcommand, but it's generated from within the cluster. Two types of load can be run: + +* **Stock**: Simulates a warehouse of an online store: creates multi-product orders, gets a list of orders per customer. +* **Key-value**: Uses the DB as a key-value store. + +As a result of the test, the number of successful transactions per second, the number of transaction execution retries, and the number of errors are output. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#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; + } +} +``` + +## Actor parameters {#options} + +| Parameter | Description | +--- | --- +| `TStockWorkload[]` | [Stock load parameters](#stock-workload). | +| `TKvWorkload[]` | [Key-value load parameters](#kv-workload). | +| `Tag` | Load tag. If not specified, the tag is assigned automatically.<br>Type: `uint64`.<br>Optional. | +| `DurationSeconds` | Test duration in seconds.<br>Type: `uint32`.<br>Required. | +| `WindowDuration` | Statistics aggregation window duration.<br>Type: `uint32`.<br>Required. | +| `WorkingDir` | Path to the directory to create test tables in.<br>Type: `string`.<br>Required. | +| `NumOfSessions` | The number of parallel threads creating the load. Each thread writes data to its own session.<br>Type: `uint32`.<br>Required. | +| `DeleteTableOnFinish` | Indicates whether to delete the tables after the load stops. For example, it may be useful to Leave tables in a scenario where it takes a long time to pre-create a large table and run further (reading) tests.<br>Type: `bool`.<br>Required. | +| `UniformPartitionsCount` | The number of partitions created in test tables.<br>Type: `uint32`.<br>Required. | +| `WorkloadType` | Lets you select the type of load.<br>Key-Value:<ul><li>`0`: UpsertRandom.</li><li>`1`: InsertRandom.</li><li>`2`: SelectRandom.</li></ul>Stock:<ul><li>`0`: InsertRandomOrder.</li><li>`1`: SubmitRandomOrder.</li><li>`2`: SubmitSameOrder.</li><li>`3`: GetRandomCustomerHistory.</li><li>`4`: GetCustomerHistory.</li></ul>Type: `uint32`.<br>Required. | +| `Workload` | Possible values:<ul><li>`TStockWorkload Stock`: Stock load type.</li><li>`TKvWorkload Kv`: Key-value load type.</li></ul> | + +### TStockWorkload {#stock-workload} + +| Parameter | Description | +--- | --- +| `ProductCount` | The number of products.<br>Type: `uint64`.<br>Default value: `100`.<br>Optional. | +| `Quantity` | Quantity of each product in stock.<br>Type: `uint64`.<br>Default value: `1000`.<br>Optional. | +| `OrderCount` | Initial number of orders in the database.<br>Type: `uint64`.<br>Default value: `100`.<br>Optional. | +| `Limit` | Minimum number of shards for tables.<br>Type: `uint64`.<br>Default value: `10`.<br>Optional. | +| `PartitionsByLoad` | Enabling/disabling auto-sharding.<br>Type: `bool`.<br>Default value: `true`.<br>Optional. | + +### TKvWorkload {#kv-workload} + +| Parameter | Description | +--- | --- +| `InitRowCount` | Before a load is generated, the load actor writes the specified number of rows to the table.<br>Type: `uint64`.<br>Default value: `1000`.<br>Optional. | +| `PartitionsByLoad` | Indicates whether to add the `AUTO_PARTITIONING_BY_LOAD` attribute to the test table.<br>Type: `bool`.<br>Default value: `true`.<br>Optional. | +| `MaxFirstKey` | Limits the range of key values. Created to make sure that, under read load, random keys fall within the range of table keys.<br>Type: `uint64`.<br>Default value: `18446744073709551615`.<br>Optional. | +| `StringLen` | Length of the `value` string.<br>Type: `uint64`.<br>Default value: `8`.<br>Optional. | +| `ColumnsCnt` | Number of columns to use in the table.<br>Type: `uint64`.<br>Default value: `2` (columns for the key and value).<br>Optional. | +| `RowsCnt` | Number of rows to insert/read per SQL query<br>Type: `uint64`.<br>Default value: `1`.<br>Optional. | + +## Examples {#example} + +Below is the specification of an actor that runs a stock load on the `/slice/db`, database by making simple UPSERT queries of 64 threads during 30 seconds. Before this test, the necessary tables are created. After it's completed, they are deleted. + +{% list tabs %} + +- 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 + } + } + ``` + +{% endlist %} diff --git a/ydb/docs/en/core/development/load-actors-memory.md b/ydb/docs/en/core/development/load-actors-memory.md new file mode 100644 index 00000000000..42aa619a3e2 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-memory.md @@ -0,0 +1,43 @@ +# MemoryLoad + +Tests the performance of memory allocators. Allocates memory blocks of the specified size at certain intervals. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```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`. +--> + +## Examples {#examples} + +{% list tabs %} + +- CLI + + ```proto + NodeId: 1 + Event: { MemoryLoad: { + DurationSeconds: 120 + BlockSize: 4096 + IntervalUs: 1000 + }} + ``` + +{% endlist %} diff --git a/ydb/docs/en/core/development/load-actors-overview.md b/ydb/docs/en/core/development/load-actors-overview.md new file mode 100644 index 00000000000..6ee1d2a10f3 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-overview.md @@ -0,0 +1,149 @@ +# Overview of testing with load actors + +Testing system performance is an important stage of adding changes to the {{ ydb-short-name }} core. With [load testing]{% if lang == "ru" %}(https://ru.wikipedia.org/wiki/Нагрузочное_тестирование){% endif %}{% if lang == "en" %}(https://en.wikipedia.org/wiki/Load_testing){% endif %}, you can: + +* Determine the performance metrics and compare them to the values before the changes. +* Test how the system runs under high or peak loads. + +The task to load a high-performance distributed system is non-trivial. A software developer often has to run multiple client instances to achieve the required server load. {{ ydb-short-name }} implements a simple and convenient load generation mechanism: load actors. Actors are created and run directly on a cluster, which allows avoiding the use of additional resources for starting client instances. Load actors can be run on arbitrary cluster nodes: one, all, or only selected ones. You can create any number of actors on any node. + +With load actors, you can test both the entire system and its individual components: + +<center> + + + +</center> + +For example, you can generate a [load on Distributed Storage](load-actors-storage.md) without using tablet and Query Processor layers. This lets you test different system layers separately and find bottlenecks in an efficient way. By combining a variety of actor types, you can run different types of load. + +## Actor types {#load-actor-type} + +| Type | Description | +--- | --- +| [KqpLoad](load-actors-kqp.md) | Generates a load on the Query Processor layer and loads all cluster components. | +| [KeyValueLoad](load-actors-key-value.md) | Loads a key-value tablet. | +| [StorageLoad](load-actors-storage.md) | Loads Distributed Storage without using tablet and Query Processor layers. | +| [VDiskLoad](load-actors-vdisk.md) | Tests the performance of writes to the VDisk. | +| [PDiskWriteLoad](load-actors-pdisk-write.md) | Tests the performance of writes to the PDisk. | +| [PDiskReadLoad](load-actors-pdisk-read.md) | Tests the performance of reads from the PDisk. | +| [PDiskLogLoad](load-actors-pdisk-log.md) | Tests if cuts from the middle of the PDisk log are correct. | +| [MemoryLoad](load-actors-memory.md) | Tests the performance of memory allocators. | +| [Stop](load-actors-stop.md) | Using this actor, you can stop either all or only the specified actors. | + +## Running a load {load-actor-start} + +You can run a load using the following methods: + +* Cluster Embedded UI, lets you create, based on a specification, and start a load actor either on the current node or all tenant nodes at once. +* The `ydbd` utility, lets you send the actor specification to any cluster node indicating the nodes to create and run an actor on. + +The use case described below shows how to create and run the KqpLoad actor. The actor accesses the `/slice/db` database as a key-value store using 64 threads with a 30-second load. Before the test, the actor creates the necessary tables and deletes them once the test is completed. When being created, the actor is assigned an automatically generated tag. The same tag will be assigned to the test result. + +{% list tabs %} + +- Embedded UI + + 1. Open the page for managing load actors on the desired node (for example, `http://<address>:8765/actors/load`, where `address` is the address of the cluster node to run the load on). + 1. Paste the actor specification into the input/output field: + + ```proto + KqpLoad: { + DurationSeconds: 30 + WindowDuration: 1 + WorkingDir: "/slice/db" + NumOfSessions: 64 + UniformPartitionsCount: 1000 + DeleteTableOnFinish: 1 + WorkloadType: 0 + Kv: { + InitRowCount: 1000 + PartitionsByLoad: true + MaxFirstKey: 18446744073709551615 + StringLen: 8 + ColumnsCnt: 2 + RowsCnt: 1 + } + } + ``` + + 1. To create and run the actor, click: + * **Start new load on current node**: Runs the load on the current node. + * **Start new load on all tenant nodes**: Runs the load on all the tenant nodes at once. + + You'll see the following message in the input/output field: + + ```text + {"status":"OK","tag":1} + ``` + + * `status`: Load run status. + * `tag`: Tag assigned to the load. + +- CLI + + 1. Create a file with an actor specification: + + ```proto + NodeId: 1 + Event: { + KqpLoad: { + DurationSeconds: 30 + WindowDuration: 1 + WorkingDir: "/slice/db" + NumOfSessions: 64 + UniformPartitionsCount: 1000 + DeleteTableOnFinish: 1 + WorkloadType: 0 + Kv: { + InitRowCount: 1000 + PartitionsByLoad: true + MaxFirstKey: 18446744073709551615 + StringLen: 8 + ColumnsCnt: 2 + RowsCnt: 1 + } + } + } + ``` + + * `NodeId`: ID of the node to start the actor on. To specify multiple nodes, list them in separate lines: + + ```proto + NodeId: 1 + NodeId: 2 + ... + NodeId: N + Event: { + ... + ``` + + * `Event`: Actor specification. + + 1. Start the actor: + + ```bash + ydbd load-test --server <endpoint> --protobuf "$(cat <proto_file>)" + ``` + + * `endpoint`: Node gRPC endpoint (for example, `grpc://<address>:<port>`, where `address` is the node address and `port` is the node gRPC port). + * `proto_file`: Path to the actor's specification file. + +{% endlist %} + +## Viewing test results {#view-results} + +You can view the test results using the Embedded UI. For a description of output parameters, see the documentation of the respective actor. + +{% list tabs %} + +- Embedded UI + + 1. Open the page for managing load actors on the desired node (for example, `http://<address>:<port>/actors/load`, where `address` is the node address and `port` is the HTTP port used for monitoring the node under load). + 1. Click **Results**. + + This shows the results of completed tests. Find the results with the appropriate tag. + +  + +{% endlist %} diff --git a/ydb/docs/en/core/development/load-actors-pdisk-log.md b/ydb/docs/en/core/development/load-actors-pdisk-log.md new file mode 100644 index 00000000000..2409420ecc1 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-pdisk-log.md @@ -0,0 +1,34 @@ +# PDiskLogLoad + +Tests cuts from the middle of the PDisk log. It's not loading and is mostly aimed to test the correctness. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```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; + } + + optional uint64 Tag = 1; + optional uint32 PDiskId = 2; + optional uint64 PDiskGuid = 3; + + optional uint32 DurationSeconds = 5; + repeated TWorkerConfig Workers = 7; + + optional bool IsWardenlessTest = 8 [default = false]; +} +``` diff --git a/ydb/docs/en/core/development/load-actors-pdisk-read.md b/ydb/docs/en/core/development/load-actors-pdisk-read.md new file mode 100644 index 00000000000..4a976c4920c --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-pdisk-read.md @@ -0,0 +1,29 @@ +# PDiskReadLoad + +Generates a read-only load on the PDisk. Simulates the VDisk. The actor creates chunks on the specified PDisk, writes random data to them, and reads the data from them using the specified parameters. The test outputs the read performance in bytes per second. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```proto +message TPDiskReadLoad { + 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 InFlightReads = 7; + optional bool Sequential = 9 [default = false]; + + optional uint32 IntervalMsMin = 10; + optional uint32 IntervalMsMax = 11; + + optional bool IsWardenlessTest = 13 [default = false]; +} +``` diff --git a/ydb/docs/en/core/development/load-actors-pdisk-write.md b/ydb/docs/en/core/development/load-actors-pdisk-write.md new file mode 100644 index 00000000000..cb964517961 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-pdisk-write.md @@ -0,0 +1,72 @@ +# PDiskWriteLoad + +Generates a write-only load on the PDisk. Simulates the VDisk. The actor creates chunks on the specified PDisk and writes random data with the specified parameters to them. The test outputs the write performance in bytes per second. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +<!-- +```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]; +} +``` +--> + +```proto +enum ELogMode { + LOG_PARALLEL = 1; // Make parallel writes to a chunk and log (about the actual write) and consider the write completed only if both writes are successful + LOG_SEQUENTIAL = 2; // First write data to the chunk and then to the log. Consider the write completed after writing data to the log + LOG_NONE = 3; +} + +message TPDiskWriteLoad { + message TChunkInfo { + optional uint32 Slots = 1; // the number of slots per chunk. Actually determines the size of writes/reads, + // that can be calculated by dividing the chunk size by the number of slots + optional uint32 Weight = 2; // the weight that data will be written to this chunk with + } + optional uint64 Tag = 1; // optional. If not specified, the tag is assigned automatically + optional uint32 PDiskId = 2; // required. ID to generate a load on. You can find it in the cluster UI + optional uint64 PDiskGuid = 3; // required. GUID of the PDisk that the load is generated on. You can find it in the UI on the PDisk page + optional NKikimrBlobStorage.TVDiskID VDiskId = 4; // required. The load actor will use this VDiskId to present itself to the PDisk. + // It must not be duplicated across different load actors. + repeated TChunkInfo Chunks = 5; // required. Describes the number of chunks to be used for load generation. Allows varying the load. + // For example, you can create two chunks, one with a large number of slots and one with a small number of slots, and set the chunk weights + // so that 95% of writes were small, while 5% were large, simulating VDisk compaction + optional uint32 DurationSeconds = 6; // required. Test duration + optional uint32 InFlightWrites = 7; // required. Limits the number of in-flight requests to the PDisk + optional ELogMode LogMode = 8; // required. See above: ELogMode + optional bool Sequential = 9 [default = true]; // optional. Make sequential or random writes to chunk slots. + optional uint32 IntervalMsMin = 10; // optional. See below + optional uint32 IntervalMsMax = 11; // optional. Allows generating a severe load that will send requests strictly on a regular basis. + // The interval between requests is randomly selected from the range [IntervalMsMin, IntervalMsMax]. + // Considers the number of InFlightWrites and doesn't exceed it. If no IntervalMsMin and IntervalMsMax are specified, it only considers + // InFlightWrites + optional bool Reuse = 12 [default = false]; // shows if the actor must reuse the fully written chunks or allocate + // new chunks and release the old ones + optional bool IsWardenlessTest = 13 [default = false]; // allows using them in tests with no NodeWarden +} +``` diff --git a/ydb/docs/en/core/development/load-actors-stop.md b/ydb/docs/en/core/development/load-actors-stop.md new file mode 100644 index 00000000000..c21893cee6d --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-stop.md @@ -0,0 +1,49 @@ +# Stop + +Using this actor, you can stop either all or only the specified actors. + +## Actor specification {#proto} + +```proto +message TStop { + optional uint64 Tag = 1; + optional bool RemoveAllTags = 2; +} +``` + +## Actor parameters {#options} + +| Parameter | Description | +--- | --- +| `Tag` | Load tag that can be set to stop a specific load. You can view the tag in the Embedded UI.<br>Type: `uint64`. | +| `RemoveAllTags` | Stop all load actors on the node.<br>Type: `bool`. | + +## Examples {#examples} + +{% list tabs %} + +- CLI + + Actor specification to be used to stop the load tagged `123` on the node with ID `1`: + + ```proto + NodeId: 1 + Event: { + Stop: { + Tag: 123 + } + } + ``` + + Actor specification to be used to stop all the load on the node with ID `1`: + + ```proto + NodeId: 1 + Event: { + Stop: { + RemoveAllTags: true + } + } + ``` + +{% endlist %} diff --git a/ydb/docs/en/core/development/load-actors-storage.md b/ydb/docs/en/core/development/load-actors-storage.md new file mode 100644 index 00000000000..793015e0641 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-storage.md @@ -0,0 +1,114 @@ +# StorageLoad + +Loads Distributed Storage without using tablet and Query Processor layers. The test outputs the performance of writes to Distributed Storage in blobs per second. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```proto +message TStorageLoad { + message TRequestInfo { + optional float SendTime = 1; + optional uint64 Type = 2; + optional uint32 Size = 3; + optional NKikimrBlobStorage.EPutHandleClass PutHandleClass = 4; + } + 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; + } + 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 %} + --> diff --git a/ydb/docs/en/core/development/load-actors-vdisk.md b/ydb/docs/en/core/development/load-actors-vdisk.md new file mode 100644 index 00000000000..5b80a3b0454 --- /dev/null +++ b/ydb/docs/en/core/development/load-actors-vdisk.md @@ -0,0 +1,49 @@ +# VDiskLoad + +Generates a write-only load on the VDisk. Simulates a Distributed Storage Proxy. The test outputs the write performance in operations per second. + +{% include notitle [addition](../_includes/addition.md) %} + +## Actor specification {#proto} + +```proto +message TVDiskLoad { + optional uint64 Tag = 1; + + // full VDisk identifier + optional NKikimrBlobStorage.TVDiskID VDiskId = 2; + + reserved 3; // obsolete field + reserved 4; // obsolete field + optional NKikimrBlobStorage.TGroupInfo GroupInfo = 16; + + // tablet id, channel and generation used in blob ids and barriers + optional uint64 TabletId = 5; + optional uint32 Channel = 6; + optional uint32 Generation = 7; + + // duration of the test in seconds + optional uint32 DurationSeconds = 8; + + // a distribution of intervals between adjacent writes + repeated TIntervalInfo WriteIntervals = 9; + + // a distribution of write block sizes (expressed in bytes of BlobSize; i.e. PartSize bytes are actually written) + repeated TSizeInfo WriteSizes = 10; + + // maximum number of unconfirmed parallel writes + optional uint32 InFlightPutsMax = 11; + + // soft maximum of total in flight put bytes + optional uint64 InFlightPutBytesMax = 12; + + // put handle class + optional NKikimrBlobStorage.EPutHandleClass PutHandleClass = 13; + + // a distribution of intervals between barrier advances + repeated TIntervalInfo BarrierAdvanceIntervals = 14; + + // minimum distance kept between current Step of written blobs and CollectStep of barriers + optional uint32 StepDistance = 15; +} +``` diff --git a/ydb/docs/en/core/toc_i.yaml b/ydb/docs/en/core/toc_i.yaml index b48eec63c88..cbe59aa5405 100644 --- a/ydb/docs/en/core/toc_i.yaml +++ b/ydb/docs/en/core/toc_i.yaml @@ -7,22 +7,49 @@ items: # Main - { name: Concepts, include: { mode: link, path: concepts/toc_p.yaml } } -- { name: Practical guidelines , include: { mode: link, path: operations/toc_p.yaml } } +- { name: Tutorials, include: { mode: link, path: operations/toc_p.yaml } } -- { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } -# - { name: Diagnostics, include: { mode: link, path: troubleshooting/toc_p.yaml } } moved into maintenance! -# - { name: Deployment, include: { mode: link, path: deploy/toc_p.yaml } } -# - { name: Maintenance, include: { mode: link, path: maintenance/toc_p.yaml } } +- { name: Recommendations, include: { mode: link, path: best_practices/toc_p.yaml } } +# - { name: Diagnostics, include: { mode: link, path: troubleshooting/toc_p.yaml } } moved into maintenance! +# - { name: Deployment, include: { mode: link, path: deploy/toc_p.yaml } } +# - { name: Maintenance, include: { mode: link, path: maintenance/toc_p.yaml } } - { name: Managing databases, include: { mode: link, path: db/toc_p.yaml } } - { name: Managing a cluster, include: { mode: link, path: cluster/toc_p.yaml } } -# References -- { name: YQL, include: { mode: link, path: yql/toc_p.yaml } } -- { name: Working with the YDB CLI, include: { mode: link, path: reference/ydb-cli/toc_p.yaml } } -- { name: Working with the YDB SDK, include: { mode: link, path: reference/ydb-sdk/toc_p.yaml } } +# References +- { name: YQL, include: { mode: link, path: yql/toc_p.yaml } } +- { name: Working with the YDB CLI, include: { mode: link, path: reference/ydb-cli/toc_p.yaml } } +- { name: Working with the YDB SDK, include: { mode: link, path: reference/ydb-sdk/toc_p.yaml } } +- name: Development + # hidden: true + items: + - name: Core + items: + - name: Testing with load actors + items: + - name: Overview + href: development/load-actors-overview.md + - name: KqpLoad + href: development/load-actors-kqp.md + - name: KeyValueLoad + href: development/load-actors-key-value.md + - name: StorageLoad + href: development/load-actors-storage.md + - name: VDiskLoad + href: development/load-actors-vdisk.md + - name: PDiskWriteLoad + href: development/load-actors-pdisk-write.md + - name: PDiskReadLoad + href: development/load-actors-pdisk-read.md + - name: PDiskLogLoad + href: development/load-actors-pdisk-log.md + - name: MemoryLoad + href: development/load-actors-memory.md + - name: Stop + href: development/load-actors-stop.md # Footer -- { name: Questions and answers, include: { mode: link, path: faq/toc_p.yaml } } +- { name: Questions and answers, include: { mode: link, path: faq/toc_p.yaml } } - include: { mode: link, path: downloads/toc_p.yaml } - name: Public talks href: public-talks.md |
