text: (window.webpackJsonp=window.webpackJsonp||[]).push([[281],{653:function(e,t,s){"use strict";s.r(t);var a=s(42),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"_5-million-websockets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5-million-websockets"}},[e._v("#")]),e._v(" 5 Million WebSockets "),s("seo")],1),e._v(" "),s("p",[e._v("Date - "),s("code",[e._v("May 20, 2019")]),s("br"),e._v("\nOatpp version - "),s("code",[e._v("0.19.4")])]),e._v(" "),s("p",[e._v("This article describes oatpp benchmark for 5 Million "),s("strong",[e._v("fully-loaded")]),e._v(" concurrent websocket connections.")]),e._v(" "),s("p",[e._v("It consists of two parts:")]),e._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"#_4m-websockets"}},[e._v("4 Million WebSockets test")]),e._v(".")]),e._v(" "),s("li",[s("a",{attrs:{href:"#_5m-websockets"}},[e._v("5 Million WebSockets test")]),e._v(".")])]),e._v(" "),s("h2",{attrs:{id:"the-purpose"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-purpose"}},[e._v("#")]),e._v(" The Purpose")]),e._v(" "),s("p",[e._v("This benchmark is aimed to determine scalability of oatpp with increase of load and computing powers with respect to "),s("strong",[e._v("previous")]),e._v(" "),s("RouterLink",{attrs:{to:"/benchmark/websocket/2-million/"}},[e._v("2-million WebSockets benchmark")]),e._v(".")],1),e._v(" "),s("table",[s("thead",[s("tr",[s("th"),e._v(" "),s("th",[e._v("Previous, 2M benchmark")]),e._v(" "),s("th",[e._v("This, 4M / 5M benchmark")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("Computing power")]),e._v(" "),s("td",[s("strong",[e._v("8 vCPUs, 52 GB memory")])]),e._v(" "),s("td",[s("strong",[e._v("16 vCPUs, 104 GB memory")])])]),e._v(" "),s("tr",[s("td",[e._v("Load")]),e._v(" "),s("td",[s("strong",[e._v("2M connections")])]),e._v(" "),s("td",[s("strong",[e._v("4M / 5M connections")])])])])]),e._v(" "),s("h2",{attrs:{id:"_4m-websockets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_4m-websockets"}},[e._v("#")]),e._v(" 4M WebSockets")]),e._v(" "),s("h3",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[e._v("#")]),e._v(" Setup")]),e._v(" "),s("img",{attrs:{alt:"Setup diagram",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/diagram/4m-websockets-setup.svg?sanitize=true"}}),e._v(" "),s("ul",[s("li",[e._v("Server Machine - Google-Cloud "),s("strong",[e._v("n1-highmem-16 (16 vCPUs, 104 GB memory)")]),e._v(" running Debian GNU/Linux 9.")]),e._v(" "),s("li",[e._v("Client Machine - Google-Cloud "),s("strong",[e._v("n1-highmem-16 (16 vCPUs, 104 GB memory)")]),e._v(" running Debian GNU/Linux 9.")])]),e._v(" "),s("p",[s("strong",[e._v("Server application")]),e._v(" listens to 400 ports from 8000 to 8399\n(in order to prevent ephemeral ports exhaustion on the client - as we running all 4M clients on the same machine).\nOnce there is a message on WebSocket, server will echo client's message adding "),s("code",[e._v('"Hello from oatpp!"')]),e._v(" at the beginning.")]),e._v(" "),s("p",[s("strong",[e._v("Client application")]),e._v(" opens 10k connections on each port, waits all connections are ready (all WebSocket handshakes are done) then starts the load.\nEach of 2-million websocket clients continuously sends messages to server. Once message is sent client sends another one.")]),e._v(" "),s("p",[e._v("Both server and client applications are running asynchronous oatpp server/client based on "),s("RouterLink",{attrs:{to:"/docs/oatpp-coroutines/"}},[e._v("oatpp coroutines")]),e._v(".")],1),e._v(" "),s("h3",{attrs:{id:"results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#results"}},[e._v("#")]),e._v(" Results")]),e._v(" "),s("p",[e._v("Server showed stable performance through all the benchmark test delivering about "),s("code",[e._v("17 Million")]),e._v(" messages per minute ("),s("code",[e._v("~57.5 Mb/Second")]),e._v("):")]),e._v(" "),s("img",{attrs:{alt:"Server monitoring graph",src:"https://github.com/lganzzzo/oatpp-website-res/raw/master/benchmark/websocket/4m/monitoring.png",width:"800px"}}),e._v(" "),s("h3",{attrs:{id:"server-stats"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-stats"}},[e._v("#")]),e._v(" Server Stats")]),e._v(" "),s("h4",{attrs:{id:"resource-consumption"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-consumption"}},[e._v("#")]),e._v(" Resource consumption")]),e._v(" "),s("p",[e._v("Server memory consumption was stable at about 30GB.")]),e._v(" "),s("img",{attrs:{alt:"Server resource consumption",border:"1",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/benchmark/websocket/4m/top-server.png",width:"800px"}}),e._v(" "),s("h4",{attrs:{id:"throughput"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#throughput"}},[e._v("#")]),e._v(" Throughput")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("SOCKETS:          4000000          # - Number of connected clients                                                       \nFRAMES_TOTAL:     573911830        # - Frames received by server (total)                                                          \nMESSAGES_TOTAL:   573905877        # - Messages received by server (total)                                                          \nFRAMES_PER_MIN:   17373801.439247  # - Frames received rate per minute                                               \nMESSAGES_PER_MIN: 17372968.482111  # - Messages received rate per minute  \n")])])]),s("h3",{attrs:{id:"client-stats"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#client-stats"}},[e._v("#")]),e._v(" Client Stats")]),e._v(" "),s("h4",{attrs:{id:"resource-consumption-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-consumption-2"}},[e._v("#")]),e._v(" Resource consumption")]),e._v(" "),s("p",[e._v("Client memory consumption was stable at about 20.5GB.")]),e._v(" "),s("img",{attrs:{alt:"Server resource consumption",border:"1",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/benchmark/websocket/4m/top-client.png",width:"800px"}}),e._v(" "),s("h4",{attrs:{id:"throughput-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#throughput-2"}},[e._v("#")]),e._v(" Throughput")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("SOCKETS:          4000000          # - Number of connected clients                                                       \nFRAMES_TOTAL:     516770460        # - Frames received by client (total)                                                          \nMESSAGES_TOTAL:   516405193        # - Messages received by client (total)                                                          \nFRAMES_PER_MIN:   16801610.114129  # - Frames received rate per minute                                               \nMESSAGES_PER_MIN: 16472169.881512  # - Messages received rate per minute  \n")])])]),s("h2",{attrs:{id:"_5m-websockets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_5m-websockets"}},[e._v("#")]),e._v(" 5M WebSockets")]),e._v(" "),s("h3",{attrs:{id:"setup-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-2"}},[e._v("#")]),e._v(" Setup")]),e._v(" "),s("img",{attrs:{alt:"Setup diagram",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/diagram/5m-websockets-setup.svg?sanitize=true"}}),e._v(" "),s("ul",[s("li",[e._v("Server Machine - Google-Cloud "),s("strong",[e._v("n1-highmem-16 (16 vCPUs, 104 GB memory)")]),e._v(" running Debian GNU/Linux 9.")]),e._v(" "),s("li",[e._v("Client Machine - Google-Cloud "),s("strong",[e._v("n1-highmem-16 (16 vCPUs, 104 GB memory)")]),e._v(" running Debian GNU/Linux 9.")])]),e._v(" "),s("p",[s("strong",[e._v("Server application")]),e._v(" listens to 500 ports from 8000 to 8499\n(in order to prevent ephemeral ports exhaustion on the client - as we running all 5m clients on the same machine).\nOnce there is a message on WebSocket, server will echo client's message adding "),s("code",[e._v('"Hello from oatpp!"')]),e._v(" at the beginning.")]),e._v(" "),s("p",[s("strong",[e._v("Client application")]),e._v(" opens 10k connections on each port, waits all connections are ready (all WebSocket handshakes are done) then starts the load.\nEach of 2-million websocket clients continuously sends messages to server. Once message is sent client sends another one.")]),e._v(" "),s("p",[e._v("Both server and client applications are running asynchronous oatpp server/client based on "),s("RouterLink",{attrs:{to:"/docs/oatpp-coroutines/"}},[e._v("oatpp coroutines")]),e._v(".")],1),e._v(" "),s("hr"),e._v(" "),s("p",[e._v("As main point of memory consumption is linux sockets buffers, for 5M connections it was required to reduce "),s("code",[e._v("net.ipv4.tcp_rmem")]),e._v(" in\norder for the test to be stable")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("sysctl -w net.ipv4.tcp_rmem"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[e._v("'2048 2048 2048'")]),e._v("\n")])])]),s("p",[s("em",[e._v("Here we reduce read buffers as it appeared to have minimal performance impact in this particular case.")])]),e._v(" "),s("h2",{attrs:{id:"results-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#results-2"}},[e._v("#")]),e._v(" Results")]),e._v(" "),s("p",[e._v("Server showed stable performance through all the benchmark test delivering about "),s("code",[e._v("18 Million")]),e._v(" messages per minute ("),s("code",[e._v("~58 Mb/Second")]),e._v("):")]),e._v(" "),s("img",{attrs:{alt:"Server monitoring graph",src:"https://github.com/lganzzzo/oatpp-website-res/raw/master/benchmark/websocket/5m/monitoring.png",width:"800px"}}),e._v(" "),s("h3",{attrs:{id:"server-stats-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-stats-2"}},[e._v("#")]),e._v(" Server Stats")]),e._v(" "),s("h4",{attrs:{id:"resource-consumption-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-consumption-3"}},[e._v("#")]),e._v(" Resource consumption")]),e._v(" "),s("p",[e._v("Server memory consumption was stable at about 36GB.")]),e._v(" "),s("img",{attrs:{alt:"Server resource consumption",border:"1",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/benchmark/websocket/5m/top-server.png",width:"800px"}}),e._v(" "),s("h4",{attrs:{id:"throughput-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#throughput-3"}},[e._v("#")]),e._v(" Throughput")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("SOCKETS:          5000000          # - Number of connected clients                                                       \nFRAMES_TOTAL:     1179521220       # - Frames received by server (total)                                                          \nMESSAGES_TOTAL:   1177610133       # - Messages received by server (total)                                                          \nFRAMES_PER_MIN:   19625257.718400  # - Frames received rate per minute                                               \nMESSAGES_PER_MIN: 19619426.046304  # - Messages received rate per minute  \n")])])]),s("h3",{attrs:{id:"client-stats-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#client-stats-2"}},[e._v("#")]),e._v(" Client Stats")]),e._v(" "),s("h4",{attrs:{id:"resource-consumption-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resource-consumption-4"}},[e._v("#")]),e._v(" Resource consumption")]),e._v(" "),s("p",[e._v("Client memory consumption was stable at about 24GB.")]),e._v(" "),s("img",{attrs:{alt:"Server resource consumption",border:"1",src:"https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/benchmark/websocket/5m/top-client.png",width:"800px"}}),e._v(" "),s("h4",{attrs:{id:"throughput-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#throughput-4"}},[e._v("#")]),e._v(" Throughput")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("SOCKETS:          5000000          # - Number of connected clients                                                       \nFRAMES_TOTAL:     1108906831       # - Frames received by client (total)                                                          \nMESSAGES_TOTAL:   1097120434       # - Messages received by client (total)                                                          \nFRAMES_PER_MIN:   17878571.176088  # - Frames received rate per minute                                               \nMESSAGES_PER_MIN: 17612701.369327  # - Messages received rate per minute  \n")])])]),s("h2",{attrs:{id:"steps-to-reproduce"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-reproduce"}},[e._v("#")]),e._v(" Steps to Reproduce")]),e._v(" "),s("p",[e._v("Create two "),s("code",[e._v("n1-highmem-16 (16 vCPUs, 104 GB memory) - Debian GNU/Linux 9")]),e._v(" instances in same VPC on Google Cloud.")]),e._v(" "),s("h3",{attrs:{id:"execute-the-following-commands-for-both-instances-ssh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#execute-the-following-commands-for-both-instances-ssh"}},[e._v("#")]),e._v(" Execute the following commands for both instances (SSH).")]),e._v(" "),s("ul",[s("li",[e._v("Install git")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt-get")]),e._v(" update\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt-get")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n")])])]),s("ul",[s("li",[e._v("Clone "),s("a",{attrs:{href:"https://github.com/oatpp/benchmark-websocket",target:"_blank",rel:"noopener noreferrer"}},[e._v("benchmark-websocket repo"),s("OutboundLink")],1),e._v(" and "),s("code",[e._v("cd")]),e._v(" to repo folder")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/oatpp/benchmark-websocket\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" benchmark-websocket\n")])])]),s("ul",[s("li",[e._v("Install "),s("code",[e._v("oatpp")]),e._v(" and "),s("code",[e._v("oatpp-websocket")]),e._v(" modules (run ./prepare.sh script).")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ ./prepare.sh\n")])])]),s("ul",[s("li",[e._v("Configure environment (run ./sock-config-5m.sh script)")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ ./sock-config.sh\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("ulimit")]),e._v(" -n "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("6000000")]),e._v("\n")])])]),s("h3",{attrs:{id:"build-and-run-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build-and-run-server"}},[e._v("#")]),e._v(" Build and Run Server")]),e._v(" "),s("p",[e._v("Commands for server instance only:")]),e._v(" "),s("ul",[s("li",[e._v("Build server")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" server/build/\n$ cmake "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v("\n")])])]),s("ul",[s("li",[e._v("Run server")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ ./wsb-server-exe --tp "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("16")]),e._v(" --tio "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("8")]),e._v(" --pc "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("500")]),e._v("\n")])])]),s("p",[e._v("where:"),s("br"),e._v(" "),s("code",[e._v("--tp")]),e._v(" - number of data-processing threads."),s("br"),e._v(" "),s("code",[e._v("--tio")]),e._v(" - number of I/O workers."),s("br"),e._v(" "),s("code",[e._v("--pc")]),e._v(" - number of ports to listen to.")]),e._v(" "),s("h3",{attrs:{id:"build-and-run-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build-and-run-client"}},[e._v("#")]),e._v(" Build and Run Client")]),e._v(" "),s("p",[e._v("Commands for client instance only:")]),e._v(" "),s("ul",[s("li",[e._v("Build client")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" client/build/\n$ cmake "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v("\n")])])]),s("ul",[s("li",[e._v("Run client")])]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("$ ./wsb-client-exe --tp "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("16")]),e._v(" --tio "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("8")]),e._v(" -h "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("server-private-ip"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" --socks-max "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("5000000")]),e._v(" --socks-port "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("10000")]),e._v(" --si "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("1000")]),e._v(" --sf "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("30")]),e._v(" --pc "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("500")]),e._v("\n")])])]),s("p",[e._v("where:"),s("br"),e._v(" "),s("code",[e._v("--tp")]),e._v(" - number of data-processing threads."),s("br"),e._v(" "),s("code",[e._v("--tio")]),e._v(" - number of I/O workers."),s("br"),e._v(" "),s("code",[e._v("-h <server-private-ip>")]),e._v(" - substitute "),s("strong",[e._v("private-ip")]),e._v(" of server instance here."),s("br"),e._v(" "),s("code",[e._v("--socks-max")]),e._v(" - how many client connections to establish."),s("br"),e._v(" "),s("code",[e._v("--socks-port")]),e._v(" - how many client connections per port."),s("br"),e._v(" "),s("code",[e._v("--si 1000 --sf 30")]),e._v(" - control how fast clients will connect to server. Here - each "),s("code",[e._v("1000")]),e._v(" iterations sleep for "),s("code",[e._v("30")]),e._v(" milliseconds."),s("br"),e._v(" "),s("code",[e._v("--pc")]),e._v(" - number of available server ports to connect to.")]),e._v(" "),s("p",[s("strong",[e._v("Note")]),e._v(" - clients will not start load until all clients are connected."),s("br"),e._v(" "),s("strong",[e._v("Note")]),e._v(" - client app will fail with assertion if any of clients has failed.")]),e._v(" "),s("h2",{attrs:{id:"conclusion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),s("p",[e._v("Previous results for 2M WebSockets were "),s("strong",[e._v("9 Million messages per minute ~32.7 Mb/Second")]),e._v(". So it was "),s("strong",[e._v("expected")]),e._v(" to\nget something aroud "),s("strong",[e._v("18 Million messages per minute ~64 Mb/Second")]),e._v(" in this benchmark (As computing power was increased x2).")]),e._v(" "),s("p",[e._v("Actual results are "),s("strong",[e._v("17-18 Million messages per minute, with about ~58 Mb/Second")]),e._v(" - which is a good result, almost as expected.")]),e._v(" "),s("p",[e._v("At this point oatpp has shown almost constant I/O performance with respect load increase.")]),e._v(" "),s("h2",{attrs:{id:"links"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#links"}},[e._v("#")]),e._v(" Links")]),e._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/oatpp/oatpp",target:"_blank",rel:"noopener noreferrer"}},[e._v("oatpp repo"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/oatpp/benchmark-websocket",target:"_blank",rel:"noopener noreferrer"}},[e._v("This benchmark repo"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/oatpp/oatpp-websocket",target:"_blank",rel:"noopener noreferrer"}},[e._v("oatpp-websocket repo"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=r.exports}}]);