Chyby při chlazení datových center se prodraží. Zbytečné náklady se mohou vyšplhat až do milionů

3. 9. 2019

Sdílet

Autor: Schneider Electric
Při instalacích chladících systémů a stojanů v datových centrech často vznikají na první pohled banální chyby, které ovšem mají výrazný negativní dopad na fungování výpočetní techniky. Ovlivňují životnost komponent i jejich dostupnost a způsobují rovněž růst nákladů spojených s provozem datového centra. Všem těmto neduhům se dá přitom jednoduše čelit.

Řada chyb u datových center a serveroven vzniká už při návrhu a konfiguraci. Nedodržení několika základních pravidel jim brání dosáhnout plné kapacity chlazení a také omezuje dostatečnou distribuci studeného vzduchu. Následkem toho roste účet za energii a také se zmenšuje životnost techniky.

„Celková spotřeba elektrické energie může kvůli tomu stoupnout až o 8 %, což během desetileté životnosti datového centra s příkonem 500 kW znamená vyplýtvanou elektrickou energii v ceně přesahující zhruba 16 milionů korun,“ říká Pavel Blahut, specialista na problematiku datových center ze společnosti Schneider Electric.

I když je stojan často vnímán pouze jako mechanická opora, plní důležitou funkci, protože funguje jako zábrana recirkulace horkého vzduchu vyfukovaného z IT zařízení. Tento vzduch je lehce stlačen dolů, takže se v kombinaci se sáním u vstupního otvoru vrací zpět ke vstupu. Pokud nejsou ve stojanech instalované zaslepovací panely, dochází k neustálému ohřívání vstupního vzduchu pro chlazení.

„Zaslepovací panely tvoří přirozenou bariéru a významně prodlužují cestu horkého vzduchu, který se tak jenom obtížně dostane zpět do zařízení. Vynechávání zaslepovacích panelů je běžným jevem. Setkáváme se s tím u mnoha datových center, a to i přesto, že výrobci IT techniky důrazně doporučují panely používat. Špatná recirkulace, kterou tyto problémy způsobí, může vést ke zvýšení teploty zařízení až o 8 stupňů Celsia,“ upozorňuje Blahut.

Obecně lze říci, že správná cirkulace vzduchu je jedním z nejdůležitějších předpokladů k tomu, aby chlazení fungovalo co nejefektivněji. Pokud dochází k recirkulaci horkého vzduchu, tak se mimo jiné snižuje odolnost vůči dalším chybám. Výkon, který je potřebný ke chlazení datového centra, není cirkulací sice ovlivněn, ale je významně snížena účinnost chladicího systému. To má za následek zvýšené náklady spojené s elektřinou.

„Recirkulace se projevuje obvykle tzv. hot spoty v serverových skříních. Operátoři na to reagují nejčastěji tím, že sníží teplotu vzduchu, který dodávají chladící jednotky. Dalším způsobem je zvýšení kapacity jednotek, někdy zvolí obě varianty zároveň. To je ovšem špatně. Nejlepší řešením je skříně upravit tak, aby k recirkulaci nedocházelo,“ vysvětluje Blahut.

zabbix_tip

Ideálním řešením, jak omezit recirkulaci vzduchu, je rozestavění serverových skříní na horké a studené uličky. Umístění jednotlivých skříní je klíčové pro zajištění dostatku vzduchu o správné teplotě.

„I přes zjevné výhody systému s horkými a studenými uličkami výzkumy ukazují, že přibližně 25% datových center a serveroven umisťuje stojany do řad, které směřují stejným směrem. Ani správné rozestavění skříní ale nemusí spasit nevhodně vyřešené datové centrum. Zmíněné chyby patří pouze k několika nejčastějším problémům, našlo by se jich mnohem více. Nejjednodušším způsobem, jak docílit ideálního chlazení, je nechat to na profesionálech,“ uzavírá za Schneider Electric Pavel Blahut.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }