From 25cc738b515389958bab31ab6330d55ac79fbec7 Mon Sep 17 00:00:00 2001 From: Fatman13 Date: Tue, 21 Nov 2023 00:13:16 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20filecoin?= =?UTF-8?q?-project/venus-docs@1669d9d5cb8c06633c7b28eb3c4369fa4481bb68=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 8 ++++---- _Footer.html | 6 +++--- about/index.html | 6 +++--- .../css/{0.styles.40e8f073.css => 0.styles.70d1da1f.css} | 2 +- assets/js/{16.c99ecbd6.js => 16.b28bb91b.js} | 2 +- assets/js/{4.68e635da.js => 4.506518be.js} | 2 +- assets/js/{41.975ee77f.js => 41.eb1abcbb.js} | 2 +- assets/js/{47.13c3ce60.js => 47.9774ef43.js} | 2 +- assets/js/{48.e1755c59.js => 48.f42847d6.js} | 2 +- assets/js/{49.7d3b2caf.js => 49.997ffffa.js} | 2 +- assets/js/{5.45d22d5f.js => 5.34e2ab1e.js} | 2 +- assets/js/{app.717d6d60.js => app.e0c9c672.js} | 4 ++-- index.html | 6 +++--- intro/_Footer.html | 6 +++--- intro/contribute-docs.html | 6 +++--- intro/damocles.html | 6 +++--- intro/droplet.html | 6 +++--- intro/index.html | 6 +++--- intro/one-pager.html | 6 +++--- intro/sophon.html | 6 +++--- operation/Efficiency_of_sealing.html | 6 +++--- operation/System_monitor_of_Zabbix.html | 6 +++--- operation/_Footer.html | 6 +++--- operation/example-single-box.html | 6 +++--- operation/index.html | 6 +++--- operation/lotus-vs-venus.html | 6 +++--- operation/nv15-upgrade.html | 6 +++--- operation/nv16-upgrade.html | 6 +++--- operation/nv17-upgrade.html | 6 +++--- operation/nv18-upgrade.html | 6 +++--- operation/nv19-upgrade.html | 6 +++--- questions.html | 6 +++--- zh/TODO.html | 6 +++--- zh/about/index.html | 6 +++--- zh/index.html | 6 +++--- zh/intro/_Footer.html | 6 +++--- zh/intro/contribute-doc.html | 6 +++--- zh/intro/damocles.html | 6 +++--- zh/intro/droplet.html | 6 +++--- zh/intro/index.html | 6 +++--- zh/intro/one-pager.html | 6 +++--- zh/intro/sophon.html | 6 +++--- zh/operation/Efficiency_of_sealing.html | 6 +++--- zh/operation/Independent_com_access_analysis.html | 6 +++--- zh/operation/Sealing_deploy_plan_1.html | 6 +++--- zh/operation/Sealing_deploy_plan_2.html | 6 +++--- zh/operation/System_monitor_of_Zabbix.html | 6 +++--- zh/operation/_Footer.html | 6 +++--- zh/operation/example-single-box.html | 6 +++--- zh/operation/index.html | 6 +++--- zh/operation/lotus-vs-venus.html | 6 +++--- zh/operation/migrate_market_v1_to_v2.html | 6 +++--- zh/operation/nv15-upgrade.html | 6 +++--- zh/operation/nv16-upgrade.html | 6 +++--- zh/operation/nv17-upgrade.html | 6 +++--- zh/operation/nv18-upgrade.html | 6 +++--- zh/operation/nv19-upgrade.html | 6 +++--- zh/operation/prometheus-instruction.html | 6 +++--- zh/operation/troubleshoot-consensus-fault.html | 6 +++--- 59 files changed, 161 insertions(+), 161 deletions(-) rename assets/css/{0.styles.40e8f073.css => 0.styles.70d1da1f.css} (95%) rename assets/js/{16.c99ecbd6.js => 16.b28bb91b.js} (92%) rename assets/js/{4.68e635da.js => 4.506518be.js} (62%) rename assets/js/{41.975ee77f.js => 41.eb1abcbb.js} (99%) rename assets/js/{47.13c3ce60.js => 47.9774ef43.js} (97%) rename assets/js/{48.e1755c59.js => 48.f42847d6.js} (95%) rename assets/js/{49.7d3b2caf.js => 49.997ffffa.js} (98%) rename assets/js/{5.45d22d5f.js => 5.34e2ab1e.js} (88%) rename assets/js/{app.717d6d60.js => app.e0c9c672.js} (91%) diff --git a/404.html b/404.html index 436a3ea79..8d2fb56f6 100644 --- a/404.html +++ b/404.html @@ -13,13 +13,13 @@ gtag('config', 'G-SMSDTMGLTV'); - - + + -

404

Looks like we've got some broken links.
+ - + diff --git a/_Footer.html b/_Footer.html index 49096edec..b684cd89a 100644 --- a/_Footer.html +++ b/_Footer.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/about/index.html b/about/index.html index 06afe73ce..ccd0002d1 100644 --- a/about/index.html +++ b/about/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/assets/css/0.styles.40e8f073.css b/assets/css/0.styles.70d1da1f.css similarity index 95% rename from assets/css/0.styles.40e8f073.css rename to assets/css/0.styles.70d1da1f.css index 51cb7f28b..634ed4d67 100644 --- a/assets/css/0.styles.40e8f073.css +++ b/assets/css/0.styles.70d1da1f.css @@ -1 +1 @@ -.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}svg[data-v-49140617]{position:absolute;right:7.5px;opacity:.75;cursor:pointer}svg.hover[data-v-49140617]{opacity:0}svg[data-v-49140617]:hover{opacity:1!important}span[data-v-49140617]{position:absolute;font-size:.85rem;line-height:.425rem;right:50px;opacity:0;transition:opacity .5s}.success[data-v-49140617]{opacity:1!important}.code-copy-added:hover>.code-copy svg{opacity:.75}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#00d2d6}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#00d2d6}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}a.sidebar-link.active[data-v-5fd4ef0c],a[data-v-5fd4ef0c]{color:#00aaac}.hero h1[data-v-5fd4ef0c],.navbar .site-name[data-v-5fd4ef0c]{font-family:Oxygen}.go-to-top[data-v-5fd4ef0c]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#00d2d6;z-index:1}.go-to-top[data-v-5fd4ef0c]:hover{color:#30fbff}@media (max-width:959px){.go-to-top[data-v-5fd4ef0c]{display:none}}.fade-enter-active[data-v-5fd4ef0c],.fade-leave-active[data-v-5fd4ef0c]{transition:opacity .3s}.fade-enter[data-v-5fd4ef0c],.fade-leave-to[data-v-5fd4ef0c]{opacity:0}#nprogress{pointer-events:none}#nprogress .bar{background:#00d2d6;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #00d2d6,0 0 5px #00d2d6;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#00d2d6 transparent transparent #00d2d6;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#00d2d6;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #00bdc1}.home .hero .action-button:hover{background-color:#00eff4}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.237d6f6a.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#00d2d6}.search-box .suggestions{background:#fff;min-width:500px;max-width:700px;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;border-radius:4px;cursor:pointer;width:100%}.search-box .suggestion a{display:block;white-space:normal;color:#415b75;width:100%}.search-box .suggestion a .parent-page-title{color:#fff;font-weight:600;background-color:#00d2d6;padding:5px}.search-box .suggestion a .suggestion-row{border-collapse:collapse;width:100%;display:table}.search-box .suggestion a .suggestion-row .page-title{width:35%;background:#f5f5f5;border:1px solid #eaecef;border-left:none;display:table-cell;text-align:right;padding:5px;font-weight:600}.search-box .suggestion a .suggestion-row .suggestion-content{font-weight:400;border:1px solid #eaecef;border-right:none;width:65%;display:table-cell;padding:5px}.search-box .suggestion a .suggestion-row .suggestion-content .highlight{text-decoration:underline}.search-box .suggestion a .suggestion-row .suggestion-content .header{font-weight:600}.search-box .suggestion.focused{background-color:#f3f4f5}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#00d2d6}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#00d2d6}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #00d2d6;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#00d2d6}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #00e9ee}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#00d2d6;border-left-color:#00d2d6}.sidebar-heading.clickable:hover{color:#00d2d6}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#00d2d6}a.sidebar-link.active{font-weight:600;color:#00d2d6;border-left-color:#00d2d6}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}a,a.sidebar-link.active{color:#00aaac}.hero h1,.navbar .site-name{font-family:Oxygen}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}a.sidebar-link.active[data-v-15b7b770],a[data-v-15b7b770]{color:#00aaac}.hero h1[data-v-15b7b770],.navbar .site-name[data-v-15b7b770]{font-family:Oxygen}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}@font-face{font-family:Oxygen;font-style:normal;font-weight:400;src:url(/assets/fonts/oxygen/Oxygen-Regular.ttf)}@font-face{font-family:Oxygen;font-weight:300;src:url(/assets/fonts/oxygen/Oxygen-Light.ttf)}@font-face{font-family:Oxygen;font-weight:700;src:url(/assets/fonts/oxygen/Oxygen-Bold.ttf)}a.sidebar-link.active[data-v-32c2d7ed],a[data-v-32c2d7ed]{color:#00aaac}.hero h1[data-v-32c2d7ed],.navbar .site-name[data-v-32c2d7ed]{font-family:Oxygen}.theme-code-group__nav[data-v-32c2d7ed]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-32c2d7ed]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-32c2d7ed]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-32c2d7ed]{border-bottom:1px solid #42b983}.pre-blank[data-v-32c2d7ed]{color:#42b983}.theme-code-block[data-v-6d04095e]{display:none}.theme-code-block__active[data-v-6d04095e]{display:block}.theme-code-block>pre[data-v-6d04095e]{background-color:orange} \ No newline at end of file +.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}svg[data-v-49140617]{position:absolute;right:7.5px;opacity:.75;cursor:pointer}svg.hover[data-v-49140617]{opacity:0}svg[data-v-49140617]:hover{opacity:1!important}span[data-v-49140617]{position:absolute;font-size:.85rem;line-height:.425rem;right:50px;opacity:0;transition:opacity .5s}.success[data-v-49140617]{opacity:1!important}.code-copy-added:hover>.code-copy svg{opacity:.75}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#00d2d6}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#00d2d6}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}a.sidebar-link.active[data-v-5fd4ef0c],a[data-v-5fd4ef0c]{color:#00aaac}.hero h1[data-v-5fd4ef0c],.navbar .site-name[data-v-5fd4ef0c]{font-family:Oxygen}.go-to-top[data-v-5fd4ef0c]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#00d2d6;z-index:1}.go-to-top[data-v-5fd4ef0c]:hover{color:#30fbff}@media (max-width:959px){.go-to-top[data-v-5fd4ef0c]{display:none}}.fade-enter-active[data-v-5fd4ef0c],.fade-leave-active[data-v-5fd4ef0c]{transition:opacity .3s}.fade-enter[data-v-5fd4ef0c],.fade-leave-to[data-v-5fd4ef0c]{opacity:0}#nprogress{pointer-events:none}#nprogress .bar{background:#00d2d6;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #00d2d6,0 0 5px #00d2d6;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#00d2d6 transparent transparent #00d2d6;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#00d2d6;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #00bdc1}.home .hero .action-button:hover{background-color:#00eff4}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.237d6f6a.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#00d2d6}.search-box .suggestions{background:#fff;min-width:500px;max-width:700px;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;border-radius:4px;cursor:pointer;width:100%}.search-box .suggestion a{display:block;white-space:normal;color:#415b75;width:100%}.search-box .suggestion a .parent-page-title{color:#fff;font-weight:600;background-color:#00d2d6;padding:5px}.search-box .suggestion a .suggestion-row{border-collapse:collapse;width:100%;display:table}.search-box .suggestion a .suggestion-row .page-title{width:35%;background:#f5f5f5;border:1px solid #eaecef;border-left:none;display:table-cell;text-align:right;padding:5px;font-weight:600}.search-box .suggestion a .suggestion-row .suggestion-content{font-weight:400;border:1px solid #eaecef;border-right:none;width:65%;display:table-cell;padding:5px}.search-box .suggestion a .suggestion-row .suggestion-content .highlight{text-decoration:underline}.search-box .suggestion a .suggestion-row .suggestion-content .header{font-weight:600}.search-box .suggestion.focused{background-color:#f3f4f5}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#00d2d6}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#00d2d6}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #00d2d6;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#00d2d6}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #00e9ee}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#00d2d6;border-left-color:#00d2d6}.sidebar-heading.clickable:hover{color:#00d2d6}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#00d2d6}a.sidebar-link.active{font-weight:600;color:#00d2d6;border-left-color:#00d2d6}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}a,a.sidebar-link.active{color:#00aaac}.hero h1,.navbar .site-name{font-family:Oxygen}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}a.sidebar-link.active[data-v-15b7b770],a[data-v-15b7b770]{color:#00aaac}.hero h1[data-v-15b7b770],.navbar .site-name[data-v-15b7b770]{font-family:Oxygen}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-6d04095e]{display:none}.theme-code-block__active[data-v-6d04095e]{display:block}.theme-code-block>pre[data-v-6d04095e]{background-color:orange}@font-face{font-family:Oxygen;font-style:normal;font-weight:400;src:url(/assets/fonts/oxygen/Oxygen-Regular.ttf)}@font-face{font-family:Oxygen;font-weight:300;src:url(/assets/fonts/oxygen/Oxygen-Light.ttf)}@font-face{font-family:Oxygen;font-weight:700;src:url(/assets/fonts/oxygen/Oxygen-Bold.ttf)}a.sidebar-link.active[data-v-32c2d7ed],a[data-v-32c2d7ed]{color:#00aaac}.hero h1[data-v-32c2d7ed],.navbar .site-name[data-v-32c2d7ed]{font-family:Oxygen}.theme-code-group__nav[data-v-32c2d7ed]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-32c2d7ed]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-32c2d7ed]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-32c2d7ed]{border-bottom:1px solid #42b983}.pre-blank[data-v-32c2d7ed]{color:#42b983} \ No newline at end of file diff --git a/assets/js/16.c99ecbd6.js b/assets/js/16.b28bb91b.js similarity index 92% rename from assets/js/16.c99ecbd6.js rename to assets/js/16.b28bb91b.js index 18803b3b1..5dd93c448 100644 --- a/assets/js/16.c99ecbd6.js +++ b/assets/js/16.b28bb91b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{332:function(t,e,n){t.exports=n.p+"assets/img/sophon-banner.6a83f125.jpg"},431:function(t,e,n){"use strict";n.r(e);var s=n(17),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("img",{attrs:{src:n(332),alt:"sophon"}})]),t._v(" "),s("h3",{attrs:{id:"智子"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#智子"}},[t._v("#")]),t._v(" 智子")]),t._v(" "),s("p",[t._v("智子,原 Venus 链服务,是一个 Filecoin 超级节点解决方案。请在"),s("a",{attrs:{href:"https://sophon.venus-fil.io/zh/",target:"_blank",rel:"noopener noreferrer"}},[t._v("此"),s("OutboundLink")],1),t._v("了解更多关于智子的信息。")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{332:function(t,e,n){t.exports=n.p+"assets/img/sophon-banner.6a83f125.jpg"},430:function(t,e,n){"use strict";n.r(e);var s=n(17),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("img",{attrs:{src:n(332),alt:"sophon"}})]),t._v(" "),s("h3",{attrs:{id:"智子"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#智子"}},[t._v("#")]),t._v(" 智子")]),t._v(" "),s("p",[t._v("智子,原 Venus 链服务,是一个 Filecoin 超级节点解决方案。请在"),s("a",{attrs:{href:"https://sophon.venus-fil.io/zh/",target:"_blank",rel:"noopener noreferrer"}},[t._v("此"),s("OutboundLink")],1),t._v("了解更多关于智子的信息。")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/4.68e635da.js b/assets/js/4.506518be.js similarity index 62% rename from assets/js/4.68e635da.js rename to assets/js/4.506518be.js index 8fc0bc77f..d639216c5 100644 --- a/assets/js/4.68e635da.js +++ b/assets/js/4.506518be.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{352:function(e,t,c){},393:function(e,t,c){"use strict";c(352)},398:function(e,t,c){"use strict";c.r(t);var i={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}}},n=(c(393),c(17)),s=Object(n.a)(i,(function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"6d04095e",null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{351:function(e,t,c){},392:function(e,t,c){"use strict";c(351)},397:function(e,t,c){"use strict";c.r(t);var i={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}}},n=(c(392),c(17)),s=Object(n.a)(i,(function(){var e=this.$createElement;return(this._self._c||e)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"6d04095e",null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/41.975ee77f.js b/assets/js/41.eb1abcbb.js similarity index 99% rename from assets/js/41.975ee77f.js rename to assets/js/41.eb1abcbb.js index 391ac9893..0c2c44d83 100644 --- a/assets/js/41.975ee77f.js +++ b/assets/js/41.eb1abcbb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{430:function(t,s,a){"use strict";a.r(s);var e=a(17),r=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"venus-集群最大化利用资源增长算力方案"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#venus-集群最大化利用资源增长算力方案"}},[t._v("#")]),t._v(" Venus-集群最大化利用资源增长算力方案")]),t._v(" "),a("p",[t._v("   在 Filecoin 的网络中,算力大小至关重要,与矿工的收入息息相关。算力的增长与维持需要软硬件资源较多,每个扇区的密封需要 P1、P2、C1,C2 等\n诸多过程,并且每个过程所依赖的资源各不相同,如:P1 偏向多核 CPU,P4 可用 GPU 优化等。故如何找出能最大化利用现有资源提升算力的方案是一个复杂的过程。这篇文章为如何找出最优方案提供一些思路。")]),t._v(" "),a("h2",{attrs:{id:"总体思路"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#总体思路"}},[t._v("#")]),t._v(" 总体思路")]),t._v(" "),a("blockquote",[a("p",[t._v("本文方案是通过各个阶段的任务耗时来推算如何均衡的分配各阶段任务的机器数量占比")])]),t._v(" "),a("ul",[a("li",[t._v("根据实际场景,将所有加速配置都打开,做几个 sector,统计每个阶段任务耗时。每个阶段对硬件资源的的依赖如下:\n"),a("ul",[a("li",[t._v("P1:cpu 及磁盘 io")])]),t._v(" "),a("ul",[a("li",[t._v("P2:cpu,gpu,带宽及磁盘 io")]),t._v(" "),a("li",[t._v("C1-C2:cpu,gpu,带宽及磁盘 io")])])])]),t._v(" "),a("blockquote",[a("p",[t._v("这里多做几个是为了统计出较稳定的耗时,此阶段需保持加速设置及软硬件资源始终不变。")])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("维持任务数平衡,即每个机器都有任何时刻都有任务可做,理论上每个阶段任务数与耗时成反比;")])]),t._v(" "),a("li",[a("p",[t._v("扇区任务由 pledge 命令控制,配合最大并发密封扇区数(MaxSealingSectors)管理集群中 sector 并发数量;")])]),t._v(" "),a("li",[a("p",[t._v("每个 worker 可以指定可接受的任务类型。")])])]),t._v(" "),a("h2",{attrs:{id:"任务耗时统计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#任务耗时统计"}},[t._v("#")]),t._v(" 任务耗时统计")]),t._v(" "),a("p",[t._v("   worker 可以领取的任务类型有:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('TTAddPiece TaskType = "seal/v0/addpiece"\nTTPreCommit1 TaskType = "seal/v0/precommit/1"\nTTPreCommit2 TaskType = "seal/v0/precommit/2"\nTTCommit1 TaskType = "seal/v0/commit/1" // NOTE: We use this to transfer the sector into miner-local storage for now; Don\'t use on workers!\nTTCommit2 TaskType = "seal/v0/commit/2"\n\nTTFinalize TaskType = "seal/v0/finalize"\n\nTTFetch TaskType = "seal/v0/fetch"\nTTUnseal TaskType = "seal/v0/unseal"\n\n')])])]),a("p",[t._v("   每个任务都分为两个阶段:prepare 阶段和 worker 阶段,在日志中表现为:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("# seal/v0/fetch\n2021-08-03T14:00:07.925+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/fetch ...\n2021-08-03T14:05:36.772+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/fetch end ...\n\n2021-08-03T14:05:36.772+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/fetch ...\n2021-08-03T14:05:36.774+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/fetch end ...\n\n# seal/v0/addpiece\n2021-08-03T13:38:37.977+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 8 prepare for seal/v0/addpiece ...\n2021-08-03T13:38:37.978+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 8 prepare for seal/v0/addpiece end ...\n\n2021-08-03T13:38:37.978+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 8 work for seal/v0/addpiece ...\n2021-08-03T13:44:26.295+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 8 work for seal/v0/addpiece end ...\n\n# seal/v0/commit/2\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/commit/2 ...\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/commit/2 end ...\n\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/commit/2 ...\n2021-08-03T13:49:46.180+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/commit/2 end ...\n\n# seal/v0/finalize\n2021-08-03T13:54:17.414+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/finalize ...\n2021-08-03T13:59:30.471+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/finalize end ...\n\n2021-08-03T13:59:30.471+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/finalize ...\n2021-08-03T14:00:07.915+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/finalize end ...\n\n")])])]),a("p",[t._v("   可以看出有些任务在 prepare 阶段比较耗时,有些在 work 阶段比较耗时,一般来说需要网路传输,带宽资源的在 prepare 比较耗时,如 fetch,finalize 等;而需要计算的任务在 work 阶段比较耗时,如 AP,P1,P2,C2 等。")]),t._v(" "),a("p",[t._v("   为了便于计算,这里将任务阶段进行合并,主要分为:AP,P1,P2,C2 阶段,将这四个阶段之前的仍无耗时统一归为相应阶段的耗时,如 T(P1)=P1 耗时+P1 前的 fetch 耗时。这里 waitseed 怎么归类,在后面的时间逻辑中有没有考虑进去")]),t._v(" "),a("h2",{attrs:{id:"速率因子"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#速率因子"}},[t._v("#")]),t._v(" 速率因子")]),t._v(" "),a("h3",{attrs:{id:"临时存储设备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#临时存储设备"}},[t._v("#")]),t._v(" 临时存储设备")]),t._v(" "),a("p",[t._v("  Filecoin 在封装算力是会产生一些临时文件,在任务的进行中存在很多随机存取,这就要求磁盘吞吐量不能太差,否则会导致磁盘 IO 过高,计算资源等待磁盘读取处于闲置状态。")]),t._v(" "),a("ul",[a("li",[t._v("如何挑选适合的设备")])]),t._v(" "),a("p",[t._v("  如何寻找适合的设备,其实就是需要多少的磁盘吞吐量,可以通过一个简单的计算公式得到它。")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("文件大小 * 线程并行数量 / 运行时间 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 平均每秒钟传输速度\n \n因为每个阶段的吞吐不同,拆分计算可以让得到的数据更精准\n \nP1 读取 + P1 写入 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" P1 阶段所需的吞吐量,其他阶段相同,把所有阶段所需的吞吐加起来就得到了所需的吞吐量,当然需要一些性能上的冗余\n")])])]),a("p",[t._v("  通常情况下绝大多数的矿工都会使用 SSD 或者 NVME,当有多块硬盘时我们可以通过"),a("code",[t._v("venus-worker storage attach --seal ")]),t._v("命令或者启动多个 worker 来设置多个路径,但这并不是一个比较好的方法,路径过于分散会导致后续的维护相对复杂,无法充分利用,通过创建 raid 方式可以获得更好的性能和空间利用率,并且便于后续的维护。")]),t._v(" "),a("ul",[a("li",[t._v("软 raid 创建")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mdadm")]),t._v(" -C /dev/md1 -l "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" -n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" /dev/sdb1 /dev/sdc1\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mdadm")]),t._v(" -C /dev/md2 -l "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" -n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" /dev/sd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b-g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n-C $创建软件RAID\n-l $指定RAID级别 "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("表示raid1 其他同理 \n-n $指定磁盘个数\n-x $指定备用设备个数\n-A $重组之前的设备\n")])])]),a("p",[t._v("​\t有关 mdadm 用法、MD 和各种级别的 RAID 的更多信息,请参阅:http://raid.wiki.kernel.org/")]),t._v(" "),a("p",[t._v("​\t获取最新版本的 mdadm 应始终可以从如下链接获取:http://www.kernel.org/pub/linux/utils/raid/mdadm/")]),t._v(" "),a("p",[t._v("​\t硬 raid 创建时请查看您的 raid 卡型号和说明进行操作")]),t._v(" "),a("h3",{attrs:{id:"永久存储设备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#永久存储设备"}},[t._v("#")]),t._v(" 永久存储设备")]),t._v(" "),a("p",[t._v("   永久存储设备的访问机制和可能遇到的问题:")]),t._v(" "),a("ol",[a("li",[t._v("在每个任务阶段产生的文件有些是要永久存储的,用于 wdPoSt 或 winningPoSt,在每个 sector 完成阶段需要传输到永久存储目录,这个过程需要带宽资源,并且要保证磁盘 io;")]),t._v(" "),a("li",[t._v("wdPoSt 大量的随机读取非常小的文件,这可能会导致读取过慢而影响时空证明导致算力惩罚;")]),t._v(" "),a("li",[t._v("当存储过于集中时,少量的机器损坏会导致所有的数据丢失;")]),t._v(" "),a("li",[t._v("当磁盘过多时,并且盘符没有固定,启动时可能导致盘符移动;")]),t._v(" "),a("li",[t._v("如果是 raid,尽量选择 raid5 或者 raid6,raid10 这种冗余性更高的方式;")]),t._v(" "),a("li",[t._v("需要监控磁盘空间利用率并报警。")])]),t._v(" "),a("h3",{attrs:{id:"网络传输"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网络传输"}},[t._v("#")]),t._v(" 网络传输")]),t._v(" "),a("p",[t._v("   网络传输会有两个部分:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("临时数据的网络传输,某个阶段的任务需要上个阶段的数据时会用 http 协议请求所需文件,需要保证传输时间小于计算时间。")]),t._v(" "),a("p",[t._v("举例:\n传输往往和计算是同步进行的")]),t._v(" "),a("p",[t._v("传输时间 > 计算时间 资源闲置,计算资源等待网络资源,拉长整个扇区封装的声明周期,就是降产")]),t._v(" "),a("p",[t._v("传输时间 < 计算时间 计算资源充分利用")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("观察计算资源是否出现闲置")])]),t._v(" "),a("li",[a("p",[t._v("计算网络传输速度能否满足计算时间")]),t._v(" "),a("p",[t._v("Precommit2 如果计算耗时 25 分钟,读取 440G 左右文件,写入 100G 左右文件"),a("br"),t._v("\n(440G * 1024 / 25 / 60) + (100G * 1024 / 25 / 60) = 单个线程所需的吞吐量")])]),t._v(" "),a("li",[a("p",[t._v("多台机器同步阶段的文件传输")]),t._v(" "),a("p",[t._v("我们有 A,B,C 三个机器分别负责 P1,P2,Commit")]),t._v(" "),a("p",[t._v("当 A 机器开始 P1 时会向 B 机器的 P2 传输 32G 左右的 Unsealed")]),t._v(" "),a("p",[t._v("当 B 机器开始 P2 时,A 机器的 P1 生成的 440G 左右所有文件会传输到 B 的机器上")]),t._v(" "),a("p",[t._v("Commit 又分为 C1 和 C2.当 C 机器运行 C1 时需要 P1 和 P2 的所有文件,计算的结果通过内存直接传递给 C2,所以并不会在落盘新的文件")])])])]),t._v(" "),a("li",[a("p",[t._v("最终数据传输,我们要知道当最终的存储也会成为我们的产量瓶颈(貌似和下面的不符合)")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("假设计算资源的产量是每天产出 6T 的算力,但如果存储的网络传输最大每天只能传输 5T,那么这就会导致产量的下降")])]),t._v(" "),a("li",[a("p",[t._v("如果我们使用了 NFS 这样的网络文件系统,当网络断开链接是,NFS 往往是会直接卡死的,所以可能需要设置 NFS 的超时机制")])])])])]),t._v(" "),a("h3",{attrs:{id:"worker-的指令集加速"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#worker-的指令集加速"}},[t._v("#")]),t._v(" worker 的指令集加速")]),t._v(" "),a("p",[t._v("   P1 阶段时,使用 SHA 指令集和不使用指令集会有巨大的差距,目前大多数矿工都采用 AMD 型号的 CPU 原因就是 SHA 指令集的关系,研究发现,使用 SHA 指令集基本可以跑进 250 分钟以内,但不使用 SHA 指令集能够跑进 420 分钟已经非常艰难了")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("确保编译时使用RUSTFLAGS=\"-C target-cpu=native -g\" FFI_BUILD_FROM_SOURCE=\"1\" 源码编译filecoin-ffi库,如果cpu支持则启用SHA扩展,这会大幅提高扇区封装速度,源码编译(make deps)时特征如下:\n\n+ trap '{ rm -f $__build_output_log_tmp; }' EXIT\n+ local '__rust_flags=--print native-static-libs -C target-feature=+sse2'\n+ RUSTFLAGS='--print native-static-libs -C target-feature=+sse2'\n+ cargo +nightly-2021-04-24 build --release --no-default-features --features multicore-sdr --features pairing,gpu\n+ tee /tmp/tmp.IYtnd3xka9\n Compiling autocfg v1.0.1\n Compiling libc v0.2.97\n Compiling cfg-if v1.0.0\n Compiling proc-macro2 v1.0.27\n Compiling unicode-xid v0.2.2\n Compiling syn v1.0.73\n Compiling lazy_static v1.4.0\n Compiling cc v1.0.68\n Compiling typenum v1.13.0\n Compiling serde_derive v1.0.126\n Compiling serde v1.0.126\n")])])]),a("h3",{attrs:{id:"核数限制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#核数限制"}},[t._v("#")]),t._v(" 核数限制")]),t._v(" "),a("p",[t._v("​\t当想要把 CPU 的资源利用的更高时,需要非常合理的规划 CPU 的使用,比如有一个 64 核的 CPU,我们要想 PreCommit2 和 Commit 分别分到 32 核,这样两种任务相互不受影响,也不会导致某一个占用大量的计算资源导致另一个卡住的情况,此时我们就需要利用到核数限制")]),t._v(" "),a("ul",[a("li",[t._v("通过"),a("code",[t._v("taskset")]),t._v("限核")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 当我们想要启动某个进程时,可以通过 taskset -c 0-31 这种方式来进行限核操作")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 例如")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("TRUST_PARAMS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("nohup")]),t._v(" taskset -c "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("-32 ./venus-worker run "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n--miner-addr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("/ip4/sealer-ip/tcp/sealer-port"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n--miner-token"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("token"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v(" \n--listen"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:345"),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("8")]),t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("flags"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" worker.log "),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("2")]),t._v(">")]),a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("&1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 扩展使用 taskset -c 0-9,19-29,39-49 进行跳跃式限核")]),t._v("\n")])])]),a("p",[t._v("这种方式的弊端就在于不方便在程序运行时对核数进行实时调整")]),t._v(" "),a("ul",[a("li",[t._v("通过 Cgrep 限核")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 好的目录划分会帮助对多个进程的管理")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" -p /sys/fs/cgroup/cpuset/Pre1-worker\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 设置能够使用的核数范围")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("-31 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /sys/fs/cgroup/cpuset/Pre1-worker/cpuset.cpus\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 加入进程的PID")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("PID"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /sys/fs/cgroup/cpuset/Pre1-worker/cgroup.procs\n")])])]),a("p",[t._v("Cgrep 是在进程启动之后加入到配置文件的,并且支持实时的修改核数限制,当然也可以尝试使用 docker 限核,但 docker 的限核也是通过 Cgrep 来实现,至于 Cgrep 其他的用法我们基本都用不到,就不一一说明了")]),t._v(" "),a("h2",{attrs:{id:"worker-运行方式和资源消耗"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#worker-运行方式和资源消耗"}},[t._v("#")]),t._v(" worker 运行方式和资源消耗")]),t._v(" "),a("h3",{attrs:{id:"p1-阶段"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#p1-阶段"}},[t._v("#")]),t._v(" P1 阶段")]),t._v(" "),a("ul",[a("li",[t._v("P1 阶段的加速因子")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_MAXIMIZE_CACHING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 控制cache文件缓存到内存中,起到加速作用,会占用56G内存")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_MULTICORE_SDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 控制P1阶段是否使用多核运行,他会占用单个CPU组,所以每个CPU缓存组只会运行一个任务")]),t._v("\n")])])]),a("p",[a("code",[t._v("P1")]),t._v("阶段有两种选择,可以选择更快的速度或者更少的 CPU,需要根据实际资源决定。")]),t._v(" "),a("ul",[a("li",[t._v("P1 的内存资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 内存中会存储56G的cache文件")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 加上2层layer文件,32G的矿工每层文件32G,64G每层文件64G")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 以32G矿工为例,如果我们同时运行了10个任务")]),t._v("\n \n56G cahce 文件 + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v(" *2 * 并行线程数 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 696G Mem\n")])])]),a("ul",[a("li",[t._v("P1 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 11层layer文件 ")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G的tree-d文件")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G的unsealed文件")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" * 32G + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("64")]),t._v(" + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 440G\n")])])]),a("h3",{attrs:{id:"p2-阶段"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#p2-阶段"}},[t._v("#")]),t._v(" P2 阶段")]),t._v(" "),a("ul",[a("li",[t._v("P2 的加速因子有两个")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_GPU_COLUMN_BUILDER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用GPU运算tree-r-last阶段")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_GPU_TREE_BUILDER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用GPU运算tree-c阶段")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 任何环境变量都不增加的情况下使用CPU运算")]),t._v("\n")])])]),a("p",[t._v("从实验结果来看使用 GPU 运算要明显比 CPU 快得多,而 CPU 运算时的核数,主频跟时间是成线性比例的,CPU 核数越多速度越快,主频越高越快,反之亦然。")]),t._v(" "),a("ul",[a("li",[t._v("P2 内存资源")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("--precommit2 "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" precommit2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("32G sectors: all cores, 96GiB Memory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("default: "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 在命令行中可以看到运行一个需要96GiB的内存,如果并行2个就是2倍")]),t._v("\n")])])]),a("ul",[a("li",[t._v("P2 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 8个tree-c文件,每个 4.6G左右")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 8个tree-r-last,每个9.2M")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# t_aux,4K,p_aux,4K")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G的sealed文件")]),t._v("\n \n----------------------\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 16个tree-c文件,每个 4.6G左右")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 16个tree-r-last,每个9.2M")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# t_aux,4K,p_aux,4K")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G的sealed文件")]),t._v("\n")])])]),a("h3",{attrs:{id:"commit"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#commit"}},[t._v("#")]),t._v(" Commit")]),t._v(" "),a("ul",[a("li",[t._v("Commit 中的 C1 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# C1需要前面2个阶段产生的所有文件")]),t._v("\n\nP1 440G + P2 79G "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 519G \n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 每个C1的任务需要消耗487G左右的空间")]),t._v("\n")])])]),a("p",[t._v("C1 并没有太多的 CPU 消耗,并且时间极短")]),t._v(" "),a("ul",[a("li",[t._v("Commit 中的 C2 的运行方式,CPU 和 GPU")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BELLMAN_NO_GPU")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 禁用GPU")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BELLMAN_CUSTOM_GPU")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GeForce RTX 3090:10496"')]),t._v(" \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 指定GPU的cuda核心数,当GPU型号比较冷门无法识别时可使用")]),t._v("\n")])])]),a("ul",[a("li",[t._v("C2 的内存资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" commit "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("default: "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 命令行中指出总共需要 128G + 64 G = 192G的内存")]),t._v("\n")])])]),a("h2",{attrs:{id:"产量优化"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#产量优化"}},[t._v("#")]),t._v(" 产量优化")]),t._v(" "),a("h3",{attrs:{id:"产量的计算公式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#产量的计算公式"}},[t._v("#")]),t._v(" 产量的计算公式")]),t._v(" "),a("p",[t._v("  每个阶段的效率:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v(" 产出数量 / 时间 = 效率\n \n # 得到效率之后,我们就可以很轻松的算出产量\n \n 效率/h/个数 * 24h * 32G = 日产量\n")])])]),a("p",[t._v("例如我们有 1 台机器")]),t._v(" "),a("p",[t._v("P1:240 分钟")]),t._v(" "),a("p",[t._v("P2:30 分钟")]),t._v(" "),a("p",[t._v("Commit:35 分钟")]),t._v(" "),a("p",[t._v("此时我们可以简单一个计算公式的表格")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("运行阶段")]),t._v(" "),a("th",[t._v("时间/m")]),t._v(" "),a("th",[t._v("并行线程数")]),t._v(" "),a("th",[t._v("效率/时间h/个数")]),t._v(" "),a("th",[t._v("计算公式")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("P1")]),t._v(" "),a("td",[t._v("240")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("0.25")]),t._v(" "),a("td",[t._v("= 1 / (240 /60)")])]),t._v(" "),a("tr",[a("td",[t._v("P2")]),t._v(" "),a("td",[t._v("30")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("2")]),t._v(" "),a("td",[t._v("= 1 / (30 /60)")])]),t._v(" "),a("tr",[a("td",[t._v("Commit")]),t._v(" "),a("td",[t._v("35")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("1.7142857143")]),t._v(" "),a("td",[t._v("= 1 / (35 /60)")])])])]),t._v(" "),a("h4",{attrs:{id:"如何找到每个阶段的最佳运行数量和配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何找到每个阶段的最佳运行数量和配置"}},[t._v("#")]),t._v(" 如何找到每个阶段的最佳运行数量和配置")]),t._v(" "),a("p",[t._v("   从上面的表格中我们明显看出 P1 的效率明显不足,而此时 P2 和 Commit 机器必定会闲置,如何处理呢?产出的时间无法调整,那么我们就可以调整并行的线程数,当然我们可以新增一些计算内存的公式来指导我们对内存的消耗")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("运行阶段")]),t._v(" "),a("th",[t._v("时间/m")]),t._v(" "),a("th",[t._v("并行线程数")]),t._v(" "),a("th",[t._v("效率/时间h/个数")]),t._v(" "),a("th",[t._v("计算公式")]),t._v(" "),a("th",[t._v("日产量/G")]),t._v(" "),a("th",[t._v("公式")]),t._v(" "),a("th",[t._v("mem/G")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("P1")]),t._v(" "),a("td",[t._v("240")]),t._v(" "),a("td",[t._v("7")]),t._v(" "),a("td",[t._v("1.75")]),t._v(" "),a("td",[t._v("= 7 / (240 /60)")]),t._v(" "),a("td",[t._v("1344")]),t._v(" "),a("td",[t._v("=7*64+56")]),t._v(" "),a("td",[t._v("504")])]),t._v(" "),a("tr",[a("td",[t._v("P2")]),t._v(" "),a("td",[t._v("30")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("2")]),t._v(" "),a("td",[t._v("= 1 / (30 /60)")]),t._v(" "),a("td",[t._v("1536")]),t._v(" "),a("td",[t._v("=1*96")]),t._v(" "),a("td",[t._v("96")])]),t._v(" "),a("tr",[a("td",[t._v("Commit")]),t._v(" "),a("td",[t._v("35")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("1.7142857143")]),t._v(" "),a("td",[t._v("= 1 / (35 /60)")]),t._v(" "),a("td",[t._v("1316.571429")]),t._v(" "),a("td",[t._v("=1*128+64")]),t._v(" "),a("td",[t._v("192")])])])]),t._v(" "),a("p",[t._v("现在三个阶段的效率已经非常接近了,但是此时我们仍然存在一些问题:")]),t._v(" "),a("ol",[a("li",[t._v("Commit 效率低于 P1,这会导致大量的任务阻塞到 Commit 阶段")]),t._v(" "),a("li",[t._v("当某个阶段的效率过高时就会出现闲置")]),t._v(" "),a("li",[t._v("我们需要微调资源的分布来尽可能的保证每个阶段的效率无限相等")])]),t._v(" "),a("h4",{attrs:{id:"集群方案运行的的可能性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#集群方案运行的的可能性"}},[t._v("#")]),t._v(" 集群方案运行的的可能性")]),t._v(" "),a("p",[t._v("​\t\t当我们有多台机器时,我们就要决定某些机器运行哪些阶段,在这之前我们再来看下不同阶段的特性:")]),t._v(" "),a("ol",[a("li",[t._v("P1 : 极度消耗内存,可以单核,多核,并行运行,临时存储需要伴随着并行数量的增多而增多")]),t._v(" "),a("li",[t._v("P2 : 轻度消耗内存,CPU,GPU 都可以运行,如果拆分,需要传输大量的文件")]),t._v(" "),a("li",[t._v("Commit: 中度消耗内存,CPU,GPU 都可以运行,如果拆分,需要传输所有临时文件")])]),t._v(" "),a("p",[t._v("如果我们此时只考虑这些因素,那么我们的组合方式有多少种呢?而这些不同的组合方式一定会带来不通的产量,虽然每个矿工的机器都有所不同,但我们的目标是一样的:")]),t._v(" "),a("ol",[a("li",[t._v("更高的产量组合运行方式")]),t._v(" "),a("li",[t._v("各个阶段更加均衡的分布")])]),t._v(" "),a("p",[t._v("我们可能无法做到完美,但无限接近也是最好的结果")]),t._v(" "),a("h4",{attrs:{id:"如何寻找最佳的下发任务数-始终保持机器满负荷运行"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何寻找最佳的下发任务数-始终保持机器满负荷运行"}},[t._v("#")]),t._v(" 如何寻找最佳的下发任务数,始终保持机器满负荷运行")]),t._v(" "),a("p",[t._v("  当我们找到最佳的组合方式之后我们需要考虑的就是如何才能保证这些机器 24 小时都是不间断运行的呢?我们不希望任何一个阶段的出现闲置")]),t._v(" "),a("p",[t._v("当我们发现 P1 需要并行 7 个时,那么我们如果保证 P1 的任务量是充足的,那么后续的两个阶段在不考虑其他问题的情况下,也一定是充足的,所以我们需要保证始终维持 P1 时刻都有 7 个任务")]),t._v(" "),a("div",{staticClass:"language-toml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-toml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 在 venus-sealer 的配置文件中我们可以设置最大的任务数,这可以帮我我们避免任务数下发过多")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("DataDir")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/.venussealer"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("API")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("ListenAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/ip4/0.0.0.0/tcp/2345/http"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("RemoteListenAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.200.6:2345"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("Timeout")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"30s"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("Sealing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxWaitDealsSectors")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxSealingSectors")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 修改为 7")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxSealingSectorsForDeals")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),a("p",[t._v("此时我们可以通过一个简单的定时脚本就可以做到,始终维持最佳的任务量了")]),t._v(" "),a("h2",{attrs:{id:"损失和止损"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#损失和止损"}},[t._v("#")]),t._v(" 损失和止损")]),t._v(" "),a("p",[t._v("  如果一个任务执行错误之后又被反复的重试,这就像我们有 7 个通道进行算力的封装,但是此时有一通道阻塞或者损坏,这就会降低我们 1 / 7 的产量,所以及时的处理错误也是非常重要的")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("何种情况下应该立刻抛弃任务")]),t._v(" "),a("ol",[a("li",[t._v("ticket 过期")]),t._v(" "),a("li",[t._v("Commit 过期")]),t._v(" "),a("li",[t._v("依赖文件损坏重试多次都未成功时;")])])]),t._v(" "),a("li",[a("p",[t._v("移除无法完成的 sector")])])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("venus-sealer sectors remove --really-do-it "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("sectorNum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),a("p",[t._v("如遇到无法彻底删除请查询:"),a("a",{attrs:{href:"https://github.com/filguard/lotus-ops/blob/master/documents/questions.md#1-%E9%A1%BD%E5%9B%BA%E6%89%87%E5%8C%BA%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4",target:"_blank",rel:"noopener noreferrer"}},[t._v("顽固扇区如何删除"),a("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{431:function(t,s,a){"use strict";a.r(s);var e=a(17),r=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"venus-集群最大化利用资源增长算力方案"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#venus-集群最大化利用资源增长算力方案"}},[t._v("#")]),t._v(" Venus-集群最大化利用资源增长算力方案")]),t._v(" "),a("p",[t._v("   在 Filecoin 的网络中,算力大小至关重要,与矿工的收入息息相关。算力的增长与维持需要软硬件资源较多,每个扇区的密封需要 P1、P2、C1,C2 等\n诸多过程,并且每个过程所依赖的资源各不相同,如:P1 偏向多核 CPU,P4 可用 GPU 优化等。故如何找出能最大化利用现有资源提升算力的方案是一个复杂的过程。这篇文章为如何找出最优方案提供一些思路。")]),t._v(" "),a("h2",{attrs:{id:"总体思路"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#总体思路"}},[t._v("#")]),t._v(" 总体思路")]),t._v(" "),a("blockquote",[a("p",[t._v("本文方案是通过各个阶段的任务耗时来推算如何均衡的分配各阶段任务的机器数量占比")])]),t._v(" "),a("ul",[a("li",[t._v("根据实际场景,将所有加速配置都打开,做几个 sector,统计每个阶段任务耗时。每个阶段对硬件资源的的依赖如下:\n"),a("ul",[a("li",[t._v("P1:cpu 及磁盘 io")])]),t._v(" "),a("ul",[a("li",[t._v("P2:cpu,gpu,带宽及磁盘 io")]),t._v(" "),a("li",[t._v("C1-C2:cpu,gpu,带宽及磁盘 io")])])])]),t._v(" "),a("blockquote",[a("p",[t._v("这里多做几个是为了统计出较稳定的耗时,此阶段需保持加速设置及软硬件资源始终不变。")])]),t._v(" "),a("ul",[a("li",[a("p",[t._v("维持任务数平衡,即每个机器都有任何时刻都有任务可做,理论上每个阶段任务数与耗时成反比;")])]),t._v(" "),a("li",[a("p",[t._v("扇区任务由 pledge 命令控制,配合最大并发密封扇区数(MaxSealingSectors)管理集群中 sector 并发数量;")])]),t._v(" "),a("li",[a("p",[t._v("每个 worker 可以指定可接受的任务类型。")])])]),t._v(" "),a("h2",{attrs:{id:"任务耗时统计"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#任务耗时统计"}},[t._v("#")]),t._v(" 任务耗时统计")]),t._v(" "),a("p",[t._v("   worker 可以领取的任务类型有:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('TTAddPiece TaskType = "seal/v0/addpiece"\nTTPreCommit1 TaskType = "seal/v0/precommit/1"\nTTPreCommit2 TaskType = "seal/v0/precommit/2"\nTTCommit1 TaskType = "seal/v0/commit/1" // NOTE: We use this to transfer the sector into miner-local storage for now; Don\'t use on workers!\nTTCommit2 TaskType = "seal/v0/commit/2"\n\nTTFinalize TaskType = "seal/v0/finalize"\n\nTTFetch TaskType = "seal/v0/fetch"\nTTUnseal TaskType = "seal/v0/unseal"\n\n')])])]),a("p",[t._v("   每个任务都分为两个阶段:prepare 阶段和 worker 阶段,在日志中表现为:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("# seal/v0/fetch\n2021-08-03T14:00:07.925+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/fetch ...\n2021-08-03T14:05:36.772+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/fetch end ...\n\n2021-08-03T14:05:36.772+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/fetch ...\n2021-08-03T14:05:36.774+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/fetch end ...\n\n# seal/v0/addpiece\n2021-08-03T13:38:37.977+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 8 prepare for seal/v0/addpiece ...\n2021-08-03T13:38:37.978+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 8 prepare for seal/v0/addpiece end ...\n\n2021-08-03T13:38:37.978+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 8 work for seal/v0/addpiece ...\n2021-08-03T13:44:26.295+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 8 work for seal/v0/addpiece end ...\n\n# seal/v0/commit/2\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/commit/2 ...\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/commit/2 end ...\n\n2021-08-03T13:26:02.119+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/commit/2 ...\n2021-08-03T13:49:46.180+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/commit/2 end ...\n\n# seal/v0/finalize\n2021-08-03T13:54:17.414+0800 INFO advmgr sector-storage/sched_worker.go:401 Sector 7 prepare for seal/v0/finalize ...\n2021-08-03T13:59:30.471+0800 INFO advmgr sector-storage/sched_worker.go:403 Sector 7 prepare for seal/v0/finalize end ...\n\n2021-08-03T13:59:30.471+0800 INFO advmgr sector-storage/sched_worker.go:442 Sector 7 work for seal/v0/finalize ...\n2021-08-03T14:00:07.915+0800 INFO advmgr sector-storage/sched_worker.go:444 Sector 7 work for seal/v0/finalize end ...\n\n")])])]),a("p",[t._v("   可以看出有些任务在 prepare 阶段比较耗时,有些在 work 阶段比较耗时,一般来说需要网路传输,带宽资源的在 prepare 比较耗时,如 fetch,finalize 等;而需要计算的任务在 work 阶段比较耗时,如 AP,P1,P2,C2 等。")]),t._v(" "),a("p",[t._v("   为了便于计算,这里将任务阶段进行合并,主要分为:AP,P1,P2,C2 阶段,将这四个阶段之前的仍无耗时统一归为相应阶段的耗时,如 T(P1)=P1 耗时+P1 前的 fetch 耗时。这里 waitseed 怎么归类,在后面的时间逻辑中有没有考虑进去")]),t._v(" "),a("h2",{attrs:{id:"速率因子"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#速率因子"}},[t._v("#")]),t._v(" 速率因子")]),t._v(" "),a("h3",{attrs:{id:"临时存储设备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#临时存储设备"}},[t._v("#")]),t._v(" 临时存储设备")]),t._v(" "),a("p",[t._v("  Filecoin 在封装算力是会产生一些临时文件,在任务的进行中存在很多随机存取,这就要求磁盘吞吐量不能太差,否则会导致磁盘 IO 过高,计算资源等待磁盘读取处于闲置状态。")]),t._v(" "),a("ul",[a("li",[t._v("如何挑选适合的设备")])]),t._v(" "),a("p",[t._v("  如何寻找适合的设备,其实就是需要多少的磁盘吞吐量,可以通过一个简单的计算公式得到它。")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("文件大小 * 线程并行数量 / 运行时间 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 平均每秒钟传输速度\n \n因为每个阶段的吞吐不同,拆分计算可以让得到的数据更精准\n \nP1 读取 + P1 写入 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" P1 阶段所需的吞吐量,其他阶段相同,把所有阶段所需的吞吐加起来就得到了所需的吞吐量,当然需要一些性能上的冗余\n")])])]),a("p",[t._v("  通常情况下绝大多数的矿工都会使用 SSD 或者 NVME,当有多块硬盘时我们可以通过"),a("code",[t._v("venus-worker storage attach --seal ")]),t._v("命令或者启动多个 worker 来设置多个路径,但这并不是一个比较好的方法,路径过于分散会导致后续的维护相对复杂,无法充分利用,通过创建 raid 方式可以获得更好的性能和空间利用率,并且便于后续的维护。")]),t._v(" "),a("ul",[a("li",[t._v("软 raid 创建")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mdadm")]),t._v(" -C /dev/md1 -l "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" -n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" /dev/sdb1 /dev/sdc1\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mdadm")]),t._v(" -C /dev/md2 -l "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" -n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" /dev/sd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("b-g"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n-C $创建软件RAID\n-l $指定RAID级别 "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("表示raid1 其他同理 \n-n $指定磁盘个数\n-x $指定备用设备个数\n-A $重组之前的设备\n")])])]),a("p",[t._v("​\t有关 mdadm 用法、MD 和各种级别的 RAID 的更多信息,请参阅:http://raid.wiki.kernel.org/")]),t._v(" "),a("p",[t._v("​\t获取最新版本的 mdadm 应始终可以从如下链接获取:http://www.kernel.org/pub/linux/utils/raid/mdadm/")]),t._v(" "),a("p",[t._v("​\t硬 raid 创建时请查看您的 raid 卡型号和说明进行操作")]),t._v(" "),a("h3",{attrs:{id:"永久存储设备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#永久存储设备"}},[t._v("#")]),t._v(" 永久存储设备")]),t._v(" "),a("p",[t._v("   永久存储设备的访问机制和可能遇到的问题:")]),t._v(" "),a("ol",[a("li",[t._v("在每个任务阶段产生的文件有些是要永久存储的,用于 wdPoSt 或 winningPoSt,在每个 sector 完成阶段需要传输到永久存储目录,这个过程需要带宽资源,并且要保证磁盘 io;")]),t._v(" "),a("li",[t._v("wdPoSt 大量的随机读取非常小的文件,这可能会导致读取过慢而影响时空证明导致算力惩罚;")]),t._v(" "),a("li",[t._v("当存储过于集中时,少量的机器损坏会导致所有的数据丢失;")]),t._v(" "),a("li",[t._v("当磁盘过多时,并且盘符没有固定,启动时可能导致盘符移动;")]),t._v(" "),a("li",[t._v("如果是 raid,尽量选择 raid5 或者 raid6,raid10 这种冗余性更高的方式;")]),t._v(" "),a("li",[t._v("需要监控磁盘空间利用率并报警。")])]),t._v(" "),a("h3",{attrs:{id:"网络传输"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#网络传输"}},[t._v("#")]),t._v(" 网络传输")]),t._v(" "),a("p",[t._v("   网络传输会有两个部分:")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("临时数据的网络传输,某个阶段的任务需要上个阶段的数据时会用 http 协议请求所需文件,需要保证传输时间小于计算时间。")]),t._v(" "),a("p",[t._v("举例:\n传输往往和计算是同步进行的")]),t._v(" "),a("p",[t._v("传输时间 > 计算时间 资源闲置,计算资源等待网络资源,拉长整个扇区封装的声明周期,就是降产")]),t._v(" "),a("p",[t._v("传输时间 < 计算时间 计算资源充分利用")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("观察计算资源是否出现闲置")])]),t._v(" "),a("li",[a("p",[t._v("计算网络传输速度能否满足计算时间")]),t._v(" "),a("p",[t._v("Precommit2 如果计算耗时 25 分钟,读取 440G 左右文件,写入 100G 左右文件"),a("br"),t._v("\n(440G * 1024 / 25 / 60) + (100G * 1024 / 25 / 60) = 单个线程所需的吞吐量")])]),t._v(" "),a("li",[a("p",[t._v("多台机器同步阶段的文件传输")]),t._v(" "),a("p",[t._v("我们有 A,B,C 三个机器分别负责 P1,P2,Commit")]),t._v(" "),a("p",[t._v("当 A 机器开始 P1 时会向 B 机器的 P2 传输 32G 左右的 Unsealed")]),t._v(" "),a("p",[t._v("当 B 机器开始 P2 时,A 机器的 P1 生成的 440G 左右所有文件会传输到 B 的机器上")]),t._v(" "),a("p",[t._v("Commit 又分为 C1 和 C2.当 C 机器运行 C1 时需要 P1 和 P2 的所有文件,计算的结果通过内存直接传递给 C2,所以并不会在落盘新的文件")])])])]),t._v(" "),a("li",[a("p",[t._v("最终数据传输,我们要知道当最终的存储也会成为我们的产量瓶颈(貌似和下面的不符合)")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("假设计算资源的产量是每天产出 6T 的算力,但如果存储的网络传输最大每天只能传输 5T,那么这就会导致产量的下降")])]),t._v(" "),a("li",[a("p",[t._v("如果我们使用了 NFS 这样的网络文件系统,当网络断开链接是,NFS 往往是会直接卡死的,所以可能需要设置 NFS 的超时机制")])])])])]),t._v(" "),a("h3",{attrs:{id:"worker-的指令集加速"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#worker-的指令集加速"}},[t._v("#")]),t._v(" worker 的指令集加速")]),t._v(" "),a("p",[t._v("   P1 阶段时,使用 SHA 指令集和不使用指令集会有巨大的差距,目前大多数矿工都采用 AMD 型号的 CPU 原因就是 SHA 指令集的关系,研究发现,使用 SHA 指令集基本可以跑进 250 分钟以内,但不使用 SHA 指令集能够跑进 420 分钟已经非常艰难了")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("确保编译时使用RUSTFLAGS=\"-C target-cpu=native -g\" FFI_BUILD_FROM_SOURCE=\"1\" 源码编译filecoin-ffi库,如果cpu支持则启用SHA扩展,这会大幅提高扇区封装速度,源码编译(make deps)时特征如下:\n\n+ trap '{ rm -f $__build_output_log_tmp; }' EXIT\n+ local '__rust_flags=--print native-static-libs -C target-feature=+sse2'\n+ RUSTFLAGS='--print native-static-libs -C target-feature=+sse2'\n+ cargo +nightly-2021-04-24 build --release --no-default-features --features multicore-sdr --features pairing,gpu\n+ tee /tmp/tmp.IYtnd3xka9\n Compiling autocfg v1.0.1\n Compiling libc v0.2.97\n Compiling cfg-if v1.0.0\n Compiling proc-macro2 v1.0.27\n Compiling unicode-xid v0.2.2\n Compiling syn v1.0.73\n Compiling lazy_static v1.4.0\n Compiling cc v1.0.68\n Compiling typenum v1.13.0\n Compiling serde_derive v1.0.126\n Compiling serde v1.0.126\n")])])]),a("h3",{attrs:{id:"核数限制"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#核数限制"}},[t._v("#")]),t._v(" 核数限制")]),t._v(" "),a("p",[t._v("​\t当想要把 CPU 的资源利用的更高时,需要非常合理的规划 CPU 的使用,比如有一个 64 核的 CPU,我们要想 PreCommit2 和 Commit 分别分到 32 核,这样两种任务相互不受影响,也不会导致某一个占用大量的计算资源导致另一个卡住的情况,此时我们就需要利用到核数限制")]),t._v(" "),a("ul",[a("li",[t._v("通过"),a("code",[t._v("taskset")]),t._v("限核")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 当我们想要启动某个进程时,可以通过 taskset -c 0-31 这种方式来进行限核操作")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 例如")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("TRUST_PARAMS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("nohup")]),t._v(" taskset -c "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("-32 ./venus-worker run "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n--miner-addr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("/ip4/sealer-ip/tcp/sealer-port"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n--miner-token"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("token"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v(" \n--listen"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:345"),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("8")]),t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("flags"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" worker.log "),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("2")]),t._v(">")]),a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("&1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 扩展使用 taskset -c 0-9,19-29,39-49 进行跳跃式限核")]),t._v("\n")])])]),a("p",[t._v("这种方式的弊端就在于不方便在程序运行时对核数进行实时调整")]),t._v(" "),a("ul",[a("li",[t._v("通过 Cgrep 限核")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 好的目录划分会帮助对多个进程的管理")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" -p /sys/fs/cgroup/cpuset/Pre1-worker\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 设置能够使用的核数范围")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("-31 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /sys/fs/cgroup/cpuset/Pre1-worker/cpuset.cpus\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 加入进程的PID")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("PID"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /sys/fs/cgroup/cpuset/Pre1-worker/cgroup.procs\n")])])]),a("p",[t._v("Cgrep 是在进程启动之后加入到配置文件的,并且支持实时的修改核数限制,当然也可以尝试使用 docker 限核,但 docker 的限核也是通过 Cgrep 来实现,至于 Cgrep 其他的用法我们基本都用不到,就不一一说明了")]),t._v(" "),a("h2",{attrs:{id:"worker-运行方式和资源消耗"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#worker-运行方式和资源消耗"}},[t._v("#")]),t._v(" worker 运行方式和资源消耗")]),t._v(" "),a("h3",{attrs:{id:"p1-阶段"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#p1-阶段"}},[t._v("#")]),t._v(" P1 阶段")]),t._v(" "),a("ul",[a("li",[t._v("P1 阶段的加速因子")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_MAXIMIZE_CACHING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 控制cache文件缓存到内存中,起到加速作用,会占用56G内存")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_MULTICORE_SDR")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 控制P1阶段是否使用多核运行,他会占用单个CPU组,所以每个CPU缓存组只会运行一个任务")]),t._v("\n")])])]),a("p",[a("code",[t._v("P1")]),t._v("阶段有两种选择,可以选择更快的速度或者更少的 CPU,需要根据实际资源决定。")]),t._v(" "),a("ul",[a("li",[t._v("P1 的内存资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 内存中会存储56G的cache文件")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 加上2层layer文件,32G的矿工每层文件32G,64G每层文件64G")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 以32G矿工为例,如果我们同时运行了10个任务")]),t._v("\n \n56G cahce 文件 + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v(" *2 * 并行线程数 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 696G Mem\n")])])]),a("ul",[a("li",[t._v("P1 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 11层layer文件 ")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G的tree-d文件")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G的unsealed文件")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(" * 32G + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("64")]),t._v(" + "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 440G\n")])])]),a("h3",{attrs:{id:"p2-阶段"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#p2-阶段"}},[t._v("#")]),t._v(" P2 阶段")]),t._v(" "),a("ul",[a("li",[t._v("P2 的加速因子有两个")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_GPU_COLUMN_BUILDER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用GPU运算tree-r-last阶段")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("FIL_PROOFS_USE_GPU_TREE_BUILDER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用GPU运算tree-c阶段")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 任何环境变量都不增加的情况下使用CPU运算")]),t._v("\n")])])]),a("p",[t._v("从实验结果来看使用 GPU 运算要明显比 CPU 快得多,而 CPU 运算时的核数,主频跟时间是成线性比例的,CPU 核数越多速度越快,主频越高越快,反之亦然。")]),t._v(" "),a("ul",[a("li",[t._v("P2 内存资源")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("--precommit2 "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" precommit2 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("32G sectors: all cores, 96GiB Memory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("default: "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 在命令行中可以看到运行一个需要96GiB的内存,如果并行2个就是2倍")]),t._v("\n")])])]),a("ul",[a("li",[t._v("P2 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 8个tree-c文件,每个 4.6G左右")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 8个tree-r-last,每个9.2M")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# t_aux,4K,p_aux,4K")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 32G的sealed文件")]),t._v("\n \n----------------------\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 16个tree-c文件,每个 4.6G左右")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 16个tree-r-last,每个9.2M")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# t_aux,4K,p_aux,4K")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 64G的sealed文件")]),t._v("\n")])])]),a("h3",{attrs:{id:"commit"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#commit"}},[t._v("#")]),t._v(" Commit")]),t._v(" "),a("ul",[a("li",[t._v("Commit 中的 C1 的磁盘资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# C1需要前面2个阶段产生的所有文件")]),t._v("\n\nP1 440G + P2 79G "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 519G \n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 每个C1的任务需要消耗487G左右的空间")]),t._v("\n")])])]),a("p",[t._v("C1 并没有太多的 CPU 消耗,并且时间极短")]),t._v(" "),a("ul",[a("li",[t._v("Commit 中的 C2 的运行方式,CPU 和 GPU")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BELLMAN_NO_GPU")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 禁用GPU")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BELLMAN_CUSTOM_GPU")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GeForce RTX 3090:10496"')]),t._v(" \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 指定GPU的cuda核心数,当GPU型号比较冷门无法识别时可使用")]),t._v("\n")])])]),a("ul",[a("li",[t._v("C2 的内存资源消耗")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" commit "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("default: "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 命令行中指出总共需要 128G + 64 G = 192G的内存")]),t._v("\n")])])]),a("h2",{attrs:{id:"产量优化"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#产量优化"}},[t._v("#")]),t._v(" 产量优化")]),t._v(" "),a("h3",{attrs:{id:"产量的计算公式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#产量的计算公式"}},[t._v("#")]),t._v(" 产量的计算公式")]),t._v(" "),a("p",[t._v("  每个阶段的效率:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v(" 产出数量 / 时间 = 效率\n \n # 得到效率之后,我们就可以很轻松的算出产量\n \n 效率/h/个数 * 24h * 32G = 日产量\n")])])]),a("p",[t._v("例如我们有 1 台机器")]),t._v(" "),a("p",[t._v("P1:240 分钟")]),t._v(" "),a("p",[t._v("P2:30 分钟")]),t._v(" "),a("p",[t._v("Commit:35 分钟")]),t._v(" "),a("p",[t._v("此时我们可以简单一个计算公式的表格")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("运行阶段")]),t._v(" "),a("th",[t._v("时间/m")]),t._v(" "),a("th",[t._v("并行线程数")]),t._v(" "),a("th",[t._v("效率/时间h/个数")]),t._v(" "),a("th",[t._v("计算公式")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("P1")]),t._v(" "),a("td",[t._v("240")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("0.25")]),t._v(" "),a("td",[t._v("= 1 / (240 /60)")])]),t._v(" "),a("tr",[a("td",[t._v("P2")]),t._v(" "),a("td",[t._v("30")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("2")]),t._v(" "),a("td",[t._v("= 1 / (30 /60)")])]),t._v(" "),a("tr",[a("td",[t._v("Commit")]),t._v(" "),a("td",[t._v("35")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("1.7142857143")]),t._v(" "),a("td",[t._v("= 1 / (35 /60)")])])])]),t._v(" "),a("h4",{attrs:{id:"如何找到每个阶段的最佳运行数量和配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何找到每个阶段的最佳运行数量和配置"}},[t._v("#")]),t._v(" 如何找到每个阶段的最佳运行数量和配置")]),t._v(" "),a("p",[t._v("   从上面的表格中我们明显看出 P1 的效率明显不足,而此时 P2 和 Commit 机器必定会闲置,如何处理呢?产出的时间无法调整,那么我们就可以调整并行的线程数,当然我们可以新增一些计算内存的公式来指导我们对内存的消耗")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("运行阶段")]),t._v(" "),a("th",[t._v("时间/m")]),t._v(" "),a("th",[t._v("并行线程数")]),t._v(" "),a("th",[t._v("效率/时间h/个数")]),t._v(" "),a("th",[t._v("计算公式")]),t._v(" "),a("th",[t._v("日产量/G")]),t._v(" "),a("th",[t._v("公式")]),t._v(" "),a("th",[t._v("mem/G")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("P1")]),t._v(" "),a("td",[t._v("240")]),t._v(" "),a("td",[t._v("7")]),t._v(" "),a("td",[t._v("1.75")]),t._v(" "),a("td",[t._v("= 7 / (240 /60)")]),t._v(" "),a("td",[t._v("1344")]),t._v(" "),a("td",[t._v("=7*64+56")]),t._v(" "),a("td",[t._v("504")])]),t._v(" "),a("tr",[a("td",[t._v("P2")]),t._v(" "),a("td",[t._v("30")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("2")]),t._v(" "),a("td",[t._v("= 1 / (30 /60)")]),t._v(" "),a("td",[t._v("1536")]),t._v(" "),a("td",[t._v("=1*96")]),t._v(" "),a("td",[t._v("96")])]),t._v(" "),a("tr",[a("td",[t._v("Commit")]),t._v(" "),a("td",[t._v("35")]),t._v(" "),a("td",[t._v("1")]),t._v(" "),a("td",[t._v("1.7142857143")]),t._v(" "),a("td",[t._v("= 1 / (35 /60)")]),t._v(" "),a("td",[t._v("1316.571429")]),t._v(" "),a("td",[t._v("=1*128+64")]),t._v(" "),a("td",[t._v("192")])])])]),t._v(" "),a("p",[t._v("现在三个阶段的效率已经非常接近了,但是此时我们仍然存在一些问题:")]),t._v(" "),a("ol",[a("li",[t._v("Commit 效率低于 P1,这会导致大量的任务阻塞到 Commit 阶段")]),t._v(" "),a("li",[t._v("当某个阶段的效率过高时就会出现闲置")]),t._v(" "),a("li",[t._v("我们需要微调资源的分布来尽可能的保证每个阶段的效率无限相等")])]),t._v(" "),a("h4",{attrs:{id:"集群方案运行的的可能性"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#集群方案运行的的可能性"}},[t._v("#")]),t._v(" 集群方案运行的的可能性")]),t._v(" "),a("p",[t._v("​\t\t当我们有多台机器时,我们就要决定某些机器运行哪些阶段,在这之前我们再来看下不同阶段的特性:")]),t._v(" "),a("ol",[a("li",[t._v("P1 : 极度消耗内存,可以单核,多核,并行运行,临时存储需要伴随着并行数量的增多而增多")]),t._v(" "),a("li",[t._v("P2 : 轻度消耗内存,CPU,GPU 都可以运行,如果拆分,需要传输大量的文件")]),t._v(" "),a("li",[t._v("Commit: 中度消耗内存,CPU,GPU 都可以运行,如果拆分,需要传输所有临时文件")])]),t._v(" "),a("p",[t._v("如果我们此时只考虑这些因素,那么我们的组合方式有多少种呢?而这些不同的组合方式一定会带来不通的产量,虽然每个矿工的机器都有所不同,但我们的目标是一样的:")]),t._v(" "),a("ol",[a("li",[t._v("更高的产量组合运行方式")]),t._v(" "),a("li",[t._v("各个阶段更加均衡的分布")])]),t._v(" "),a("p",[t._v("我们可能无法做到完美,但无限接近也是最好的结果")]),t._v(" "),a("h4",{attrs:{id:"如何寻找最佳的下发任务数-始终保持机器满负荷运行"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何寻找最佳的下发任务数-始终保持机器满负荷运行"}},[t._v("#")]),t._v(" 如何寻找最佳的下发任务数,始终保持机器满负荷运行")]),t._v(" "),a("p",[t._v("  当我们找到最佳的组合方式之后我们需要考虑的就是如何才能保证这些机器 24 小时都是不间断运行的呢?我们不希望任何一个阶段的出现闲置")]),t._v(" "),a("p",[t._v("当我们发现 P1 需要并行 7 个时,那么我们如果保证 P1 的任务量是充足的,那么后续的两个阶段在不考虑其他问题的情况下,也一定是充足的,所以我们需要保证始终维持 P1 时刻都有 7 个任务")]),t._v(" "),a("div",{staticClass:"language-toml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-toml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 在 venus-sealer 的配置文件中我们可以设置最大的任务数,这可以帮我我们避免任务数下发过多")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("DataDir")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/.venussealer"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("API")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("ListenAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/ip4/0.0.0.0/tcp/2345/http"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("RemoteListenAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.200.6:2345"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("Timeout")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"30s"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("Sealing")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxWaitDealsSectors")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxSealingSectors")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 修改为 7")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key property"}},[t._v("MaxSealingSectorsForDeals")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),a("p",[t._v("此时我们可以通过一个简单的定时脚本就可以做到,始终维持最佳的任务量了")]),t._v(" "),a("h2",{attrs:{id:"损失和止损"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#损失和止损"}},[t._v("#")]),t._v(" 损失和止损")]),t._v(" "),a("p",[t._v("  如果一个任务执行错误之后又被反复的重试,这就像我们有 7 个通道进行算力的封装,但是此时有一通道阻塞或者损坏,这就会降低我们 1 / 7 的产量,所以及时的处理错误也是非常重要的")]),t._v(" "),a("ul",[a("li",[a("p",[t._v("何种情况下应该立刻抛弃任务")]),t._v(" "),a("ol",[a("li",[t._v("ticket 过期")]),t._v(" "),a("li",[t._v("Commit 过期")]),t._v(" "),a("li",[t._v("依赖文件损坏重试多次都未成功时;")])])]),t._v(" "),a("li",[a("p",[t._v("移除无法完成的 sector")])])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("venus-sealer sectors remove --really-do-it "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("sectorNum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),a("p",[t._v("如遇到无法彻底删除请查询:"),a("a",{attrs:{href:"https://github.com/filguard/lotus-ops/blob/master/documents/questions.md#1-%E9%A1%BD%E5%9B%BA%E6%89%87%E5%8C%BA%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4",target:"_blank",rel:"noopener noreferrer"}},[t._v("顽固扇区如何删除"),a("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/47.13c3ce60.js b/assets/js/47.9774ef43.js similarity index 97% rename from assets/js/47.13c3ce60.js rename to assets/js/47.9774ef43.js index 490714435..0287cdd46 100644 --- a/assets/js/47.13c3ce60.js +++ b/assets/js/47.9774ef43.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{440:function(t,v,_){"use strict";_.r(v);var d=_(17),r=Object(d.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"venus-集群日增算力-1t-机器选型方案"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#venus-集群日增算力-1t-机器选型方案"}},[t._v("#")]),t._v(" venus 集群日增算力 1T 机器选型方案")]),t._v(" "),_("h2",{attrs:{id:"机器配置"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#机器配置"}},[t._v("#")]),t._v(" 机器配置")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("资源")]),t._v(" "),_("th",[t._v("配置")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("CPU")]),t._v(" "),_("td",[t._v("3970X * 1 (32c)")])]),t._v(" "),_("tr",[_("td",[t._v("内存")]),t._v(" "),_("td",[t._v("512G")])]),t._v(" "),_("tr",[_("td",[t._v("硬盘")]),t._v(" "),_("td",[t._v("3T/SSD")])]),t._v(" "),_("tr",[_("td",[t._v("网卡")]),t._v(" "),_("td",[t._v("千兆")])]),t._v(" "),_("tr",[_("td",[t._v("系统盘")]),t._v(" "),_("td",[t._v("500G")])]),t._v(" "),_("tr",[_("td",[t._v("显卡")]),t._v(" "),_("td",[t._v("3080 * 1")])])])]),t._v(" "),_("p",[t._v("台数:1 台")]),t._v(" "),_("h2",{attrs:{id:"任务配比"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#任务配比"}},[t._v("#")]),t._v(" 任务配比")]),t._v(" "),_("p",[t._v("任务分为 AP,P1,P2,Commit 阶段")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("运行方式")]),t._v(" "),_("th",[t._v("核数限制")]),t._v(" "),_("th",[t._v("耗时 (分钟)")]),t._v(" "),_("th",[t._v("内存消耗 (G)")]),t._v(" "),_("th",[t._v("效率 (个/小时)")]),t._v(" "),_("th",[t._v("日产量 (T)")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("P1 * 5")]),t._v(" "),_("td",[t._v("20")]),t._v(" "),_("td",[t._v("220")]),t._v(" "),_("td",[t._v("376")]),t._v(" "),_("td",[t._v("1.3636")]),t._v(" "),_("td",[t._v("1.0227")])]),t._v(" "),_("tr",[_("td",[t._v("P2,AP,Commit")]),t._v(" "),_("td",[t._v("12")]),t._v(" "),_("td",[t._v("10")]),t._v(" "),_("td",[t._v("120")]),t._v(" "),_("td",[t._v("3")]),t._v(" "),_("td",[t._v("1.125")])])])]),t._v(" "),_("blockquote",[_("p",[t._v("关于限核,配置执行任务类型,并发任务数等请参考 venus-docs 项目中相关文档。")])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{438:function(t,v,_){"use strict";_.r(v);var d=_(17),r=Object(d.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"venus-集群日增算力-1t-机器选型方案"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#venus-集群日增算力-1t-机器选型方案"}},[t._v("#")]),t._v(" venus 集群日增算力 1T 机器选型方案")]),t._v(" "),_("h2",{attrs:{id:"机器配置"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#机器配置"}},[t._v("#")]),t._v(" 机器配置")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("资源")]),t._v(" "),_("th",[t._v("配置")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("CPU")]),t._v(" "),_("td",[t._v("3970X * 1 (32c)")])]),t._v(" "),_("tr",[_("td",[t._v("内存")]),t._v(" "),_("td",[t._v("512G")])]),t._v(" "),_("tr",[_("td",[t._v("硬盘")]),t._v(" "),_("td",[t._v("3T/SSD")])]),t._v(" "),_("tr",[_("td",[t._v("网卡")]),t._v(" "),_("td",[t._v("千兆")])]),t._v(" "),_("tr",[_("td",[t._v("系统盘")]),t._v(" "),_("td",[t._v("500G")])]),t._v(" "),_("tr",[_("td",[t._v("显卡")]),t._v(" "),_("td",[t._v("3080 * 1")])])])]),t._v(" "),_("p",[t._v("台数:1 台")]),t._v(" "),_("h2",{attrs:{id:"任务配比"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#任务配比"}},[t._v("#")]),t._v(" 任务配比")]),t._v(" "),_("p",[t._v("任务分为 AP,P1,P2,Commit 阶段")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("运行方式")]),t._v(" "),_("th",[t._v("核数限制")]),t._v(" "),_("th",[t._v("耗时 (分钟)")]),t._v(" "),_("th",[t._v("内存消耗 (G)")]),t._v(" "),_("th",[t._v("效率 (个/小时)")]),t._v(" "),_("th",[t._v("日产量 (T)")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("P1 * 5")]),t._v(" "),_("td",[t._v("20")]),t._v(" "),_("td",[t._v("220")]),t._v(" "),_("td",[t._v("376")]),t._v(" "),_("td",[t._v("1.3636")]),t._v(" "),_("td",[t._v("1.0227")])]),t._v(" "),_("tr",[_("td",[t._v("P2,AP,Commit")]),t._v(" "),_("td",[t._v("12")]),t._v(" "),_("td",[t._v("10")]),t._v(" "),_("td",[t._v("120")]),t._v(" "),_("td",[t._v("3")]),t._v(" "),_("td",[t._v("1.125")])])])]),t._v(" "),_("blockquote",[_("p",[t._v("关于限核,配置执行任务类型,并发任务数等请参考 venus-docs 项目中相关文档。")])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/48.e1755c59.js b/assets/js/48.f42847d6.js similarity index 95% rename from assets/js/48.e1755c59.js rename to assets/js/48.f42847d6.js index db3126c82..86d9ae46e 100644 --- a/assets/js/48.e1755c59.js +++ b/assets/js/48.f42847d6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{438:function(e,r,t){"use strict";t.r(r);var o=t(17),n=Object(o.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"从-lotus-来的命令"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#从-lotus-来的命令"}},[e._v("#")]),e._v(" 从 Lotus 来的命令")]),e._v(" "),t("p",[e._v("很多日常的命令包括但不限于"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/addresses/",target:"_blank",rel:"noopener noreferrer"}},[e._v("创建worker/controler地址"),t("OutboundLink")],1),e._v(",设置不同的"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/config/",target:"_blank",rel:"noopener noreferrer"}},[e._v("配置"),t("OutboundLink")],1),e._v(",或者修改"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/lifecycle/#changing-storage-locations",target:"_blank",rel:"noopener noreferrer"}},[e._v("存储路径"),t("OutboundLink")],1),e._v("等等,都同时适用于"),t("code",[e._v("Lotus")]),e._v("和"),t("code",[e._v("Venus")]),e._v("。节点运维工程师可以按照 Lotus 文档中的步骤来操作。如果遇到任何问题,欢迎到"),t("a",{attrs:{href:"https://filecoinproject.slack.com/archives/C028PCH8L31",target:"_blank",rel:"noopener noreferrer"}},[e._v("#fil-venus-cn"),t("OutboundLink")],1),e._v("来提出问题。")])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{439:function(e,r,t){"use strict";t.r(r);var o=t(17),n=Object(o.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"从-lotus-来的命令"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#从-lotus-来的命令"}},[e._v("#")]),e._v(" 从 Lotus 来的命令")]),e._v(" "),t("p",[e._v("很多日常的命令包括但不限于"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/addresses/",target:"_blank",rel:"noopener noreferrer"}},[e._v("创建worker/controler地址"),t("OutboundLink")],1),e._v(",设置不同的"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/config/",target:"_blank",rel:"noopener noreferrer"}},[e._v("配置"),t("OutboundLink")],1),e._v(",或者修改"),t("a",{attrs:{href:"https://lotus.filecoin.io/docs/storage-providers/lifecycle/#changing-storage-locations",target:"_blank",rel:"noopener noreferrer"}},[e._v("存储路径"),t("OutboundLink")],1),e._v("等等,都同时适用于"),t("code",[e._v("Lotus")]),e._v("和"),t("code",[e._v("Venus")]),e._v("。节点运维工程师可以按照 Lotus 文档中的步骤来操作。如果遇到任何问题,欢迎到"),t("a",{attrs:{href:"https://filecoinproject.slack.com/archives/C028PCH8L31",target:"_blank",rel:"noopener noreferrer"}},[e._v("#fil-venus-cn"),t("OutboundLink")],1),e._v("来提出问题。")])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/49.7d3b2caf.js b/assets/js/49.997ffffa.js similarity index 98% rename from assets/js/49.7d3b2caf.js rename to assets/js/49.997ffffa.js index 28c003965..5cd5d3756 100644 --- a/assets/js/49.7d3b2caf.js +++ b/assets/js/49.997ffffa.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{439:function(t,a,e){"use strict";e.r(a);var s=e(17),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"market-v1-v2-升级指南"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#market-v1-v2-升级指南"}},[t._v("#")]),t._v(" market v1-v2 升级指南")]),t._v(" "),e("p",[t._v("market v1 升级到 v2 的过程中数据结构发生了变化,如果需要现有的数据请按照现有的步骤进行升级数据")]),t._v(" "),e("h2",{attrs:{id:"编译升级工具"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编译升级工具"}},[t._v("#")]),t._v(" 编译升级工具")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("git clone https://github.com/filecoin-project/venus-market.git\ngit checkout feat/export_v1_data\n\nmake deps\ncd cli/market_export\ngo build\n")])])]),e("p",[t._v("执行上述步骤后会生成一个工具,这个工具用于导出 v1 版本的数据")]),t._v(" "),e("h2",{attrs:{id:"升级步骤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#升级步骤"}},[t._v("#")]),t._v(" 升级步骤")]),t._v(" "),e("ol",[e("li",[e("p",[t._v("停止 venus-market 程序")])]),t._v(" "),e("li",[e("p",[t._v("备份 venus-market 数据目录,这个目录默认保存在 ~/.venusmarket.")])]),t._v(" "),e("li",[e("p",[t._v("导出 v1 版本的数据")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v(" ./market_export --repo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("venus-market repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("path of "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" data file"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n")])])])]),t._v(" "),e("li",[e("p",[t._v("重新初始化 v2 版本的 venus-market(版本号必须高于 2.0.0 rc2)")])]),t._v(" "),e("li",[e("p",[t._v("执行 v2 版本的升级命令,这个命令用于导入步骤 3 中导出的数据。")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./market_export --repo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("venus-market repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" migrate import_v1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("path of "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" data file"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])])])]),t._v(" "),e("p",[e("em",[e("strong",[t._v("稳妥起见,做升级之前请确保没有处于 (Publish/Publishing/StorageDealAwaitingPreCommit) 状态的订单")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{440:function(t,a,e){"use strict";e.r(a);var s=e(17),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"market-v1-v2-升级指南"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#market-v1-v2-升级指南"}},[t._v("#")]),t._v(" market v1-v2 升级指南")]),t._v(" "),e("p",[t._v("market v1 升级到 v2 的过程中数据结构发生了变化,如果需要现有的数据请按照现有的步骤进行升级数据")]),t._v(" "),e("h2",{attrs:{id:"编译升级工具"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编译升级工具"}},[t._v("#")]),t._v(" 编译升级工具")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("git clone https://github.com/filecoin-project/venus-market.git\ngit checkout feat/export_v1_data\n\nmake deps\ncd cli/market_export\ngo build\n")])])]),e("p",[t._v("执行上述步骤后会生成一个工具,这个工具用于导出 v1 版本的数据")]),t._v(" "),e("h2",{attrs:{id:"升级步骤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#升级步骤"}},[t._v("#")]),t._v(" 升级步骤")]),t._v(" "),e("ol",[e("li",[e("p",[t._v("停止 venus-market 程序")])]),t._v(" "),e("li",[e("p",[t._v("备份 venus-market 数据目录,这个目录默认保存在 ~/.venusmarket.")])]),t._v(" "),e("li",[e("p",[t._v("导出 v1 版本的数据")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v(" ./market_export --repo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("venus-market repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("path of "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" data file"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n")])])])]),t._v(" "),e("li",[e("p",[t._v("重新初始化 v2 版本的 venus-market(版本号必须高于 2.0.0 rc2)")])]),t._v(" "),e("li",[e("p",[t._v("执行 v2 版本的升级命令,这个命令用于导入步骤 3 中导出的数据。")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./market_export --repo "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("venus-market repo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" migrate import_v1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("path of "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" data file"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])])])]),t._v(" "),e("p",[e("em",[e("strong",[t._v("稳妥起见,做升级之前请确保没有处于 (Publish/Publishing/StorageDealAwaitingPreCommit) 状态的订单")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/5.45d22d5f.js b/assets/js/5.34e2ab1e.js similarity index 88% rename from assets/js/5.45d22d5f.js rename to assets/js/5.34e2ab1e.js index dd6270796..95347cac7 100644 --- a/assets/js/5.45d22d5f.js +++ b/assets/js/5.34e2ab1e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{351:function(e,t,o){},392:function(e,t,o){"use strict";o(351)},397:function(e,t,o){"use strict";o.r(t);o(22),o(50),o(71),o(51);var a={name:"CodeGroup",data:function(){return{codeTabs:[],activeCodeTabIndex:-1}},watch:{activeCodeTabIndex:function(e){this.codeTabs.forEach((function(e){e.elm.classList.remove("theme-code-block__active")})),this.codeTabs[e].elm.classList.add("theme-code-block__active")}},mounted:function(){var e=this;this.codeTabs=(this.$slots.default||[]).filter((function(e){return Boolean(e.componentOptions)})).map((function(t,o){return""===t.componentOptions.propsData.active&&(e.activeCodeTabIndex=o),{title:t.componentOptions.propsData.title,elm:t.elm}})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0)},methods:{changeCodeTab:function(e){this.activeCodeTabIndex=e}}},c=(o(392),o(17)),n=Object(c.a)(a,(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"theme-code-group"},[o("div",{staticClass:"theme-code-group__nav"},[o("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(t,a){return o("li",{key:t.title,staticClass:"theme-code-group__li"},[o("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":a===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(a)}}},[e._v("\n "+e._s(t.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?o("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)}),[],!1,null,"32c2d7ed",null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{352:function(e,t,o){},393:function(e,t,o){"use strict";o(352)},398:function(e,t,o){"use strict";o.r(t);o(22),o(50),o(71),o(51);var a={name:"CodeGroup",data:function(){return{codeTabs:[],activeCodeTabIndex:-1}},watch:{activeCodeTabIndex:function(e){this.codeTabs.forEach((function(e){e.elm.classList.remove("theme-code-block__active")})),this.codeTabs[e].elm.classList.add("theme-code-block__active")}},mounted:function(){var e=this;this.codeTabs=(this.$slots.default||[]).filter((function(e){return Boolean(e.componentOptions)})).map((function(t,o){return""===t.componentOptions.propsData.active&&(e.activeCodeTabIndex=o),{title:t.componentOptions.propsData.title,elm:t.elm}})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0)},methods:{changeCodeTab:function(e){this.activeCodeTabIndex=e}}},c=(o(393),o(17)),n=Object(c.a)(a,(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"theme-code-group"},[o("div",{staticClass:"theme-code-group__nav"},[o("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(t,a){return o("li",{key:t.title,staticClass:"theme-code-group__li"},[o("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":a===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(a)}}},[e._v("\n "+e._s(t.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?o("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)}),[],!1,null,"32c2d7ed",null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/app.717d6d60.js b/assets/js/app.e0c9c672.js similarity index 91% rename from assets/js/app.717d6d60.js rename to assets/js/app.e0c9c672.js index 9c0c1db7e..002b7cbfb 100644 --- a/assets/js/app.717d6d60.js +++ b/assets/js/app.e0c9c672.js @@ -1,8 +1,8 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function n(n){for(var r,i,s=n[0],c=n[1],l=n[2],p=0,d=[];p0?o(r(e),9007199254740991):0}},function(e,n){var t=Array.isArray;e.exports=t},function(e,n,t){var r=t(152),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},function(e,n,t){"use strict";function r(e,n,t,r,o,a,i,s){var c,l="function"==typeof e?e.options:e;if(n&&(l.render=n,l.staticRenderFns=t,l._compiled=!0),r&&(l.functional=!0),a&&(l._scopeId="data-v-"+a),i?(c=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(i)},l._ssrRegister=c):o&&(c=s?function(){o.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(l.functional){l._injectStyles=c;var u=l.render;l.render=function(e,n){return c.call(n),u(e,n)}}else{var p=l.beforeCreate;l.beforeCreate=p?[].concat(p,c):[c]}return{exports:e,options:l}}t.d(n,"a",(function(){return r}))},function(e,n,t){var r=t(5),o=t(1),a=t(7),i=Object.defineProperty,s={},c=function(e){throw e};e.exports=function(e,n){if(a(s,e))return s[e];n||(n={});var t=[][e],l=!!a(n,"ACCESSORS")&&n.ACCESSORS,u=a(n,0)?n[0]:c,p=a(n,1)?n[1]:void 0;return s[e]=!!t&&!o((function(){if(l&&!r)return!0;var e={length:-1};l?i(e,1,{enumerable:!0,get:c}):e[1]=1,t.call(e,u,p)}))}},function(e,n,t){var r=t(126),o=t(2),a=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,n){return arguments.length<2?a(r[e])||a(o[e]):r[e]&&r[e][n]||o[e]&&o[e][n]}},function(e,n,t){var r=t(5),o=t(84),a=t(35),i=t(11),s=t(39),c=t(7),l=t(121),u=Object.getOwnPropertyDescriptor;n.f=r?u:function(e,n){if(e=i(e),n=s(n,!0),l)try{return u(e,n)}catch(e){}if(c(e,n))return a(!o.f.call(e,n),e[n])}},function(e,n){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,n,t){"use strict";var r=t(0),o=t(32).filter,a=t(59),i=t(18),s=a("filter"),c=i("filter");r({target:"Array",proto:!0,forced:!s||!c},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,n){e.exports=!1},function(e,n){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},function(e,n){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,n,t){var r=t(235),o=t(238);e.exports=function(e,n){var t=o(e,n);return r(t)?t:void 0}},function(e,n,t){"use strict";var r=t(114).charAt,o=t(31),a=t(127),i=o.set,s=o.getterFor("String Iterator");a(String,"String",(function(e){i(this,{type:"String Iterator",string:String(e),index:0})}),(function(){var e,n=s(this),t=n.string,o=n.index;return o>=t.length?{value:void 0,done:!0}:(e=r(t,o),n.index+=e.length,{value:e,done:!1})}))},function(e,n,t){var r,o=t(6),a=t(110),i=t(82),s=t(40),c=t(125),l=t(79),u=t(55),p=u("IE_PROTO"),d=function(){},f=function(e){return" - - + +

Distributed Infrastructure

Adhering to design principles of distributed systems, Venus chain service enables you to scale and guarantees availability to your storage providing systems

Optimized Storage Deal

Solution for both storage client and storage provider enables seamless storage deal process

Reimagined Storage Power

Completely revamped sealer submodule to help you to grow and maintain your storage power with more efficiency and stability

- + diff --git a/intro/_Footer.html b/intro/_Footer.html index e5fa957e1..ede91b0c5 100644 --- a/intro/_Footer.html +++ b/intro/_Footer.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/contribute-docs.html b/intro/contribute-docs.html index c21e4d9dd..7d4c01127 100644 --- a/intro/contribute-docs.html +++ b/intro/contribute-docs.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/damocles.html b/intro/damocles.html index fe5bd0085..51bacfc27 100644 --- a/intro/damocles.html +++ b/intro/damocles.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/droplet.html b/intro/droplet.html index 1f15fe6fe..418c2d4b2 100644 --- a/intro/droplet.html +++ b/intro/droplet.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/index.html b/intro/index.html index 0f2b87750..9ceaadc41 100644 --- a/intro/index.html +++ b/intro/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/one-pager.html b/intro/one-pager.html index a082aa3a6..1c8921951 100644 --- a/intro/one-pager.html +++ b/intro/one-pager.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/intro/sophon.html b/intro/sophon.html index 4e098e766..65748efc6 100644 --- a/intro/sophon.html +++ b/intro/sophon.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/Efficiency_of_sealing.html b/operation/Efficiency_of_sealing.html index 9c1df352e..7f0a1ac35 100644 --- a/operation/Efficiency_of_sealing.html +++ b/operation/Efficiency_of_sealing.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/System_monitor_of_Zabbix.html b/operation/System_monitor_of_Zabbix.html index 432c726b6..814fc8a6e 100644 --- a/operation/System_monitor_of_Zabbix.html +++ b/operation/System_monitor_of_Zabbix.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/_Footer.html b/operation/_Footer.html index 37e2b74b3..c757de43f 100644 --- a/operation/_Footer.html +++ b/operation/_Footer.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/example-single-box.html b/operation/example-single-box.html index 62bc4eeef..3a2495b12 100644 --- a/operation/example-single-box.html +++ b/operation/example-single-box.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/index.html b/operation/index.html index 15cbeaca7..ab74bc5d0 100644 --- a/operation/index.html +++ b/operation/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/lotus-vs-venus.html b/operation/lotus-vs-venus.html index 4f2f5ba3f..6b986f4ab 100644 --- a/operation/lotus-vs-venus.html +++ b/operation/lotus-vs-venus.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/nv15-upgrade.html b/operation/nv15-upgrade.html index d8864c389..8e3702fff 100644 --- a/operation/nv15-upgrade.html +++ b/operation/nv15-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/nv16-upgrade.html b/operation/nv16-upgrade.html index 4ea4927c1..5e705a6c2 100644 --- a/operation/nv16-upgrade.html +++ b/operation/nv16-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/nv17-upgrade.html b/operation/nv17-upgrade.html index 2259e7f8f..0ef9f568f 100644 --- a/operation/nv17-upgrade.html +++ b/operation/nv17-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/nv18-upgrade.html b/operation/nv18-upgrade.html index f2dd86c30..e4e452f59 100644 --- a/operation/nv18-upgrade.html +++ b/operation/nv18-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/operation/nv19-upgrade.html b/operation/nv19-upgrade.html index bc2e2a88e..6a254ec3d 100644 --- a/operation/nv19-upgrade.html +++ b/operation/nv19-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/questions.html b/questions.html index 7d52ea3be..deeacc583 100644 --- a/questions.html +++ b/questions.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/TODO.html b/zh/TODO.html index 17b367889..ed9ecfb68 100644 --- a/zh/TODO.html +++ b/zh/TODO.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/about/index.html b/zh/about/index.html index 69e464796..15b9815c9 100644 --- a/zh/about/index.html +++ b/zh/about/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/index.html b/zh/index.html index 335671e42..d995263b4 100644 --- a/zh/index.html +++ b/zh/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +

