{"id":3057,"date":"2018-10-18T22:47:11","date_gmt":"2018-10-19T02:47:11","guid":{"rendered":"https:\/\/webrtchacks.com\/?p=3057"},"modified":"2018-10-20T09:19:25","modified_gmt":"2018-10-20T13:19:25","slug":"sfu-load-testing","status":"publish","type":"post","link":"https:\/\/webrtchacks.com\/sfu-load-testing\/","title":{"rendered":"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard)"},"content":{"rendered":"<p>If you plan to have multiple participants in your WebRTC calls then you will probably end up using a <a href=\"https:\/\/webrtchacks.com\/tag\/sfu\/\">Selective Forwarding Unit (SFU)<\/a>.\u00a0 Capacity planning for SFU\u2019s can be difficult \u2013 there are estimates to be made for where they should be placed, how much bandwidth they will consume, and what kind of servers you need.<\/p>\n<p>To help network architects and WebRTC engineers make some of these decisions, <a href=\"https:\/\/webrtchacks.com\/?s=gouaillard\">webrtcHacks contributor<\/a> Dr. Alex Gouaillard and his team at <a href=\"https:\/\/www.cosmosoftware.io\/\">CoSMo Software<\/a> put together a load test suite to measure load vs. video quality. They\u00a0<a href=\"https:\/\/www.cosmosoftware.io\/media.html\">published<\/a> their results for all of the major open source WebRTC SFU\u2019s. This suite based is the <a href=\"https:\/\/github.com\/webrtc\/KITE\">Karoshi Interoperability Testing Engine (KITE)<\/a> Google funded and <a href=\"https:\/\/webrtc.org\/testing\/kite\/\">uses on webrtc.org to<\/a> show interoperability status. The CoSMo team also developed a machine learning based video quality assessment framework optimized for real time communications scenarios.<\/p>\n<p>First an important word of caution \u2013 asking what kind of SFU is the best is kind of like asking what car is best. If you only want fast then you should get a Formula 1 car but that won\u2019t help you take the kids to school. Vendors never get excited about these kinds of tests because it boils down their functionality into just a few performance metrics. These metrics may not have been a major part of their design criterion and a lot of times they just aren\u2019t that important. For WebRTC SFU\u2019s in particular, just because you can load a lot of streams on an SFU, there may be many resiliency, user behavior, and cost optimization reasons for not doing that. Load also tests don\u2019t take a deep look at the end-to-end user experience, ease of development, or all the other functional elements that go into a successful service. Lastly, a published report like this represents a single point in time &#8211; these systems are always improving so result might be better today.<\/p>\n<p>That being said, I personally have had many cases where I wish I had this kind of data when building out cost models. Alex and his team have done a lot of thorough work here and this is great sign for maturity in the WebRTC open source ecosystem. I personally reached out to each of the SFU development teams mentioned here to ensure they were each represented fairly. This test setup is certainly not perfect, but I do think it will be a useful reference for the community.<\/p>\n<p>Please read on for Alex\u2019s test setup and analysis summary.<\/p>\n<p>{\u201ceditor\u201d: \u201c<u><a href=\"https:\/\/webrtchacks.com\/about\/chad\/\" target=\"_blank\" rel=\"noopener\">chad hart<\/a><\/u>\u201c}<br \/>\n<a title=\"overloaded Jetta\" href=\"https:\/\/www.flickr.com\/photos\/simply-put\/396845694\" data-flickr-embed=\"true\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\" alt=\"overloaded Jetta\" width=\"606\" height=\"408\" \/><\/a><script async src=\"\/\/embedr.flickr.com\/assets\/client-code.js\" charset=\"utf-8\"><\/script><\/p>\n<h1>Introduction<\/h1>\n<p>One recurring question on the<a href=\"https:\/\/groups.google.com\/forum\/#!forum\/discuss-webrtc\" target=\"_blank\" rel=\"noopener\">\u00a0<\/a><u><a href=\"https:\/\/groups.google.com\/forum\/#!forum\/discuss-webrtc\" target=\"_blank\" rel=\"noopener\">discuss-webrtc mailing list<\/a><\/u>\u00a0is \u201cWhat is the best SFU\u201d. This invariably produces a response of \u201cMine obviously\u201d from the various SFU vendors and teams. Obviously, they cannot all be right at the same time!<\/p>\n<p>You can check the full thread<u><a href=\"https:\/\/groups.google.com\/d\/msg\/discuss-webrtc\/i6ywvlhJ1YE\/rKzT_YH9wqsJ\" target=\"_blank\" rel=\"noopener\">\u00a0here<\/a><\/u>. Chad Hart, then with Dialogic answered kindly recognizing the problem and expressed a need:<\/p>\n<blockquote><p>In any case, I think we need a global (same applied to all) reproducible and unbiased (source code available, and every vendor can tune their installation if they want) benchmark, for several scalability metrics.<\/p><\/blockquote>\n<p>Three years later my team and I have built such a benchmark system. I will explain how this system works and show some of our initial results below.<\/p>\n<h1>The Problem<\/h1>\n<p>Several SFU vendors provide load testing tools. Janus has Jattack. Jitsi has<a href=\"https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/\" target=\"_blank\" rel=\"noopener\">\u00a0<\/a><u><a href=\"https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/\" target=\"_blank\" rel=\"noopener\">jitsi-hamme<\/a><\/u>r and even<a href=\"https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/\" target=\"_blank\" rel=\"noopener\">\u00a0<\/a><u><a href=\"https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/\" target=\"_blank\" rel=\"noopener\">published some of their results<\/a><\/u>. Jitsi in particular has done a great job\u00a0with transparency\u00a0and provides\u00a0reliable data and enough information to reproduce the results. However, not all vendors have these tools and fewer still make them fully publicly available. \u00a0In addition, each tool is designed to answer slightly different questions for their own environments such as:<\/p>\n<ul>\n<li>How many streams can a single server instance of chosen type and given bandwidth limit handle?<\/li>\n<li>How many users can I support on the same instance?<\/li>\n<li>How many users can I support in a single conference?<\/li>\n<li>Etc.\u2026<\/li>\n<\/ul>\n<p>There was just no way to make a real comparative study \u2013 one that is independent reproducible, and unbiased. The inherent ambiguity also opened the door for some unsavory behavior from some who realized they could get away with any claim because no one could actually check them. We wanted to produce some results that one does not have to take on faith and that could be peer-reviewed.<\/p>\n<h1>What use cases?<\/h1>\n<p>To have a good answer to \u201cWhat is the best SFU?\u201d you need to explain what you are planning to use it for.<\/p>\n<p>We chose to work on the two use cases that seemed to gather the most attention, or at least those which were generating the most traffic on discuss-webrtc:<\/p>\n<ol>\n<li>Video conferencing &#8211; many to many, all equals, one participant speaking at a time (hopefully) ,<\/li>\n<li>Media streaming &#8211; one-to many, unidirectional<\/li>\n<\/ol>\n<p>Most video conferencing questions are focused on single server instance. Having 20+ people in a given conference is usually plenty for most. Studies <u><a href=\"https:\/\/jitsi.org\/news\/p2p4121\/\" target=\"_blank\" rel=\"noopener\">like this one<\/a><\/u>\u00a0show\u00a0that in most social cases most of the calls are 1-1, and the average is around 3. , This configuration fits very well a single small instance in any public cloud provider (as long as you get a 1Gbps NIC). You can then use very simple load balancing and horizontal scalability techniques since the ratio of senders to viewers is rarely high. Media streaming, on the other hand, typically involves streaming from a single source to thousands or tens of thousands of viewers. This requires a multi-server hierarchy.<\/p>\n<p>We wanted to accommodate different testing scenarios and implement them in the same fashion across several WebRTC Servers so that the only difference is the system being tested, and the results are not biased.<\/p>\n<p>For purposes of this post I will focus on the video conferencing scenario. For those that are interested, we are finalizing our media streaming test results and plan to present them \u00a0at <u><a href=\"http:\/\/www.streamingmedia.com\/Conferences\/west2018\/default.aspx\" target=\"_blank\" rel=\"noopener\">Streaming Media West<\/a><\/u>\u00a0on November 14th.<\/p>\n<h1>The test suite<\/h1>\n<p>In collaboration with Google and many others, we developed <u><a href=\"https:\/\/github.com\/webrtc\/KITE\" target=\"_blank\" rel=\"noopener\">KITE<\/a><\/u>, a testing engine that would allow us to support all kinds of clients &#8211; browsers and native across mobile or desktop &#8211; and all kind of test scenarios easily. It is used to test WebRTC implementation everyday across browsers as seen on <u><a href=\"https:\/\/webrtc.org\/testing\/kite\/\" target=\"_blank\" rel=\"noopener\">webrtc.org<\/a><\/u><\/p>\n<p><u><\/u><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3053 size-medium\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-300x109.png\" alt=\"Kite logo title\" width=\"300\" height=\"109\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-300x109.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-768x280.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-1024x373.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-600x218.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title-560x204.png 560w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/Kite_logo_title.png 1244w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2>Selecting a test client<\/h2>\n<p>Load testing is typically done with a single client to control for client impacts. Ideally you can run many instances of the test client in parallel in a single virtual machine (VM). Since this is WebRTC, it makes sense to use one of the browsers. Edge and Safari are limited to a single process, which does not make they very suitable. Additionally, Safari only runs MacOS or iOS, which only runs on Apple hardware. It is relatively easy to spawn a million VMs on AWS if you\u2019re running Windows or Linux. It\u2019s quite a bit more difficult, and costly, to setup one million Macs, iPhones, or iPads for testing (Note, I am still dreaming<u><a href=\"https:\/\/twitter.com\/stevesi\/status\/951984317994971136\" target=\"_blank\" rel=\"noopener\">\u00a0about this<\/a><\/u>\u00a0though).<\/p>\n<p>That leaves you with Chrome or Firefox which allow multiple instances just fine. It is our opinion that the implementation of webdriver for Chrome is easier to manage with fewer flags and plugins (i.e. H264) to handle, so we chose to use Chrome.<\/p>\n<h2>Systems Under Test<\/h2>\n<p>We tested the following SFUs:<\/p>\n<ul>\n<li><u><a href=\"https:\/\/janus.conf.meetecho.com\/\" target=\"_blank\" rel=\"noopener\">Janus<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/meet.jit.si\/\" target=\"_blank\" rel=\"noopener\">Jitsi<\/a><\/u><\/li>\n<li><u><a href=\"http:\/\/www.kurento.org\/\" target=\"_blank\" rel=\"noopener\">Kurento<\/a><\/u><\/li>\n<li><u><a href=\"https:\/\/mediasoup.org\/\" target=\"_blank\" rel=\"noopener\">mediasoup<\/a><\/u><\/li>\n<li><u><a href=\"http:\/\/www.medooze.com\/\" target=\"_blank\" rel=\"noopener\">Medooze<\/a><\/u><\/li>\n<\/ul>\n<p>To help make sure each SFU showed its best results, we contacted the teams behind each of these projects. We offered to let them set up the server themselves or connect to the servers and check-up their settings. We also shared the results so they could comment. That made sure we properly configured each system to handle optimally for our test.<\/p>\n<p>Interestingly enough, during the life of this study we found quite a few bugs and worked with the teams to improve their solutions. This is discussed more in detail in the last section.<\/p>\n<h2>Test Setup<\/h2>\n<p>We used the following methodology to increase traffic to a high load. First we populated each video conference rooms with one user at a time until it reached 7 total users. We repeated this process until the total target number of users was reached. \u00a0close to 500 simultaneous users.<\/p>\n<p>The diagram below shows the elements in the testbed:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"604\" height=\"631\" class=\"wp-image-3050\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/data_flow.png\" alt=\"data flow\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/data_flow.png 604w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/data_flow-287x300.png 287w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/data_flow-600x627.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/data_flow-560x585.png 560w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/p>\n<h2>Metrics<\/h2>\n<p>Most people interested in scalability questions will measure the CPU, RAM, and bandwidth footprints of the server as the \u201cload\u201d (streams, users, rooms\u2026) ramps up. That is a traditional way of doing things that supposes that the quality of the streams, their bitrate&#8230; all stay equal.<\/p>\n<p>WebRTC\u2019s encoding engine makes this much more complex. WebRTC includes bandwidth estimation, bitrate adaptation and overall congestion control mechanism, one cannot assume streams will remain unmodified across the experiment. In addition to \u00a0the usual metrics, the tester also needs to record client-side metrics like sent bitrate, bandwidth estimation results and latency. It is also important to keep an eye on the video quality, as it can degrade way before you saturate the CPU, RAM and\/or bandwidth of the server.<\/p>\n<p>On the client side, we ended up measuring the following:<\/p>\n<ul>\n<li>Rate of success and failures (frozen video, or no video)<\/li>\n<li>Sender and receiver bitrates<\/li>\n<li>Latency<\/li>\n<li>Video quality (more on that in the next section)<\/li>\n<\/ul>\n<p>Measuring different metrics on the server side can be as easy as pooling the getStats API yourself or integrating a solution like callstats.io. In our case, we measured:<\/p>\n<ul>\n<li>CPU footprint,<\/li>\n<li>RAM footprint,<\/li>\n<li>Ingress and egress bandwidth in and out,<\/li>\n<li>number of streams,<\/li>\n<li>along with a few of other less relevant metrics.<\/li>\n<\/ul>\n<p>The metrics above were not published in the Scientific article because of space limitation, but should be released in a subsequent Research Report.<\/p>\n<p>All of these metrics are simple to produce and measure with the exception of video quality. What is an objective measure of video quality? Several proxies for video quality exist such as Google rendering time, received frames, bandwidth usage, but none of these gave an accurate measure.<\/p>\n<h1>Video quality metric<\/h1>\n<p>Ideally a video quality metric would be visually obvious when impairments are present. \u00a0This would allow one to measure the relative benefits of resilient techniques, such as like Scalable Video Coding (SVC), where conceptually the output video has a looser correlation with jitter, packet loss, etc. than other encoding methods. See the below video from Agora for a good example of a visual comparison:<\/p>\n<p><u><a href=\"https:\/\/www.youtube.com\/watch?v=M71uov3OMfk\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/watch?v=M71uov3OMfk<\/a><\/u><\/p>\n<p>After doing some quick research on a way to automate this kind of visual quality measurement, we realized that nobody had developed a method to assess the video quality as well as a human would in the absence of reference media with a \u00a0real-time stream. So, we went on to develop our own metric leveraging Machine Learning with neural networks. This allowed for real-time, on-the-fly video quality assessment. As an added benefit, it can be used without recording customer media, which is a sometimes a legal or privacy issue.<\/p>\n<p>The specifics of this mechanism is beyond the scope of this article but you can read more about the video quality algorithm <u><a href=\"http:\/\/webrtcbydralex.com\/index.php\/2018\/10\/11\/webrtc-video-quality-assessment\/\" target=\"_blank\" rel=\"noopener\">here<\/a><\/u>. The specifics of this AI-based algorithm have been submitted for publication and will be made public as soon as it is accepted.<\/p>\n<h1>Show me the <del>money<\/del> results<\/h1>\n<p>We set up the following five open-source WebRTC SFUs, using the latest source code downloaded from their respective public GitHub repositories (except for Kurento\/OpenVidu, for which the Docker container was used):<\/p>\n<ul>\n<li><u><a href=\"https:\/\/github.com\/jitsi\/jitsi-meet\" target=\"_blank\" rel=\"noopener\">Jitsi Meet<\/a><\/u>\u00a0(JVB version 0.1.1077),<\/li>\n<li><u><a href=\"https:\/\/github.com\/meetecho\/janus-gateway\" target=\"_blank\" rel=\"noopener\">Janus Gateway<\/a><\/u>\u00a0(version 0.4.3) with its <u><a href=\"https:\/\/janus.conf.meetecho.com\/videoroomtest.html\" target=\"_blank\" rel=\"noopener\">video room plugin<\/a><\/u>,<\/li>\n<li><u><a href=\"https:\/\/github.com\/medooze\/mp4v2.git\" target=\"_blank\" rel=\"noopener\">Medooze<\/a><\/u>\u00a0(version 0.32.0) <u><a href=\"https:\/\/github.com\/medooze\/sfu\/tree\/master\/www\" target=\"_blank\" rel=\"noopener\">SFU app<\/a><\/u>,<\/li>\n<li>Kurento (from <u><a href=\"https:\/\/openvidu.io\/docs\/deployment\/deploying-ubuntu\/\" target=\"_blank\" rel=\"noopener\">OpenVidu Docker container<\/a><\/u>, Kurento Media Server version \u00a06.7.0),<\/li>\n<li><u><a href=\"https:\/\/www.npmjs.com\/package\/mediasoup\" target=\"_blank\" rel=\"noopener\">mediasoup<\/a><\/u>\u00a0(version 2.2.3),<\/li>\n<\/ul>\n<p>Each was setup in a separate but identical Virtual Machine and with default configuration.<\/p>\n<h2>Disclaimers<\/h2>\n<p>First a few disclaimers.\u00a0All teams have seen and commented on the result of their SFUs.<\/p>\n<p>The Kurento Media Server team is aware that their server is currently crashing early and we are working with them to address this. On Kurento\/OpenVidu, we tested max 140 streams (since it crashes so early).<\/p>\n<p>In addition, there is a <u><a href=\"https:\/\/gitlab.freedesktop.org\/libnice\/libnice\/issues\/1\" target=\"_blank\" rel=\"noopener\">known bug in libnice<\/a><\/u>, which affected both Kurento\/OpenVidu and Janus during our initial tests. \u00a0After a libnice patch was applied as advised by the Janus team, their results significantly improved. \u00a0However, the re-test with the patch on Kurento\/OpenVidu actually proved even worse. Our conclusion was that there are other issues with Kurento. We are in contact with them and working on fixes so, the Kurento\/OpenVidu results might improve soon.<\/p>\n<p style=\"text-align: left;\">The latest version of Jitsi Videobridge (up to the point of this publication) always became unstable at exactly 240 users. The Jitsi team is aware of that and working on the problem. They have however pointed out that their general advice is to rely on horizontal scaling with a larger number of smaller instances as described <u><a href=\"https:\/\/jitsi.org\/news\/new-tutorial-video-scaling-jitsi-meet-in-the-cloud\/\" target=\"_blank\" rel=\"noopener\">here<\/a><\/u>. Note that a previous version (as two months ago) did not have these stability issues but did not perform as well (see more on this in the next section). We chose to keep version 0.1.1077 as it included made simulcast much better and improved the results significantly (up to 240 participants, that is).<\/p>\n<p>Also note nearly all of these products have had version releases since testing. Some have made improvements since the test results shown here.<\/p>\n<h2>Measurements<\/h2>\n<p>As an reference point, we chose one of the <u><a href=\"https:\/\/archive.org\/details\/e-dv548_lwe08_christa_casebeer_003.ogg\" target=\"_blank\" rel=\"noopener\">usual video test sequences<\/a><\/u>, and computed its video quality score using several video quality assessment metrics:<\/p>\n<ul>\n<li>SSIM &#8211; a common metric that compares the difference between a distorted image and its original<\/li>\n<li>VMAF &#8211; an aggregate measure of a few metrics used and <u><a href=\"https:\/\/github.com\/Netflix\/vmaf\" target=\"_blank\" rel=\"noopener\">developed by Netflix<\/a><\/u><\/li>\n<li>NARVAL &#8211; our algorithm which does not require a reference<\/li>\n<\/ul>\n<figure id=\"attachment_3056\" aria-describedby=\"caption-attachment-3056\" style=\"width: 600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3056 size-full\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/graph.png\" alt=\"graph\" width=\"600\" height=\"400\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/graph.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/graph-300x200.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/graph-560x373.png 560w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-3056\" class=\"wp-caption-text\">Image 1: benchmarking various video quality metric over different bitrates<\/figcaption><\/figure>\n<p>Note the relationship between quality score and bitrate is not linear. If you slowly decrease the bandwidth from the reference value (1.7Mbps) the quality score only decreases slightly until it hits a low bitrate threshold and then decreases more drastically. To lose 10% of the perceived video quality, you need to reduce the bandwidth to 250Kbps according to WMAF, or even 150k according to SSIM, and 100k according to NARVAL.<\/p>\n<p>Tests on the SFUs showed the same pattern. Image 2 gives the bitrate as a function of the number of participants for each SFU. One can see here that WebRTC\u2019s congestion control algorithms kick in early (at around 250 participants) to maintain bitrate. However, Image 3 shows that the latency increases more linearly. Despite decreasing bandwidth and increasing latency, the video quality metric shown in Image 4 only reports quality degradation much later around when the bandwidth goes below 200k. That shows again that bit rate and latency are not good proxies for Video Quality.<\/p>\n<figure id=\"attachment_3052\" aria-describedby=\"caption-attachment-3052\" style=\"width: 1353px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3052 size-full\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend.png\" alt=\"average bitrates final legend\" width=\"1353\" height=\"620\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend.png 1353w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-300x137.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-768x352.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-1024x469.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-600x275.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-560x257.png 560w\" sizes=\"auto, (max-width: 1353px) 100vw, 1353px\" \/><figcaption id=\"caption-attachment-3052\" class=\"wp-caption-text\">Image 2: JItsi fails at 240 participants. Kurento\/OpenVidu had issues early. Janus and mediasoup seem to fare better than Medooze. It seems to be related to better CPU optimizations, as the inflection points correlate with the saturation of respective CPUs (not shown in this post).<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_3049\" aria-describedby=\"caption-attachment-3049\" style=\"width: 1195px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3049 size-full\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend.png\" alt=\"rtt august final legend\" width=\"1195\" height=\"662\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend.png 1195w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-300x166.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-768x425.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-1024x567.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-600x332.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-560x310.png 560w\" sizes=\"auto, (max-width: 1195px) 100vw, 1195px\" \/><figcaption id=\"caption-attachment-3049\" class=\"wp-caption-text\">Image 3: JItsi fails at 240 participants and Kurento\/OpenVidu had issues around 50. Otherwise the SFUs exhibit comparable behavior.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_3055\" aria-describedby=\"caption-attachment-3055\" style=\"width: 1214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3055\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score.png\" alt=\"narval score\" width=\"1214\" height=\"699\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score.png 1214w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score-300x173.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score-768x442.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score-1024x590.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score-600x345.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/narval_score-560x322.png 560w\" sizes=\"auto, (max-width: 1214px) 100vw, 1214px\" \/><figcaption id=\"caption-attachment-3055\" class=\"wp-caption-text\">Image 4: The video Quality is only dropping toward the end of the experiment, showing that the congestion control mechanism is doing its job well, and manage to make the right compromise as to keep the perceived quality high while adjusting other parameters.<\/figcaption><\/figure>\n<h1>SFU improvements during testing<\/h1>\n<p>Beyond the results themselves presented above, what is interesting is to see the progress in the results triggered by this study. Just getting visibility has allowed the respective teams to address the most egregious problems.<\/p>\n<p>Then you can also observe that Janus was very quickly limited. They had identified this bottleneck in an external library, and a possible solution, but had never really assessed the true impact. One can clearly see the difference between the graphs in this section (first runs), and the graphs in the previous section (latest results), were Janus seems to perform the best.<\/p>\n<table>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3054 size-medium\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-300x160.png\" alt=\"all sfu bitrate jitsiavg legend\" width=\"300\" height=\"160\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-300x160.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-768x410.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-1024x547.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-600x320.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend-560x299.png 560w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_bitrate_jitsiavg_legend.png 1193w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3052 size-medium\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-300x137.png\" alt=\"average bitrates final legend\" width=\"300\" height=\"137\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-300x137.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-768x352.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-1024x469.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-600x275.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend-560x257.png 560w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/average_bitrates_final_legend.png 1353w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6><strong>Bitrate as a function of the load.<\/strong><br \/>\n<em>Before (left) and after (right) application of patches to Janus and Jitsi. We also added mediasoup results (in green). <\/em><em>Medooze and Kurento\/OpenVidu results are the same in both plots as no better results could be generated the second time around.<\/em><\/h6>\n<table>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3051 size-medium\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-300x156.png\" alt=\"all sfu rtt legend\" width=\"300\" height=\"156\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-300x156.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-768x400.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-1024x533.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-600x312.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend-560x292.png 560w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/all_sfu_rtt_legend.png 1187w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3049 size-medium\" src=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-300x166.png\" alt=\"rtt august final legend\" width=\"300\" height=\"166\" srcset=\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-300x166.png 300w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-768x425.png 768w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-1024x567.png 1024w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-600x332.png 600w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend-560x310.png 560w, https:\/\/webrtchacks.com\/wp-content\/uploads\/2018\/10\/rtt_august_final_legend.png 1195w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6><strong>RTT, or latency, as a function of the load (logarithmic scale).<\/strong><br \/>\n<em>Before (left) and after (right) application of patches to Janus and Jitsi. We also added mediasoup results (in green). Medooze and Kurento\/OpenVidu results come from the same dataset.<\/em><\/h6>\n<p>Finally, one reviewer of our original article pointed to the fact that Medooze by <u><a href=\"https:\/\/webrtchacks.com\/author\/sergio\/\" target=\"_blank\" rel=\"noopener\">Sergio Garcia Murillo\u2019s<\/a><\/u>, a CoSMo employee, ended up on top of our study, hinting to a possible bias caused by a conflict of interest. We went to great efforts to conduct all of our tests transparently without bias. I think it is refreshing to see that in the latest results several SFUs end up being on par or better than Medooze, removing the final worry some might have. It was good news for the Medooze team too &#8211; now they know what they have to work on (like improvements made in Medooze 0.46) and they have a tool to measure their progress.<\/p>\n<h1>Conclusion<\/h1>\n<p>We hope we have shown that unbiased comparative testing of SFUs is now relatively easy to achieve thanks to KITE and a few other tools recently developed by CoSMo in collaboration with the authors of the WebRTC ecosystem. We will continue working with the different open Source WebRTC SFUs vendors to help them improve their software. We are planning to make as much as possible of the code used to generate those results public, and in any case, to provide access for public researchers to the tool, in a non-profit way. Eventually we would like to host those results as a \u201clive\u201d web page, where new results would be made available as new versions of the software are made available.<\/p>\n<p>See the <u><a href=\"https:\/\/www.cosmosoftware.io\/publications\/andre2018_Comparative_Study_of_SFUs.pdf\" target=\"_blank\" rel=\"noopener\">full paper<\/a><\/u>\u00a0and <u><a href=\"https:\/\/www.cosmosoftware.io\/publications\/andre2018_slides_Comparative_Study_of_SFUs.pdf\" target=\"_blank\" rel=\"noopener\">summary slides<\/a><\/u>\u00a0presented this week at the <u><a href=\"http:\/\/www.rtc-conference.com\/2018\/\" target=\"_blank\" rel=\"noopener\">IIT Real-Time Communications Conference<\/a><\/u>.<\/p>\n<p>We will in the following months provide results on different use cases, starting with streaming. If you really want to know how <u><a href=\"http:\/\/www.fedoa.unina.it\/10403\/1\/miniero_lorenzo_27.pdf\" target=\"_blank\" rel=\"noopener\">Janus SOLEIL<\/a><\/u>, Medooze\u2019s <u><a href=\"https:\/\/millicast.com\" target=\"_blank\" rel=\"noopener\">Millicast<\/a><\/u>, Wowza, Ant Media and others perform (or crash), in a streaming environment, without marketing, without bias, stay tuned.<\/p>\n<p>{\u201cauthor\u201d: \u201c<u><a href=\"https:\/\/twitter.com\/agouaillard\" target=\"_blank\" rel=\"noopener\">Alex Gouaillard<\/a><\/u>\u201c}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you plan to have multiple participants in your WebRTC calls then you will probably end up using a Selective Forwarding Unit (SFU).\u00a0 Capacity planning for SFU\u2019s can be difficult \u2013 there are estimates to be made for where they should be placed, how much bandwidth they will consume, and what kind of servers you [&hellip;]<\/p>\n","protected":false},"author":227,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[152],"tags":[237,328,258,427,426,425,428,329],"class_list":{"0":"post-3057","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technology","7":"tag-janus","8":"tag-jitsi","9":"tag-kurento","10":"tag-load-test","11":"tag-mediasoup","12":"tag-medooze","13":"tag-quality","14":"tag-sfu","15":"entry","16":"has-post-thumbnail"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webrtchacks.com\/sfu-load-testing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks\" \/>\n<meta property=\"og:description\" content=\"If you plan to have multiple participants in your WebRTC calls then you will probably end up using a Selective Forwarding Unit (SFU).\u00a0 Capacity planning for SFU\u2019s can be difficult \u2013 there are estimates to be made for where they should be placed, how much bandwidth they will consume, and what kind of servers you [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webrtchacks.com\/sfu-load-testing\/\" \/>\n<meta property=\"og:site_name\" content=\"webrtcHacks\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-19T02:47:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-10-20T13:19:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\" \/>\n<meta name=\"author\" content=\"Alex Gouaillard\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webrtchacks\" \/>\n<meta name=\"twitter:site\" content=\"@webrtchacks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alex Gouaillard\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/\"},\"author\":{\"name\":\"Alex Gouaillard\",\"@id\":\"https:\/\/webrtchacks.com\/#\/schema\/person\/fed7485bc2b3b7af7f19903b8e645fa8\"},\"headline\":\"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard)\",\"datePublished\":\"2018-10-19T02:47:11+00:00\",\"dateModified\":\"2018-10-20T13:19:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/\"},\"wordCount\":3073,\"commentCount\":20,\"publisher\":{\"@id\":\"https:\/\/webrtchacks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\",\"keywords\":[\"janus\",\"jitsi\",\"kurento\",\"load test\",\"mediasoup\",\"medooze\",\"quality\",\"sfu\"],\"articleSection\":[\"Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webrtchacks.com\/sfu-load-testing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/\",\"url\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/\",\"name\":\"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks\",\"isPartOf\":{\"@id\":\"https:\/\/webrtchacks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\",\"datePublished\":\"2018-10-19T02:47:11+00:00\",\"dateModified\":\"2018-10-20T13:19:25+00:00\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webrtchacks.com\/sfu-load-testing\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage\",\"url\":\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\",\"contentUrl\":\"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webrtchacks.com\/#website\",\"url\":\"https:\/\/webrtchacks.com\/\",\"name\":\"webrtcHacks\",\"description\":\"guides and information for WebRTC developers\",\"publisher\":{\"@id\":\"https:\/\/webrtchacks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webrtchacks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webrtchacks.com\/#organization\",\"name\":\"webrtcHacks\",\"url\":\"https:\/\/webrtchacks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webrtchacks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2013\/08\/logo_newsletter.gif\",\"contentUrl\":\"https:\/\/webrtchacks.com\/wp-content\/uploads\/2013\/08\/logo_newsletter.gif\",\"width\":661,\"height\":100,\"caption\":\"webrtcHacks\"},\"image\":{\"@id\":\"https:\/\/webrtchacks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/webrtchacks\",\"https:\/\/www.linkedin.com\/company\/webrtchacks\/\",\"http:\/\/youtube.com\/webrtchacks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webrtchacks.com\/#\/schema\/person\/fed7485bc2b3b7af7f19903b8e645fa8\",\"name\":\"Alex Gouaillard\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webrtchacks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc1e507be09abcb805bfe4d2bc71d90c618305cf5a85de4b57a1fedd013a18de?s=96&r=r\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc1e507be09abcb805bfe4d2bc71d90c618305cf5a85de4b57a1fedd013a18de?s=96&r=r\",\"caption\":\"Alex Gouaillard\"},\"sameAs\":[\"http:\/\/webrtcbydralex.com\"],\"url\":\"https:\/\/webrtchacks.com\/author\/alex\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webrtchacks.com\/sfu-load-testing\/","og_locale":"en_US","og_type":"article","og_title":"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks","og_description":"If you plan to have multiple participants in your WebRTC calls then you will probably end up using a Selective Forwarding Unit (SFU).\u00a0 Capacity planning for SFU\u2019s can be difficult \u2013 there are estimates to be made for where they should be placed, how much bandwidth they will consume, and what kind of servers you [&hellip;]","og_url":"https:\/\/webrtchacks.com\/sfu-load-testing\/","og_site_name":"webrtcHacks","article_published_time":"2018-10-19T02:47:11+00:00","article_modified_time":"2018-10-20T13:19:25+00:00","og_image":[{"url":"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg","type":"","width":"","height":""}],"author":"Alex Gouaillard","twitter_card":"summary_large_image","twitter_creator":"@webrtchacks","twitter_site":"@webrtchacks","twitter_misc":{"Written by":"Alex Gouaillard","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/#article","isPartOf":{"@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/"},"author":{"name":"Alex Gouaillard","@id":"https:\/\/webrtchacks.com\/#\/schema\/person\/fed7485bc2b3b7af7f19903b8e645fa8"},"headline":"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard)","datePublished":"2018-10-19T02:47:11+00:00","dateModified":"2018-10-20T13:19:25+00:00","mainEntityOfPage":{"@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/"},"wordCount":3073,"commentCount":20,"publisher":{"@id":"https:\/\/webrtchacks.com\/#organization"},"image":{"@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage"},"thumbnailUrl":"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg","keywords":["janus","jitsi","kurento","load test","mediasoup","medooze","quality","sfu"],"articleSection":["Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webrtchacks.com\/sfu-load-testing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/","url":"https:\/\/webrtchacks.com\/sfu-load-testing\/","name":"Breaking Point: WebRTC SFU Load Testing (Alex Gouaillard) - webrtcHacks","isPartOf":{"@id":"https:\/\/webrtchacks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage"},"image":{"@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage"},"thumbnailUrl":"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg","datePublished":"2018-10-19T02:47:11+00:00","dateModified":"2018-10-20T13:19:25+00:00","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webrtchacks.com\/sfu-load-testing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webrtchacks.com\/sfu-load-testing\/#primaryimage","url":"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg","contentUrl":"https:\/\/farm1.staticflickr.com\/176\/396845694_65ce38cae8_o.jpg"},{"@type":"WebSite","@id":"https:\/\/webrtchacks.com\/#website","url":"https:\/\/webrtchacks.com\/","name":"webrtcHacks","description":"guides and information for WebRTC developers","publisher":{"@id":"https:\/\/webrtchacks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webrtchacks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webrtchacks.com\/#organization","name":"webrtcHacks","url":"https:\/\/webrtchacks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webrtchacks.com\/#\/schema\/logo\/image\/","url":"https:\/\/webrtchacks.com\/wp-content\/uploads\/2013\/08\/logo_newsletter.gif","contentUrl":"https:\/\/webrtchacks.com\/wp-content\/uploads\/2013\/08\/logo_newsletter.gif","width":661,"height":100,"caption":"webrtcHacks"},"image":{"@id":"https:\/\/webrtchacks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/webrtchacks","https:\/\/www.linkedin.com\/company\/webrtchacks\/","http:\/\/youtube.com\/webrtchacks"]},{"@type":"Person","@id":"https:\/\/webrtchacks.com\/#\/schema\/person\/fed7485bc2b3b7af7f19903b8e645fa8","name":"Alex Gouaillard","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webrtchacks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/bc1e507be09abcb805bfe4d2bc71d90c618305cf5a85de4b57a1fedd013a18de?s=96&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc1e507be09abcb805bfe4d2bc71d90c618305cf5a85de4b57a1fedd013a18de?s=96&r=r","caption":"Alex Gouaillard"},"sameAs":["http:\/\/webrtcbydralex.com"],"url":"https:\/\/webrtchacks.com\/author\/alex\/"}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Alex Gouaillard","author_link":"https:\/\/webrtchacks.com\/author\/alex\/"},"_links":{"self":[{"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/posts\/3057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/users\/227"}],"replies":[{"embeddable":true,"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/comments?post=3057"}],"version-history":[{"count":0,"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/posts\/3057\/revisions"}],"wp:attachment":[{"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/media?parent=3057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/categories?post=3057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webrtchacks.com\/wp-json\/wp\/v2\/tags?post=3057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}