{"id":1131,"date":"2026-09-22T15:00:00","date_gmt":"2026-09-22T13:00:00","guid":{"rendered":"https:\/\/www.pvs-forge.com\/?p=1131"},"modified":"2026-09-22T08:39:58","modified_gmt":"2026-09-22T06:39:58","slug":"system-startup-login-streaming-what-the-pvs-load-balancing-actually-determines","status":"publish","type":"post","link":"https:\/\/www.pvs-forge.com\/en\/systemstart-anmeldung-streaming-was-der-pvs-lastausgleich-tatsaechlich-entscheidet\/","title":{"rendered":"System startup, login, streaming: What the PVS load balancing actually determines"},"content":{"rendered":"<h3 class=\"wp-block-heading\">System startup, login, streaming: What the PVS load balancing actually determines<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Three Phases, Three Sets of Rules<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">UDP 6910 is the source of three common misconceptions: regarding port ranges, regarding capacity, and regarding what the PVS load balancing actually balances. The process consists of three phases, each with different rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201eBoat\u201c<\/strong> determines who the target queries.<\/li>\n\n\n\n<li><strong>Registration<\/strong> It is done through a single handshake that determines everything.<\/li>\n\n\n\n<li><strong>Streaming<\/strong> remains unchanged until the next reconnection.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 1: Boat<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is derived from its <strong>Bootstrap<\/strong>, whom it needs to contact, and not from the PVS server. The bootstrap contains up to four entries, each of which has its own IP address and a <strong>own port<\/strong> (Bootserver1_Ip, Bootserver1_Port, \u2026).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PXE\/TFTP<\/strong>: The target device retrieves the boot image every time the system starts up, so that changes take effect as early as the next startup.<\/li>\n\n\n\n<li><strong>BDM<\/strong>: The configuration is stored on the boot medium. Changes made on the server are not transferred to the target device, so the medium must be recreated.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 2: Login<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Registration takes place in a <strong>a single data exchange<\/strong>: a 28-byte request and a 28-byte response.<\/li>\n\n\n\n<li>The answer already contains the <strong>Streaming server, the port, and the vDisk<\/strong>.<\/li>\n\n\n\n<li>The selected server is not receiving any packets on the login port. <strong>No handoff occurs<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Load distribution is <strong>Set once during registration<\/strong>. Since PVS streaming uses UDP, the destination does not \u201eswitch\u201c ports. It simply forwards all incoming and outgoing traffic to the port specified in the response. A single \u201eStreamProcess.exe\u201c instance monitors all ports in the range, with each port assigned to its own thread pool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6910 is not the login port. The first port in the range is<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">6910 is simply the <strong>Default initial value of the range<\/strong> (Network \u2192 First Port \/ Last Port). With regard to this first port:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>1. Port:<\/strong> Registration, in reception mode, no devices connected<\/li>\n\n\n\n<li><strong>2. Port<\/strong>: in reception mode, no devices connected<\/li>\n\n\n\n<li><strong>3. Port<\/strong>: not in receive mode<\/li>\n\n\n\n<li><strong>4. Port and higher<\/strong>: Streaming<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For devices 6910\u20136930, the numbering starts at 6913, leaving 18 ports with 8 threads each\u2014that is <strong>144 slots where the PVS server can place the devices<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">144 seats, but no one can guarantee who will sit where<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Citrix estimates this configuration at 250 devices on 2 CPUs, or 1.74 devices per seat. This is a deliberate over-provisioning: 8 threads on 2 CPUs correspond to a ratio of 1:4, which Citrix states is supported. Since the devices are idle most of the time, the seats were never intended for users.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But 144 slots on 18 ports means 8 devices per port, and that math doesn't add up. <strong>This is an average value, not a classification.<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The devices are not distributed evenly across the ports. The port is selected during login without taking into account how heavily the ports are currently loaded, and no adjustment is made afterward, since the assignment remains in effect until the next reconnection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Here is a specific example<\/strong>: A PVS server with 207 devices, which, at 1.44 devices per slot, is well within the reference value:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The port with the highest utilization: <strong>18 devices<\/strong>, 2.25 per thread<\/li>\n\n\n\n<li>Minimum number of ports: <strong>7 devices<\/strong>, 0.88 per thread<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure data-spectra-id=\"spectra-mu6zrefy-62rv8p\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"782\" height=\"599\" src=\"https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/Slot-usage.jpg\" alt=\"slot usage\" class=\"wp-image-1132\" title=\"System startup, login, streaming: What the PVS load balancing actually determines\" srcset=\"https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/Slot-usage.jpg 782w, https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/Slot-usage-300x230.jpg 300w, https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/Slot-usage-768x588.jpg 768w, https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/Slot-usage-16x12.jpg 16w\" sizes=\"auto, (max-width: 782px) 100vw, 782px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The busiest port <strong>is greater than<\/strong> the Citrix benchmark, while the server as a whole is below it. The average value indicates that the server is functioning properly. The port responsible for handling requests tells a different story, and it could be that this particular port is more likely to result in retries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The size of this range depends on the specific business. The key factor is, <strong>that they exist at all<\/strong> and that no capacity specification can make this clear to you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 3: Streaming<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">All I\/O passes through a single port on a server and is handled exclusively by that port's thread pool (8 by default). If the pool is at full capacity, requests are placed in a queue. Adjacent ports do not provide a solution, and retry requests are forwarded to the same port.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201ePorts \u00d7 Threads\u201c is a limit on concurrency per port, not a limit on connections.<\/li>\n\n\n\n<li><strong>A connected device never changes the server or the port<\/strong>. A new server remains empty, and an overloaded server is not relieved.<\/li>\n\n\n\n<li><strong>Each time a new connection is established, a new server and port are assigned.<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The exception: Rebalance<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Before   DEV-1 -&gt; PVS-A: 6923 DEV-2 -&gt; PVS-A: 6922\nInvoke-PvsRebalanceDevices -ServerName PVS-A\nAfter    DEV-1 -&gt; PVS-A : 6921 DEV-2 -&gt; PVS-B : 6920<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">DEV-2 was moved to a different server without a reboot. DEV-1 remained on the same server but was assigned a new port. The number of subsequent retry attempts was negligible. Since this example involved devices in idle mode, it is not possible to determine how load balancing would behave under load.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Three settings, one default setting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once you know this variation exists, you can take steps to address it. Ports, threads per port, and CPUs can all be found in the server properties, and all three affect the same metric:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>By adding more ports<\/strong> The devices are distributed across multiple queues.<\/li>\n\n\n\n<li><strong>A higher number of threads<\/strong> For each port, it shortens the queue that is currently becoming overloaded.<\/li>\n\n\n\n<li><strong>More CPUs<\/strong> offer both.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The 1:4 ratio underlying the 8 threads on 2 CPUs is a standard value, not an upper limit. A server with far more cores can handle significantly more threads per port while still remaining well within this ratio. <strong>However, most people do not do this, since the value was set once and there was never a reason to reconsider it.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tools Used<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PVS RAM Health Check<\/strong><\/li>\n\n\n\n<li><strong>PVS Forge Health Advisor<\/strong><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Systemstart, Anmeldung, Streaming: Was der PVS-Lastausgleich tats\u00e4chlich entscheidet Drei Phasen, drei Regelwerke UDP 6910 ist die Ursache f\u00fcr drei weit verbreitete Missverst\u00e4ndnisse: bez\u00fcglich Portbereiche, bez\u00fcglich der Kapazit\u00e4t und bez\u00fcglich der Frage, was der PVS-Lastausgleich tats\u00e4chlich ausgleicht. Der Prozess umfasst drei Phasen mit unterschiedlichen Regeln: Phase 1: Boot Das Ziel erf\u00e4hrt aus seinem Bootstrap, wen es [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":1102,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[10],"tags":[],"class_list":["post-1131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-posts"],"uagb_featured_image_src":{"full":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-scaled.jpg",2560,1418,false],"thumbnail":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-150x150.jpg",150,150,true],"medium":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-300x166.jpg",300,166,true],"medium_large":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-768x425.jpg",768,425,true],"large":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-1024x567.jpg",1024,567,true],"1536x1536":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-1536x851.jpg",1536,851,true],"2048x2048":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-2048x1134.jpg",2048,1134,true],"trp-custom-language-flag":["https:\/\/www.pvs-forge.com\/wp-content\/uploads\/2026\/09\/pvs-boot-login_de-18x10.jpg",18,10,true]},"uagb_author_info":{"display_name":"Thomas K\u00f6tzing","author_link":"https:\/\/www.pvs-forge.com\/en\/author\/wp-admin\/"},"uagb_comment_info":0,"uagb_excerpt":"Systemstart, Anmeldung, Streaming: Was der PVS-Lastausgleich tats\u00e4chlich entscheidet Drei Phasen, drei Regelwerke UDP 6910 ist die Ursache f\u00fcr drei weit verbreitete Missverst\u00e4ndnisse: bez\u00fcglich Portbereiche, bez\u00fcglich der Kapazit\u00e4t und bez\u00fcglich der Frage, was der PVS-Lastausgleich tats\u00e4chlich ausgleicht. Der Prozess umfasst drei Phasen mit unterschiedlichen Regeln: Phase 1: Boot Das Ziel erf\u00e4hrt aus seinem Bootstrap, wen es&hellip;","_links":{"self":[{"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/posts\/1131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/comments?post=1131"}],"version-history":[{"count":2,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/posts\/1131\/revisions"}],"predecessor-version":[{"id":1134,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/posts\/1131\/revisions\/1134"}],"wp:attachment":[{"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/media?parent=1131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/categories?post=1131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pvs-forge.com\/en\/wp-json\/wp\/v2\/tags?post=1131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}