分布式架构

依照分布式系统的设计理念和原则,实现了一套快速扩展,高可用的分布式基础架构

优化订单体验

完善了一整套方便存储提供者接收真实存储订单,同时也方便存储客户发送存储订单的解决方案

全新的算力服务

安全,有韧性的算力维持服务;高效,灵活,可扩容的算力增长服务

- + diff --git a/zh/intro/_Footer.html b/zh/intro/_Footer.html index c85935ba7..86925d936 100644 --- a/zh/intro/_Footer.html +++ b/zh/intro/_Footer.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/contribute-doc.html b/zh/intro/contribute-doc.html index c16e12d2d..5ecd2c7a3 100644 --- a/zh/intro/contribute-doc.html +++ b/zh/intro/contribute-doc.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/damocles.html b/zh/intro/damocles.html index ead700967..c0f55c33b 100644 --- a/zh/intro/damocles.html +++ b/zh/intro/damocles.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/droplet.html b/zh/intro/droplet.html index 8f0a64054..a72990e03 100644 --- a/zh/intro/droplet.html +++ b/zh/intro/droplet.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/index.html b/zh/intro/index.html index a2652b4bd..c5edf9c73 100644 --- a/zh/intro/index.html +++ b/zh/intro/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/one-pager.html b/zh/intro/one-pager.html index b02ca14cf..e726bdb31 100644 --- a/zh/intro/one-pager.html +++ b/zh/intro/one-pager.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/intro/sophon.html b/zh/intro/sophon.html index f1d53be65..9fcc0e3ad 100644 --- a/zh/intro/sophon.html +++ b/zh/intro/sophon.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/Efficiency_of_sealing.html b/zh/operation/Efficiency_of_sealing.html index f297b4c48..58564a645 100644 --- a/zh/operation/Efficiency_of_sealing.html +++ b/zh/operation/Efficiency_of_sealing.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/Independent_com_access_analysis.html b/zh/operation/Independent_com_access_analysis.html index afe95ba11..45e492fad 100644 --- a/zh/operation/Independent_com_access_analysis.html +++ b/zh/operation/Independent_com_access_analysis.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + + - + diff --git a/zh/operation/Sealing_deploy_plan_1.html b/zh/operation/Sealing_deploy_plan_1.html index cbab94ea9..687a6d4f8 100644 --- a/zh/operation/Sealing_deploy_plan_1.html +++ b/zh/operation/Sealing_deploy_plan_1.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + + - + diff --git a/zh/operation/Sealing_deploy_plan_2.html b/zh/operation/Sealing_deploy_plan_2.html index d998126f5..605d84ea7 100644 --- a/zh/operation/Sealing_deploy_plan_2.html +++ b/zh/operation/Sealing_deploy_plan_2.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + + - + diff --git a/zh/operation/System_monitor_of_Zabbix.html b/zh/operation/System_monitor_of_Zabbix.html index 300a653ce..d648a2117 100644 --- a/zh/operation/System_monitor_of_Zabbix.html +++ b/zh/operation/System_monitor_of_Zabbix.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/_Footer.html b/zh/operation/_Footer.html index 8556cd509..598168d56 100644 --- a/zh/operation/_Footer.html +++ b/zh/operation/_Footer.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/example-single-box.html b/zh/operation/example-single-box.html index e78da7e82..e31c955f7 100644 --- a/zh/operation/example-single-box.html +++ b/zh/operation/example-single-box.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/index.html b/zh/operation/index.html index 53bcce39b..85a418322 100644 --- a/zh/operation/index.html +++ b/zh/operation/index.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/lotus-vs-venus.html b/zh/operation/lotus-vs-venus.html index 7b1d89ba5..af4c86107 100644 --- a/zh/operation/lotus-vs-venus.html +++ b/zh/operation/lotus-vs-venus.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/migrate_market_v1_to_v2.html b/zh/operation/migrate_market_v1_to_v2.html index 7a523fd75..db73bd0d9 100644 --- a/zh/operation/migrate_market_v1_to_v2.html +++ b/zh/operation/migrate_market_v1_to_v2.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/nv15-upgrade.html b/zh/operation/nv15-upgrade.html index 1aaa71585..9eee2dbd5 100644 --- a/zh/operation/nv15-upgrade.html +++ b/zh/operation/nv15-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/nv16-upgrade.html b/zh/operation/nv16-upgrade.html index 34c2f1df5..b6f57fba5 100644 --- a/zh/operation/nv16-upgrade.html +++ b/zh/operation/nv16-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/nv17-upgrade.html b/zh/operation/nv17-upgrade.html index 8d3ff77e1..e08a13a51 100644 --- a/zh/operation/nv17-upgrade.html +++ b/zh/operation/nv17-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/nv18-upgrade.html b/zh/operation/nv18-upgrade.html index ba5054348..4a0fe2d58 100644 --- a/zh/operation/nv18-upgrade.html +++ b/zh/operation/nv18-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/nv19-upgrade.html b/zh/operation/nv19-upgrade.html index e349d256a..47574b5c3 100644 --- a/zh/operation/nv19-upgrade.html +++ b/zh/operation/nv19-upgrade.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/prometheus-instruction.html b/zh/operation/prometheus-instruction.html index a42c2449e..19879c747 100644 --- a/zh/operation/prometheus-instruction.html +++ b/zh/operation/prometheus-instruction.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + +
- + diff --git a/zh/operation/troubleshoot-consensus-fault.html b/zh/operation/troubleshoot-consensus-fault.html index a37830f66..65823cad9 100644 --- a/zh/operation/troubleshoot-consensus-fault.html +++ b/zh/operation/troubleshoot-consensus-fault.html @@ -13,8 +13,8 @@ gtag('config', 'G-SMSDTMGLTV'); - - + + - +