První paměti 3D XPoint pro masy. Intel uvádí moduly Optane Memory pro hybridní úložiště

28. 3. 2017

Sdílet

Ilustrační obrázek Autor: loriklaszlo – Depositphotos
Ilustrační obrázek

Před týdnem Intel vypustil do světa první Optane SSD, tedy nemechanické (elektronické) úložiště založené poprvé ne na staré technologie NAND Flash, ale na nových pamětech 3D XPoint. Jde ale o serverové úložiště, které si kvůli ceně asi málokdo bude moci pořídit „na hraní“ do PC. Pro zájemce o technologické novoty ale teď přichází určitá náplast. Intel totiž odhalil také poměrně levný produkt založený na paměti 3D XPoint, který už pro běžné smrtelníky je.  

Návrat Intel Rapid Storage Technology

Tímto výrobkem jsou moduly M.2 s označením Optane Memory. Jde částečně o SSD v standardním provedení a běžící nad běžným protokolem NVMe, nicméně bohužel ne úplně taková, jaká byste hledali. Tyto moduly mají totiž jen nízkou kapacitu – na výběr je mezi 16 a 32 GB – a Intel s nimi prozatím počítá jen s jako pomocnými cachovacími SSD, které mají urychlovat přístup na pevný disk, nebo i na nějaké pomalejší SSD. Celkově tedy spřažením těchto dvou komponent získáte něco jako SSHD. Není to poprvé, co Intel s touto koncepcí přišel, tzv. „Rapid Storage Technology“ už prosazoval před několika lety, tehdy ještě s Flashovými SSD v provedení mSATA.

Omezení na jen malé kapacity je zřejmě dáno vysokou výrobní cenou čipů, kvůli které Intel zatím nechce uvádět výkonnější verze, které by jich potřebovaly víc. 3D XPoint je vyráběna po 128Gb (16GB) čipech na 20nm procesu, takže v Optane Memory SSD se nachází jen dva (32GB varianta) nebo dokonce pouhý jeden tento čip (16GB). A to v samostatných pouzdrech na rozdíl od NAND, kde může být v jednom „švábu“ na PCB integrováno několik čipů NAND. Čipy komunikují se speciálním řadičem, který implementuje rozhraní PCI Express 3.0 ×2 s protokolem NVMe, jímž je cachovací úložiště připojeno do systému. Vše je osazeno na 80mm jednostranném modulu M.2.

Optane Memory je ve skutečnosti návrat technologie Intel Rapid Storage, nyní však s pomocí pamětí 3D XPoint Optane Memory je ve skutečnosti návrat technologie Intel Rapid Storage, nyní však s pomocí pamětí 3D XPoint

3D XPoint: skvělé parametry i bez paralelismu

Pokud jde o parametry samotných modulů (v kombinaci s mechanickým diskem ale samozřejmě celkový výkon bude nižší), pak je třeba říct, že na disky složené z jednoho nebo dvou čipů je výkon excelentní a pro tuto technologii velmi slibný. Přenosová rychlost sekvenčního čtení je dle specifikací až 1200 MB/s, zápis poněkud horších 280 MB/s. Ovšem výkon v náhodném přístupu dobíhá výkonná SSD: při hloubce fronty čtyři položky se 4KB bloky má být výkon zápisu 70 000 IOPS a výkon čtení 300 000 IOPS. Přitom má modul mít velmi nízkou typickou latenci, při zápisu 16 µs, při čtení 6 µs. Pokud by tedy na tomto základu Intel postavil větší univerzální SSD, bylo by asi velmi slušné.

A hodně dobrá je také výdrž. Přes nízkou kapacitu je garantován přepis až 100 GB za den. To u menšího 16GB modulu znamená více než šest kompletních přepisů denně. Potenciál nové technologie tedy i zde vypadá dost dobře. Obzvlášť pokud je schopná vydržet takovou zátěž zřejmě bez agresivního využívání rezervní kapacity a vyvažování zátěže jako v konvenčním SSD tvořeném více čipy.

Jistou nevýhodou modulů Optane Memory bude bohužel spotřeba. Při aktivitě mají mít příkon 3,5 W, hlavním problémem je ale klidová spotřeba. Ta je prý 0,9–1,2 W. Tím pádem nebude toto řešení vhodné do notebooků, kde by mělo proti SSD s dobrou podporou úsporných režimů negativní dopad na výdrž na akumulátor. O to více, pokud by modul cachoval pevný disk, který má také svou nezanedbatelnou klidovou spotřebu. Tím pádem budou tyto cachovací moduly asi výhodné jen pro desktopová PC.

intel-optane-memory-2Dlužno ale říci, že vývoj šel jiným směrem, než Rapid Storage Technology, a tak si nejsem jistý, jak velké místo na trhu dnes pro speciální cachovací úložiště vůbec je. Při současných cenách SSD se zdá jako mnohem lepší nápad si pořídit nějaké rozumně velké SSD a rovnou na něj nainstalovat operační systém, než za podobnou cenu pořizovat pouhé cachovací řešení, které není tak univerzální. Cena 16GB a 32GB modulů Intel Optane Memory je 44 a 77 dolarů (1300 a 2300 Kč s DPH), za což by se základní SSD pro operační systém mělo dát sehnat.

Cachování přes Rapid Storage Technology jen s Kaby Lake

Kromě toho je zde i řada omezení. Cachování s těmito moduly vyžaduje kompatibilní procesor a čipset, což znamená CPU generace Kaby Lake s čipovou sadu Z270, H270 nebo B250. Se staršími čipsety a procesory Skylake není použití těchto modulů v roli cachovacího SSD podporováno. Zatím je také možné akcelerovat jen disk s operačním systémem, z něhož počítač startuje.

Cyber25

Podporované a nepodporované konfigurace dle Intelu Podporované a nepodporované konfigurace dle Intelu (zdroj: AnandTech)

Možná vás napadá, zda je možné zcela rezignovat na technologii Rapid Storage a použít tyto moduly jako standardní SSD (s 32GB kapacitou by asi dokázali žít například někteří uživatelé Linuxu, případně by se asi dal použít RAID 0). Intel to bohužel nikde neuvádí. Disky mají mít standardní rozhraní a používat protokol NVMe, takže je možné, že cachovací algoritmus bude čistě věcí BIOSu desky a ovladačů, a modul by se dal používat i samostatně. Pak by zřejmě byl použitelný i v jiných deskách, než těch oficiálně podporovaných, třeba i na platformě AMD.

Toto se ale asi dozvíme, až když se tyto moduly objeví v obchodech, což se má stát 24. dubna. V tuto dobu se mají moduly Intel Optane Memory začít prodávat samostatně, ale také jako součást hotových počítačů. Pokud by Intel neumožňoval zmermomocnit je do role standardního úložiště, pak asi nezbude než čekat, až se s pamětí 3D XPoint objeví nějaká regulérní SSD pod značkou pro spotřebitelský trh. Ty už by nesly značku „Optane SSD“, zatímco „Optane Memory“ je označení vyhrazené pro malé moduly fungující jako cache.

Autor článku

Redaktor portálu Cnews.cz. Zaměřuje se na procesory, mobilní SoC, grafické karty, disky a další počítačový hardware. Profil autora →

'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.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:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { 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(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream 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 = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ 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(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ 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(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »