{"id":501082,"date":"2026-10-30T18:23:57","date_gmt":"2026-10-30T15:23:57","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=501082"},"modified":"2026-10-30T18:23:57","modified_gmt":"2026-10-30T15:23:57","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=501082","title":{"rendered":"Perfscale news #17. \u0421\u0432\u043e\u0438 \u0448\u0430\u0433\u0438 \u043d\u0430 WASM (RFC 009), Node.js-\u0448\u0430\u0433\u0438, Faker \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 IP \u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u043f\u0443\u0442"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e, \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 \u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0438\u043e\u043d\u0430\u043b\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438! \u0421\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u043e\u0448\u043b\u044b\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u043c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0448\u043b\u044b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1057960\/\" rel=\"noopener nofollow\">\u041d\u043e\u0432\u043e\u0441\u0442\u0438 Perfscale \u2116\u00a01<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1058616\/\" rel=\"noopener nofollow\">Perfscale news #2: Fix Protocol, Magic metrics \u0438\u00a0MCP<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1061118\/\" rel=\"noopener nofollow\">perfscale news #3\u00a0Websocket, Inference, NPM<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1064292\/\" rel=\"noopener nofollow\">Perfscale news #4. GRPC, Fixed Triggers, Child Process<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1067192\/\" rel=\"noopener nofollow\">Perfscale news #5. SQL, Thresholds, \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 Linked Accounts<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1069752\/\" rel=\"noopener nofollow\">Perfscale news #6. GraphQL, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Import, \u0438\u00a0\u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1072902\/\" rel=\"noopener nofollow\">Perfscale news #7. Fix Import, SOAP, and more HTTP metrics<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1075678\/\" rel=\"noopener nofollow\">Perfscale news #8. WS\u00a0Benchmark, Jmeter open sourced &amp; fixed linked accounts<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1077874\/\" rel=\"noopener nofollow\">Perfscale news #9. GPU, LLM, Docker images<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1081272\/\" rel=\"noopener nofollow\">Perfscale news #10. Shared variables, Pub\/Sub load testing &amp; live metrics<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1083982\/\" rel=\"noopener nofollow\">Perscale news #11. Fine\u2011grained token, SQID, stdout log streaming<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1086894\/\" rel=\"noopener nofollow\">Perfscale news #12. WASM\u2011\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, SDK \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0438 \u00ab\u0436\u0438\u0432\u044b\u0435\u00bb \u043b\u043e\u0433\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1089710\/\" rel=\"noopener nofollow\">Perfscale news #13. \u0412\u044b\u0436\u0438\u0433\u0430\u043d\u0438\u0435 WASM \u043c\u043e\u0434\u0443\u043b\u0435\u0439, http3\u00a0\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 postmortem<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1091612\/\" rel=\"noopener nofollow\">Perfscale news #14. \u0424\u0438\u043a\u0441 fix, api reference \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 webrtc<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1095374\/\" rel=\"noopener nofollow\">Perfscale news #15. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 bench, \u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u0441\u0435\u0440\u0432\u0435\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/news\/1098742\/\" rel=\"noopener nofollow\">Perfscale news #16. SDK Report API, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 pro \u043c\u043e\u0434\u0443\u043b\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u2014 \u0432 v0.30.0 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <strong>RFC 009: \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0448\u0430\u0433<\/strong>. \u041d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 <code>use:<\/code>-\u0448\u0430\u0433 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438. \u0412\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u2014 Node.js-\u0448\u0430\u0433\u0438 \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435, Faker, gzip, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 IP \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0444\u0435\u0439\u043b\u044b, \u043f\u043e\u0435\u0445\u0430\u043b\u0438<\/p>\n<h2>Perfscale OSS<\/h2>\n<h4>RFC 009: \u0441\u0432\u043e\u0438 \u0448\u0430\u0433\u0438 \u043d\u0430 WASM<\/h4>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043f\u0443\u0442\u0438: \u0432\u0442\u0438\u0441\u043d\u0443\u0442\u044c \u0435\u0451 \u0432 <code>std\/tcp<\/code> \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u0440\u043e\u0441\u0438\u0442\u044c PR \u0432 \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c pro-\u043c\u043e\u0434\u0443\u043b\u044c. \u041f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0432\u0435\u0440\u0445 TCP, \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u00ab\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439 \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u044c \u2192 \u0437\u0430\u043f\u0438\u0448\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0443\u00bb \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0443\u043f\u0438\u0440\u0430\u043b\u043e\u0441\u044c \u0432 \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/strong> (<code>${mylib.fn(...)}<\/code>), \u043d\u043e \u043d\u0435 <strong>\u0448\u0430\u0433\u0438<\/strong>.<\/p>\n<p><a href=\"https:\/\/github.com\/Perfscale\/perfscale\/blob\/main\/rfcs\/009-custom-sdk-steps.md\" rel=\"noopener nofollow\">RFC 009<\/a> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u0434\u044b\u0440\u0443. \u0422\u043e\u0442 \u0436\u0435 WASM-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <strong>\u0448\u0430\u0433\u0438<\/strong>, \u0438 \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 <code>use:<\/code> \u043a\u0430\u043a <code>lib\/&lt;alias&gt;\/&lt;step&gt;<\/code>:<\/p>\n<pre><code class=\"yaml\">libraries:  - use: .\/libs\/acme-signer.wasm    capabilities: [clock]    as: sigsteps:  - name: login    use: lib\/sig\/login          # \u0448\u0430\u0433 `login` \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430    outputs: auth    with:      user: \"trader-${{ vu }}\"      password: ${{ env.DESK_PASSWORD }}  - name: verify    use: std\/check@v1    with:      on: auth.session<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<blockquote>\n<p>\u0414\u0430, \u044f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e lib\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0443\u0436\u0430\u0441\u043d\u044b\u0439. \u041c\u044b \u043f\u043e\u043a\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u044f\u0442\u044c &#171;std&#187; \u043e\u0442 &#171;\u043d\u0435 std&#187;<\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f capability <code>process<\/code> \u2014 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u0440\u0435\u0437 \u0445\u043e\u0441\u0442 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0430, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c \u0438 \u0437\u0430\u0447\u0438\u0441\u0442\u043a\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u00ab\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439\u00bb \u0440\u0435\u0436\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u043e\u0439\u043d\u044b\u043c \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435\u043c: \u0433\u0440\u0430\u043d\u0442 \u0432 YAML, <code>allow_library_capabilities: true<\/code> \u0438 <code>allow_process_actions: true<\/code>. \u0411\u0435\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0451\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f.<\/p>\n<h4>Node.js-\u0448\u0430\u0433\u0438 \u2014 \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 RFC 009<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c <code>process<\/code> \u0441\u0442\u0430\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/Perfscale\/nodejs\" rel=\"noopener nofollow\">Perfscale\/nodejs<\/a> \u0438 \u0441 \u043d\u0435\u0439 \u0442\u0440\u0438 \u0448\u0430\u0433\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0428\u0430\u0433<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lib\/nodejs\/install<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0441 <a href=\"http:\/\/nodejs.org\" rel=\"noopener nofollow\">nodejs.org<\/a>, \u0441\u0432\u0435\u0440\u044f\u0435\u0442 SHA-256 \u0441 <code>SHASUMS256.txt<\/code> \u0434\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438, \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lib\/nodejs\/exec<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 inline-\u0441\u043a\u0440\u0438\u043f\u0442 (<code>node -e<\/code>) \u0438\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 node<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lib\/nodejs\/install-exec<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0430\u0432\u0438\u0442 (\u0438\u043b\u0438 \u0431\u0435\u0440\u0451\u0442 \u0438\u0437 \u043a\u044d\u0448\u0430) \u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<pre><code class=\"yaml\"># config.yaml \u2014 \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043d\u0430 process + \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 node \u043e\u0434\u0438\u043d \u0440\u0430\u0437allow_library_capabilities: trueallow_process_actions: truelibraries:  - use: .\/nodejs.wasm    capabilities: [process]before:  - name: node    use: lib\/nodejs\/install    with:      node-version: 24.16.0      install-dir: .perfscale-tools\/nodejs    outputs: setup<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"yaml\"># test.yamlsteps:  - name: inline-script    use: lib\/nodejs\/exec    with:      node-path: \"${{ config.setup.node-path }}\"      script: console.log(`hello from node ${process.version}`)    check:      message_contains: hello from node v24.16.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<blockquote>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e RPS \u0443 \u0432\u0430\u0441 \u0443\u043f\u0430\u0434\u0435\u0442 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 nodejs, \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 nodejs \u043d\u0435 \u0432\u044b\u0442\u0430\u0449\u0438\u0442 \u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e RPS, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c perfscale. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a<\/p>\n<\/blockquote>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e shell: \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u2014 \u043f\u0440\u044f\u043c\u043e\u0439 argv \u0441 \u044f\u0432\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u0430 \u043d\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043a\u0430 Linux x86_64 \u0438 aarch64. \u0427\u0435\u0441\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u2014 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u2014 \u0430 \u043d\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043f\u0443\u0442\u044c \u043d\u0430 \u0442\u044b\u0441\u044f\u0447\u0438 RPS, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>\u0421\u043b\u0435\u0434\u043e\u043c \u0438\u0434\u0451\u0442 <strong>Python<\/strong> \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 standalone CPython, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 checksum, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0442\u0435 \u0436\u0435 \u0442\u0440\u0438 \u0448\u0430\u0433\u0430. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/Perfscale\/python\" rel=\"noopener nofollow\">Perfscale\/python<\/a> \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<h4>Faker<\/h4>\n<p><a href=\"https:\/\/github.com\/Perfscale\/faker\" rel=\"noopener nofollow\">Perfscale\/faker<\/a> \u2014 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f payload\u2019\u043e\u0432: email, \u0430\u0434\u0440\u0435\u0441\u0430, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043b\u0430\u0442\u0451\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<pre><code class=\"yaml\">libraries:  - use: .\/faker.wasm    capabilities: []steps:  - use: std\/http@v1    with:      method: POST      url: https:\/\/api.example.com\/signup      body:        email: \"${faker.internet(\"email\")}\"        city: \"${faker.address(\"city\")}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Faker \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 GitHub Action \u2014 \u0442\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u0435\u0435\u0442 \u0442\u044f\u043d\u0443\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 <a href=\"https:\/\/github.com\/Perfscale\/faker\/releases\/tag\/v0.1.0\" rel=\"noopener nofollow\">GitHub Releases<\/a>.<\/p>\n<h4>\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 inputs: -i \u0438 -e<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0433\u043e\u043d\u044f\u044e\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445, \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438. \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0430\u0432\u043a\u043e\u0439 YAML \u0438\u043b\u0438 \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 <strong>\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u0430<\/strong>, \u0448\u0430\u0433\u0438 \u0447\u0438\u0442\u0430\u044e\u0442 \u0438\u0445 \u043a\u0430\u043a <code>${{ inputs.&lt;name&gt; }}<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435:<\/p>\n<pre><code class=\"yaml\"># config.yamlinputs:  users: number                                    # \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0431\u0435\u0437 default  host: # host    type: string    default: localhost  verbose: { type: bool, default: false }          # \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 0\/1\/false\/true  env: { type: choice, options: [staging, prod], default: staging } # \u043a\u0430\u043a \u0432 github actions  pacing_ms: { type: number, min: 1, max: 10000 }  # \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f number<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"yaml\"># test.yamlsteps:  - use: std\/http@v1    with:      url: \"https:\/\/${{ inputs.host }}\/api\/orders?env=${{ inputs.env }}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>perfscale run -f test.yaml -c config.yaml -i users=10 -i env=prodperfscale run -f test.yaml -c config.yaml -i users=10,env=prod   # \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044eperfscale run -f test.yaml -c config.yaml -e staging.env          # \u0438\u0437 env-\u0444\u0430\u0439\u043b\u0430perfscale lint config.yaml -i users=10    # \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: <code>-i<\/code> \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0437\u0430\u0442\u0435\u043c env-\u0444\u0430\u0439\u043b (<code>-e<\/code>, \u0438\u0437 \u043d\u0435\u0433\u043e \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u0449\u0438\u0439 <code>.env<\/code> \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442), \u0437\u0430\u0442\u0435\u043c <code>default:<\/code>. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 <strong>\u0432\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430<\/strong>: \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 input, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, <code>users=ten<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430, \u0447\u0438\u0441\u043b\u043e \u0432\u043d\u0435 <code>min<\/code>\/<code>max<\/code>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>choice<\/code> \u043d\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 <code>perfscale lint<\/code> \u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0430\u0434\u0451\u0442 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u0435.<\/p>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: inputs \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 <code>with:<\/code>\/<code>check:<\/code> \u0448\u0430\u0433\u043e\u0432, \u0430 <code>vus:<\/code> \u0438 <code>duration:<\/code> \u043f\u043e\u043a\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 inputs \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c.<\/p>\n<h4>\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 IP<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0435\u043d\u0430 \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u2014 <strong>~64 \u0442\u044b\u0441\u044f\u0447\u0438<\/strong>, \u0438 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u043d\u0435 \u0432 CPU \u0438 \u043d\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0432 \u0441\u0430\u043c TCP. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0442\u0432\u0451\u0440\u043a\u043e\u0439 (IP \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043f\u043e\u0440\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, IP \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u0440\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f): \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 64k. \u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u00abN \u0442\u044b\u0441\u044f\u0447 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u044f\u0442 \u043a\u0443\u0447\u0435\u0439 \u043c\u0430\u0448\u0438\u043d-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p><code>std\/http@v1<\/code> \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 ~64k \u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<pre><code class=\"yaml\">steps:  - use: std\/http@v1    with:      url: http:\/\/target:8080\/api      pool: dedicated                 # \u0441\u0432\u043e\u0451 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 VU      source_ips: [\"10.0.0.2\", \"10.0.0.16\/28\", \"fd00::\/120\"]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>gzip \u0432 std\/http@v1<\/h4>\n<p>\u0421\u0436\u0430\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b (<code>Content-Encoding: gzip<\/code>) \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c <code>Accept-Encoding: gzip<\/code> \u0432 <code>headers<\/code>, \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 <code>check:<\/code> \u0438 \u0432 \u043f\u0443\u0442\u0438 \u0432\u0438\u0434\u0430 <code>${{ feed.body.posts }}<\/code> \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON. \u041b\u0438\u043c\u0438\u0442 <code>max_response_body_bytes<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e gzip-\u0431\u043e\u043c\u0431\u0430 \u043d\u0435 \u0441\u044a\u0435\u0441\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0440\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 LLM \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, CVE \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0442).<\/p>\n<h4>Docker: \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a<\/h4>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0430 \u0431\u044b\u043b\u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430\u043c\u0438 \u0442\u0435\u0433\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 (<code>perfscale:0.29.0-k6<\/code>), \u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u00ab\u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0437 \u0441\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0440\u044f\u0434\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041e\u0431\u0440\u0430\u0437<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043e\u0441\u0442\u0430\u0432<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale<\/code><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e\u043b\u044c\u043a\u043e perfscale<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale-k6\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale-k6<\/code><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">+ k6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale-jmeter\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale-jmeter<\/code><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">+ JMeter<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale-locust\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale-locust<\/code><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">+ locust<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale-full\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale-full<\/code><\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0435 \u0434\u0432\u0438\u0436\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e k6 \u2014 <code>docker pull <\/code><a href=\"http:\/\/ghcr.io\/perfscale\/perfscale-k6:latest\" rel=\"noopener nofollow\"><code>ghcr.io\/perfscale\/perfscale-k6:latest<\/code><\/a>, \u0431\u0435\u0437 JRE \u0438 Python \u0432 \u0434\u043e\u0432\u0435\u0441\u043e\u043a. \u0421\u0442\u0430\u0440\u044b\u0435 \u0442\u0435\u0433\u0438 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0435 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f (\u043d\u0430\u0434\u0435\u044e\u0441\u044c).<\/p>\n<h4>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438: SyTester \u0432 \u043e\u0431\u0449\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445<\/h4>\n<p>\u0412 bench \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442 \u2014 <a href=\"https:\/\/gitverse.ru\/sbertech\/sytester\" rel=\"noopener nofollow\">SyTester<\/a> \u043e\u0442 \u0421\u0431\u0435\u0440\u0422\u0435\u0445\u0430. \u041e\u043d \u0432\u0441\u0442\u0430\u0451\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b throughput, saturation, gRPC \u0438 SQL \u0440\u044f\u0434\u043e\u043c \u0441 k6, locust \u0438 JMeter. VU-\u043c\u043e\u0434\u0435\u043b\u0438 \u0443 SyTester \u043d\u0435\u0442 \u2014 \u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 TPS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c (10 000 TPS \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043f\u043b\u0430\u043d\u0430). \u041d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 10 000 RPS \u043d\u0430 <code>GET \/health<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">RPS<\/p>\n<\/th>\n<th>\n<p align=\"left\">p99<\/p>\n<\/th>\n<th>\n<p align=\"left\">CPU \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<\/th>\n<th>\n<p align=\"left\">Peak RSS<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">perfscale (arrival)<\/p>\n<\/td>\n<td>\n<p align=\"left\">9 997<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.57 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">59 \u00b5s<\/p>\n<\/td>\n<td>\n<p align=\"left\">27.5 MiB<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SyTester<\/p>\n<\/td>\n<td>\n<p align=\"left\">9 406<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.68 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">743.5 \u00b5s<\/p>\n<\/td>\n<td>\n<p align=\"left\">945.9 MiB<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<blockquote>\n<p>\u042d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b (macOS); \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u2014 \u0432 CI-\u043e\u0442\u0447\u0451\u0442\u0435 bench. \u0417\u0430\u043e\u0434\u043d\u043e \u0432 workflow \u0431\u0435\u043d\u0447\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f input <code>apps<\/code> \u2014 \u0432\u044b\u0431\u043e\u0440 \u0434\u0432\u0438\u0436\u043a\u043e\u0432-\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 (<code>k6 jmeter locust sytester<\/code>), \u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 <code>suites<\/code> \u0438\u043b\u0438 <code>apps<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u043e\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u043e\u043d \u0441\u0440\u0430\u0437\u0443, \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043e\u0442\u0447\u0451\u0442\u0430.<\/p>\n<\/blockquote>\n<h3>\u0424\u0435\u0439\u043b\u044b \u043d\u0435\u0434\u0435\u043b\u0438<\/h3>\n<ol>\n<li>\n<p><strong>arrival \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b 85% \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.<\/strong> \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044f SyTester, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0441 \u043d\u0430\u0448\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e (<code>arrival:<\/code>) \u2014 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b\u0438: \u043d\u0430 10 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\/\u0441 perfscale \u0432\u044b\u0434\u0430\u0432\u0430\u043b 721 RPS \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b 42 777 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 256 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0445. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u2014 \u043a\u0430\u043d\u0430\u043b \u0432\u044b\u0434\u0430\u0447\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \u0432 \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0442: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 ~1 \u043c\u0441 \u0438 \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u043d\u0430\u043a\u043e\u043f\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0447\u043a\u043e\u0439, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u0447\u043a\u0438 \u0432\u0438\u0434\u0435\u043b\u0430 \u0437\u0430\u043d\u044f\u0442\u044b\u0439 \u0441\u043b\u043e\u0442 \u0438 \u0441\u0447\u0438\u0442\u0430\u043b\u0430, \u0447\u0442\u043e \u00ab\u0432\u0441\u0435 VU \u0437\u0430\u043d\u044f\u0442\u044b\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u0411\u044b\u043b\u043e 721 RPS, \u0441\u0442\u0430\u043b\u043e ~10 000 \u0441 \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0451\u043c \u043e\u0442\u0431\u0440\u043e\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043c\u043d\u043e\u0433\u043e <code>dropped_iterations<\/code> \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043d\u0430 v0.29.0+.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u044b\u043b \u043d\u0435\u0447\u0435\u0441\u0442\u043d\u044b\u043c.<\/strong> \u041f\u043e\u0440\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043e\u0442\u0447\u0451\u0442\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u044e\u0438\u0442\u0430\u0445 db, pubsub \u0438 boundary. \u041f\u043e\u0441\u043b\u0435 gRPC-\u0441\u0442\u0440\u043e\u043a\u0438 (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432) \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 \u0432\u0438\u0441\u0435\u043b\u043e <strong>16 292<\/strong> \u0441\u043e\u043a\u0435\u0442\u0430 \u0432 TIME_WAIT \u2014 \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u0435\u043c \u0431\u044b \u043e\u043d\u0430 \u043d\u0438 \u0431\u044b\u043b\u0430, \u043c\u0435\u0440\u0438\u043b\u0430 \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u044b, \u0430 \u043d\u0435 \u0434\u0432\u0438\u0436\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0431\u0435\u043d\u0447 \u0436\u0434\u0451\u0442, \u043f\u043e\u043a\u0430 TIME_WAIT \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u0435 1000.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u044d\u0448 CI \u0432\u044b\u0435\u0434\u0430\u043b \u0441\u0430\u043c \u0441\u0435\u0431\u044f.<\/strong> PR-\u043f\u0440\u043e\u0433\u043e\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438 \u0441\u0432\u043e\u0438 \u043a\u043e\u043f\u0438\u0438 Rust-\u043a\u044d\u0448\u0430 \u043f\u043e 2 \u0413\u0411, \u0430 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u0435\u0449\u0451 ~2.9 \u0413\u0411 \u043d\u0430 \u0442\u0435\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442. \u041b\u0438\u043c\u0438\u0442 \u0432 10 \u0413\u0411 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f, \u043a\u044d\u0448 <code>main<\/code> \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u043b\u0441\u044f, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 PR \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0441 \u043d\u0443\u043b\u044f: \u0448\u0430\u0433 \u0442\u0435\u0441\u0442\u043e\u0432 \u0448\u0451\u043b 8 \u043c\u0438\u043d\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u043e 4. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u044d\u0448 \u043f\u0438\u0448\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>main<\/code>, \u0430 \u0440\u0435\u043b\u0438\u0437\u044b \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u044e\u0442.<\/p>\n<\/li>\n<\/ol>\n<h2>Perfscale platform?<\/h2>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0435\u0442, \u043a\u0440\u043e\u043c\u0435 \u0431\u0430\u043c\u043f\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 perfscale oss \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438!<\/p>\n<p><strong>\u0421\u0441\u044b\u043b\u043a\u0438<\/strong><\/p>\n<ul>\n<li>\n<p>GitHub: <a href=\"http:\/\/github.com\/Perfscale\/perfscale\" rel=\"noopener nofollow\">github.com\/Perfscale\/perfscale<\/a><\/p>\n<\/li>\n<li>\n<p>RFC 009: <a href=\"https:\/\/github.com\/Perfscale\/perfscale\/blob\/main\/rfcs\/009-custom-sdk-steps.md\" rel=\"noopener nofollow\">rfcs\/009-custom-sdk-steps.md<\/a><\/p>\n<\/li>\n<li>\n<p>Node.js-\u0448\u0430\u0433\u0438: <a href=\"http:\/\/github.com\/Perfscale\/nodejs\" rel=\"noopener nofollow\">github.com\/Perfscale\/nodejs<\/a><\/p>\n<\/li>\n<li>\n<p>Faker: <a href=\"http:\/\/github.com\/Perfscale\/faker\" rel=\"noopener nofollow\">github.com\/Perfscale\/faker<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: \u0432 <a href=\"https:\/\/github.com\/Perfscale\/perfscale\/tree\/main\/docs\" rel=\"noopener nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> \u0438 \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 Docs \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 <code>perfscale serve --ui<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: <a href=\"http:\/\/perfscale.ru\" rel=\"noopener nofollow\">perfscale.ru<\/a> \u0438 <a href=\"http:\/\/perfscale.su\" rel=\"noopener nofollow\">perfscale.su<\/a><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u043b\u0438\u0437\u044b \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438: <a href=\"https:\/\/github.com\/Perfscale\/perfscale\/releases\" rel=\"noopener nofollow\">GitHub Releases<\/a>, npm <code>@perfscale\/exe<\/code><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1101848\/\">https:\/\/habr.com\/ru\/articles\/1101848\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e, \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 \u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0438\u043e\u043d\u0430\u043b\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438! \u0421\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u043e\u0448\u043b\u044b\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u043c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443:\u041f\u0440\u043e\u0448\u043b\u044b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0438\u041d\u043e\u0432\u043e\u0441\u0442\u0438 Perfscale \u2116\u00a01Perfscale news #2: Fix Protocol, Magic metrics \u0438\u00a0MCPperfscale news #3\u00a0Websocket, Inference, NPMPerfscale news #4. GRPC, Fixed Triggers, Child ProcessPerfscale news #5. SQL, Thresholds, \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 Linked AccountsPerfscale news #6. GraphQL, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Import, \u0438\u00a0\u043c\u0435\u0442\u0440\u0438\u043a\u0438Perfscale news #7. Fix Import, SOAP, and more HTTP metricsPerfscale news #8. WS\u00a0Benchmark, Jmeter open sourced &amp; fixed linked accountsPerfscale news #9. GPU, LLM, Docker imagesPerfscale news #10. Shared variables, Pub\/Sub load testing &amp; live metricsPerscale news #11. Fine\u2011grained token, SQID, stdout log streamingPerfscale news #12. WASM\u2011\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, SDK \u0434\u043b\u044f\u00a0\u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0438 \u00ab\u0436\u0438\u0432\u044b\u0435\u00bb \u043b\u043e\u0433\u0438Perfscale news #13. \u0412\u044b\u0436\u0438\u0433\u0430\u043d\u0438\u0435 WASM \u043c\u043e\u0434\u0443\u043b\u0435\u0439, http3\u00a0\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 postmortemPerfscale news #14. \u0424\u0438\u043a\u0441 fix, api reference \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 webrtcPerfscale news #15. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 bench, \u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u0441\u0435\u0440\u0432\u0435\u0440Perfscale news #16. SDK Report API, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 pro \u043c\u043e\u0434\u0443\u043b\u0438\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u2014 \u0432 v0.30.0 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d RFC 009: \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0448\u0430\u0433. \u041d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 use:-\u0448\u0430\u0433 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438. \u0412\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u2014 Node.js-\u0448\u0430\u0433\u0438 \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435, Faker, gzip, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 IP \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0444\u0435\u0439\u043b\u044b, \u043f\u043e\u0435\u0445\u0430\u043b\u0438Perfscale OSSRFC 009: \u0441\u0432\u043e\u0438 \u0448\u0430\u0433\u0438 \u043d\u0430 WASM\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043f\u0443\u0442\u0438: \u0432\u0442\u0438\u0441\u043d\u0443\u0442\u044c \u0435\u0451 \u0432 std\/tcp \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u0440\u043e\u0441\u0438\u0442\u044c PR \u0432 \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c pro-\u043c\u043e\u0434\u0443\u043b\u044c. \u041f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0432\u0435\u0440\u0445 TCP, \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u00ab\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439 \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u044c \u2192 \u0437\u0430\u043f\u0438\u0448\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0443\u00bb \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0443\u043f\u0438\u0440\u0430\u043b\u043e\u0441\u044c \u0432 \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (${mylib.fn(&#8230;)}), \u043d\u043e \u043d\u0435 \u0448\u0430\u0433\u0438.RFC 009 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u0434\u044b\u0440\u0443. \u0422\u043e\u0442 \u0436\u0435 WASM-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0433\u0438, \u0438 \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 use: \u043a\u0430\u043a lib\/&lt;alias&gt;\/&lt;step&gt;:libraries:  &#8212; use: .\/libs\/acme-signer.wasm    capabilities: [clock]    as: sigsteps:  &#8212; name: login    use: lib\/sig\/login          # \u0448\u0430\u0433 `login` \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430    outputs: auth    with:      user: &#171;trader-${{ vu }}&#187;      password: ${{ env.DESK_PASSWORD }}  &#8212; name: verify    use: std\/check@v1    with:      on: auth.session\u0414\u0430, \u044f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e lib\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0443\u0436\u0430\u0441\u043d\u044b\u0439. \u041c\u044b \u043f\u043e\u043a\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u044f\u0442\u044c &#171;std&#187; \u043e\u0442 &#171;\u043d\u0435 std&#187;\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f capability process \u2014 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u0440\u0435\u0437 \u0445\u043e\u0441\u0442 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0430, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c \u0438 \u0437\u0430\u0447\u0438\u0441\u0442\u043a\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u00ab\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439\u00bb \u0440\u0435\u0436\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u043e\u0439\u043d\u044b\u043c \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435\u043c: \u0433\u0440\u0430\u043d\u0442 \u0432 YAML, allow_library_capabilities: true \u0438 allow_process_actions: true. \u0411\u0435\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0451\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f.Node.js-\u0448\u0430\u0433\u0438 \u2014 \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 RFC 009\u041f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c process \u0441\u0442\u0430\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Perfscale\/nodejs \u0438 \u0441 \u043d\u0435\u0439 \u0442\u0440\u0438 \u0448\u0430\u0433\u0430:\u0428\u0430\u0433\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442lib\/nodejs\/install\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0441 nodejs.org, \u0441\u0432\u0435\u0440\u044f\u0435\u0442 SHA-256 \u0441 SHASUMS256.txt \u0434\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438, \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448lib\/nodejs\/exec\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 inline-\u0441\u043a\u0440\u0438\u043f\u0442 (node -e) \u0438\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 nodelib\/nodejs\/install-exec\u0421\u0442\u0430\u0432\u0438\u0442 (\u0438\u043b\u0438 \u0431\u0435\u0440\u0451\u0442 \u0438\u0437 \u043a\u044d\u0448\u0430) \u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442# config.yaml \u2014 \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043d\u0430 process + \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 node \u043e\u0434\u0438\u043d \u0440\u0430\u0437allow_library_capabilities: trueallow_process_actions: truelibraries:  &#8212; use: .\/nodejs.wasm    capabilities: [process]before:  &#8212; name: node    use: lib\/nodejs\/install    with:      node-version: 24.16.0      install-dir: .perfscale-tools\/nodejs    outputs: setup# test.yamlsteps:  &#8212; name: inline-script    use: lib\/nodejs\/exec    with:      node-path: &#171;${{ config.setup.node-path }}&#187;      script: console.log(`hello from node ${process.version}`)    check:      message_contains: hello from node v24.16.0\u0412\u0430\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e RPS \u0443 \u0432\u0430\u0441 \u0443\u043f\u0430\u0434\u0435\u0442 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 nodejs, \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 nodejs \u043d\u0435 \u0432\u044b\u0442\u0430\u0449\u0438\u0442 \u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e RPS, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c perfscale. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a\u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e shell: \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u2014 \u043f\u0440\u044f\u043c\u043e\u0439 argv \u0441 \u044f\u0432\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u0430 \u043d\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043a\u0430 Linux x86_64 \u0438 aarch64. \u0427\u0435\u0441\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u2014 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u2014 \u0430 \u043d\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043f\u0443\u0442\u044c \u043d\u0430 \u0442\u044b\u0441\u044f\u0447\u0438 RPS, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.\u0421\u043b\u0435\u0434\u043e\u043c \u0438\u0434\u0451\u0442 Python \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 standalone CPython, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 checksum, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0442\u0435 \u0436\u0435 \u0442\u0440\u0438 \u0448\u0430\u0433\u0430. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Perfscale\/python \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435.FakerPerfscale\/faker \u2014 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f payload\u2019\u043e\u0432: email, \u0430\u0434\u0440\u0435\u0441\u0430, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043b\u0430\u0442\u0451\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.libraries:  &#8212; use: .\/faker.wasm    capabilities: []steps:  &#8212; use: std\/http@v1    with:      method: POST      url: https:\/\/api.example.com\/signup      body:        email: &#171;${faker.internet(&#171;email&#187;)}&#187;        city: &#171;${faker.address(&#171;city&#187;)}&#187;Faker \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 GitHub Action \u2014 \u0442\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u0435\u0435\u0442 \u0442\u044f\u043d\u0443\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 GitHub Releases.\u0422\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 inputs: -i \u0438 -e\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0433\u043e\u043d\u044f\u044e\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445, \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438. \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0430\u0432\u043a\u043e\u0439 YAML \u0438\u043b\u0438 \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0444\u0438\u0433 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u0430, \u0448\u0430\u0433\u0438 \u0447\u0438\u0442\u0430\u044e\u0442 \u0438\u0445 \u043a\u0430\u043a ${{ inputs.&lt;name&gt; }}, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435:# config.yamlinputs:  users: number                                    # \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0431\u0435\u0437 default  host: # host    type: string    default: localhost  verbose: { type: bool, default: false }          # \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 0\/1\/false\/true  env: { type: choice, options: [staging, prod], default: staging } # \u043a\u0430\u043a \u0432 github actions  pacing_ms: { type: number, min: 1, max: 10000 }  # \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f number# test.yamlsteps:  &#8212; use: std\/http@v1    with:      url: &#171;https:\/\/${{ inputs.host }}\/api\/orders?env=${{ inputs.env }}&#187;\u041d\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:perfscale run -f test.yaml -c config.yaml -i users=10 -i env=prodperfscale run -f test.yaml -c config.yaml -i users=10,env=prod   # \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044eperfscale run -f test.yaml -c config.yaml -e staging.env          # \u0438\u0437 env-\u0444\u0430\u0439\u043b\u0430perfscale lint config.yaml -i users=10    # \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: -i \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0437\u0430\u0442\u0435\u043c env-\u0444\u0430\u0439\u043b (-e, \u0438\u0437 \u043d\u0435\u0433\u043e \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u0449\u0438\u0439 .env \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442), \u0437\u0430\u0442\u0435\u043c default:. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0432\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430: \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 input, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, users=ten \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u0430, \u0447\u0438\u0441\u043b\u043e \u0432\u043d\u0435 min\/max, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 choice \u043d\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 perfscale lint \u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0430\u0434\u0451\u0442 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u0435.\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: inputs \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 with:\/check: \u0448\u0430\u0433\u043e\u0432, \u0430 vus: \u0438 duration: \u043f\u043e\u043a\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 inputs \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c.\u041d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 IP\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0435\u043d\u0430 \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u2014 ~64 \u0442\u044b\u0441\u044f\u0447\u0438, \u0438 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u043d\u0435 \u0432 CPU \u0438 \u043d\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0432 \u0441\u0430\u043c TCP. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0442\u0432\u0451\u0440\u043a\u043e\u0439 (IP \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043f\u043e\u0440\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, IP \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u0440\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f): \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 64k. \u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u00abN \u0442\u044b\u0441\u044f\u0447 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u044f\u0442 \u043a\u0443\u0447\u0435\u0439 \u043c\u0430\u0448\u0438\u043d-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.std\/http@v1 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 ~64k \u043f\u043e\u0440\u0442\u043e\u0432:steps:  &#8212; use: std\/http@v1    with:      url: http:\/\/target:8080\/api      pool: dedicated                 # \u0441\u0432\u043e\u0451 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 VU      source_ips: [&#171;10.0.0.2&#187;, &#171;10.0.0.16\/28&#187;, &#171;fd00::\/120&#187;]gzip \u0432 std\/http@v1\u0421\u0436\u0430\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b (Content-Encoding: gzip) \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c Accept-Encoding: gzip \u0432 headers, \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 check: \u0438 \u0432 \u043f\u0443\u0442\u0438 \u0432\u0438\u0434\u0430 ${{ feed.body.posts }} \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON. \u041b\u0438\u043c\u0438\u0442 max_response_body_bytes \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e gzip-\u0431\u043e\u043c\u0431\u0430 \u043d\u0435 \u0441\u044a\u0435\u0441\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0440\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 LLM \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, CVE \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0442).Docker: \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a\u0420\u0430\u043d\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0430 \u0431\u044b\u043b\u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430\u043c\u0438 \u0442\u0435\u0433\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 (perfscale:0.29.0-k6), \u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u00ab\u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0437 \u0441\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0440\u044f\u0434\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442:\u041e\u0431\u0440\u0430\u0437\u0421\u043e\u0441\u0442\u0430\u0432ghcr.io\/perfscale\/perfscale\u0442\u043e\u043b\u044c\u043a\u043e perfscaleghcr.io\/perfscale\/perfscale-k6+ k6ghcr.io\/perfscale\/perfscale-jmeter+ JMeterghcr.io\/perfscale\/perfscale-locust+ locustghcr.io\/perfscale\/perfscale-full\u0432\u0441\u0435 \u0434\u0432\u0438\u0436\u043a\u0438\u041d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e k6 \u2014 docker pull ghcr.io\/perfscale\/perfscale-k6:latest, \u0431\u0435\u0437 JRE \u0438 Python \u0432 \u0434\u043e\u0432\u0435\u0441\u043e\u043a. \u0421\u0442\u0430\u0440\u044b\u0435 \u0442\u0435\u0433\u0438 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0435 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f (\u043d\u0430\u0434\u0435\u044e\u0441\u044c).\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438: SyTester \u0432 \u043e\u0431\u0449\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445\u0412 bench \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442 \u2014 SyTester \u043e\u0442 \u0421\u0431\u0435\u0440\u0422\u0435\u0445\u0430. \u041e\u043d \u0432\u0441\u0442\u0430\u0451\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b throughput, saturation, gRPC \u0438 SQL \u0440\u044f\u0434\u043e\u043c \u0441 k6, locust \u0438 JMeter. VU-\u043c\u043e\u0434\u0435\u043b\u0438 \u0443 SyTester \u043d\u0435\u0442 \u2014 \u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 TPS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c (10 000 TPS \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043f\u043b\u0430\u043d\u0430). \u041d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 10 000 RPS \u043d\u0430 GET \/health:RPSp99CPU \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441Peak RSSperfscale (arrival)9 9970.57 \u043c\u044159 \u00b5s27.5 MiBSyTester9 4069.68 \u043c\u0441743.5 \u00b5s945.9 MiB\u042d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b (macOS); \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u2014 \u0432 CI-\u043e\u0442\u0447\u0451\u0442\u0435 bench. \u0417\u0430\u043e\u0434\u043d\u043e \u0432 workflow \u0431\u0435\u043d\u0447\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f input apps \u2014 \u0432\u044b\u0431\u043e\u0440 \u0434\u0432\u0438\u0436\u043a\u043e\u0432-\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 (k6 jmeter locust sytester), \u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 suites \u0438\u043b\u0438 apps \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u043e\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u043e\u043d \u0441\u0440\u0430\u0437\u0443, \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043e\u0442\u0447\u0451\u0442\u0430.\u0424\u0435\u0439\u043b\u044b \u043d\u0435\u0434\u0435\u043b\u0438arrival \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b 85% \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044f SyTester, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0441 \u043d\u0430\u0448\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e (arrival:) \u2014 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b\u0438: \u043d\u0430 10 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\/\u0441 perfscale \u0432\u044b\u0434\u0430\u0432\u0430\u043b 721 RPS \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b 42 777 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 256 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u0445. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u2014 \u043a\u0430\u043d\u0430\u043b \u0432\u044b\u0434\u0430\u0447\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \u0432 \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0442: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 ~1 \u043c\u0441 \u0438 \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u043d\u0430\u043a\u043e\u043f\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0447\u043a\u043e\u0439, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u0447\u043a\u0438 \u0432\u0438\u0434\u0435\u043b\u0430 \u0437\u0430\u043d\u044f\u0442\u044b\u0439 \u0441\u043b\u043e\u0442 \u0438 \u0441\u0447\u0438\u0442\u0430\u043b\u0430, \u0447\u0442\u043e \u00ab\u0432\u0441\u0435 VU \u0437\u0430\u043d\u044f\u0442\u044b\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u0411\u044b\u043b\u043e 721 RPS, \u0441\u0442\u0430\u043b\u043e ~10 000 \u0441 \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0451\u043c \u043e\u0442\u0431\u0440\u043e\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043c\u043d\u043e\u0433\u043e dropped_iterations \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043d\u0430 v0.29.0+.\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u044b\u043b&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-501082","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501082","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=501082"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/501082\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=501082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=501082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=501082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}