- Хијерархија меморије и дизајн структура података у великој мери одређују искоришћеност кеш меморије процесора.
- Груписање врућих података, коришћење суседних контејнера и SoA образаца смањује промашаје кеша и побољшава латенцију.
- У оперативном систему Windows, ажурирање система и драјвера и ограничавање позадинских процеса ослобађа процесор, РАМ и кеш меморију.
- Допуњавање оптимизација софтвера подешавањима напајања и, ако је потребно, побољшањима хардвера максимизира укупне перформансе.
Оптимизација кеш меморије процесора једна је од оних тема које раздвајају код који „ради“ од кода који „лети“. Када разумемо како је меморија организована, која времена приступа сваки ниво обрађује и како се хардвер понаша, можемо постићи огромна побољшања перформанси без промене машина.
У међувремену, значајан број корисника Windows-а пати од једног просечнијег проблема: њихови рачунари су спори. И често корен проблема лежи управо тамо, у неефикасном коришћењу меморије, кеш меморије и самог процесора. Комбинацијом доброг ниског нивоа дизајна (структуре података, обрасци приступа меморији) и практичних подешавања у Windows-у (чишћење, ажурирања, режими напајања итд.), могу се постићи веома приметна побољшања, од малих повећања од 5% до скокова од 30-40% у одређеним сценаријима.
Хијерархија меморије и латенције: зашто кеш влада
Пре него што почнемо са подешавањем кода или конфигурисањем Windows-а, кључно је да разумемо једну ствар: није сва меморија једнака. Разлика између приступа L1, L2, L3 кеш меморији, RAM меморији или диску је огромна, а многе оптимизације кеша се заснивају, буквално, на избегавању приступа споријим нивоима колико год је то могуће.
У модерном процесору, типична времена приступа (реда величине) су отприлике следећа: приступ L1 кешу траје око пола наносекунде, промашај предвиђања грана траје неколико наносекунди, L2 је око 7 ns, док приступ главној меморији може бити дужи од 100 ns. Ако се удаљимо од рачунара (мрежа, SSD, механички чврсти диск), бројке вртоглаво расту на стотине хиљада или милионе наносекунди.
Ова огромна разлика је оно што чини правилно организовање података, смањење промашаја кеша и дизајнирање секвенцијалних образаца приступа толико важним. Петља која се налази у L1 кешу биће знатно бржа од оне која стално приступа RAM-у или SSD-у, чак и ако логички обављају исту функцију.
Штавише, кеш меморија процесора је организована у неколико нивоа: L1, који је веома мали и изузетно брз; L2, који је већи и нешто спорији; и L3, који је још већи и често се дели између језгара. Идеја је да се подаци којима се најчешће приступа („врући“ подаци) држе при руци, а остатак пребаци на спорије нивое. Као програмери, можемо помоћи да се ово деси природно уз добар дизајн структуре података и предвидљив приступ.
Шта је кеш меморија и зашто утиче на перформансе?
Кеш меморија, у било ком контексту (процесор, диск, веб итд.), је брзо складиште недавно коришћених података . Уместо да увек приступамо најспоријем извору, чувамо копију онога што ће највероватније бити поново коришћено. Ово скраћује време одзива и смањује оптерећење примарних ресурса.
Генерално, кеширање се користи за убрзавање приступа и побољшање корисничког искуства. У пракси, оно такође омогућава систему да обавља више посла са истим хардвером: мање чекања, мање блокова и мање редова чекања. Зато се користи у процесорима, дисковима, прегледачима, дистрибуираним системима и практично сваком софтверу који интензивно обрађује податке.
Типичан рачунар има неколико врста кеш меморије: кеш меморије диска (RAM меморија која чува податке са чврстог диска), веб кеш меморије (статични ресурси прегледача) и кеш меморије процесора (L1, L2, L3). Све оне раде на истом основном принципу: складиштење онога што ће вероватно бити потребно касније, избегавајући понављање спорих операција.
Врсте кеша: кеш меморије на диску, веб кеш меморије и кеш меморије процесора
Унутар система из стварног света, неколико механизама кеширања се конвергирају, сваки на свом нивоу. Њихово разумевање помаже и у бољем програмирању и у дијагностиковању разлога зашто рачунар ради лошије него што се очекивало.
Кеш диска
Кеш меморија диска је област меморије (обично RAM) где оперативни систем чува податке недавно прочитане са диска или записане на њега . Када апликација поново затражи те податке, систем прво проверава кеш меморију: ако су подаци тамо, приступ је много бржи него одлазак на диск, посебно код механичких чврстих дискова.
Овај механизам драстично смањује време учитавања, смањује број физичких операција читања и писања и, последично, продужава век трајања диска . У сценаријима са поновљеним приступом истим датотекама (базе података, сервери, апликације које захтевају много ресурса), кеширање диска прави значајну разлику.
Веб кеш
У вашем прегледачу, веб кеш привремено чува слике, стилске листове, Јаваскрипт и друге ресурсе. Ово омогућава вашем прегледачу да приступи сачуваним информацијама када поново посетите страницу или се крећете између одељака унутар исте веб странице, уместо да их поново захтева од мреже.
Резултат је двострук: краће време учитавања за корисника и мања потрошња пропусног опсега, како на вашој вези, тако и на серверу који приказује садржај. Међутим, ако се кеш меморијом не управља правилно, могу се појавити застарели ресурси, због чега је понекад препоручљиво да је обришете.
Кеш меморија процесора: нивои L1, L2 и L3
Крунски драгуљ када су у питању перформансе је кеш меморија процесора. Модерни процесори укључују неколико хијерархијских нивоа дизајнираних да минимизирају кашњење приступа подацима и инструкцијама. Генерално говорећи, L1 је најмањи и најбржи, L2 је средњи, а L3 је највећи и најспорији, често дељени.
L1 кеш меморија је обично подељена на секције за инструкције и податке, са типичним величинама од неколико десетина KB по језгру. Изузетно је брза и користи се за тренутну обраду. L2 кеш меморија има већи капацитет (стотине KB до неколико MB) и делује као резервна копија за L1. L3 кеш меморија може достићи неколико MB или десетина MB, дели је више језгара и служи као последњи ниво пре приступа RAM меморији.
Када је образац приступа меморији разумно секвенцијалан или предвидљив, хардвер може да га предвиди и доведе податке до одговарајућих нивоа кеша. Када је хаотичан, пун случајних скокова и расутих структура, процесор троши превише времена чекајући меморију и процесор постаје „досадан“. Ту долази до изражаја оптимизација на нивоу кода.
Оптимизујте структуре података за кеширање процесора
Велики део перформанси зависи од тога како дизајнирамо наше структуре података. Није исто имати џиновски објекат са топлим и хладним пољима помешаним заједно као што је исто одвојити оно што се често користи од онога што се ретко користи. Свака кеш линија доведена до процесора има своју цену; ако те линије попунимо бескорисним подацима, трошимо пропусни опсег.
Групишите вруће податке и одвојите хладне податке
Кључна стратегија је идентификовање којим пољима у структури се приступа у скоро свакој операцији („врући“ подаци) и која се користе само повремено („хладни“ подаци). Први треба да се чувају заједно у меморији и, ако је могуће, да стану у једну или неколико линија кеша. Други се могу чувати у посебној структури, на коју се позива показивач или индекс.
На пример, уместо да имате објекат корисника са дугим стринговима (име, биографија, имејл) помешан са заставицама или маркерима који се стално проверавају, боље је груписати „вруће“ податке (ИД, последња пријава, активни статус) у компактну структуру, а остатак информација оставити у посебној структури „детаљи“. На овај начин, када код итерира кроз листу корисника да би проверио статус или маркер, линије кеша су скоро у потпуности попуњене релевантним подацима.
Смањите попуњавање и боље искористите сваку линију
Још једно поље борбе лежи у физичком дизајну структура: редоследу поља и њиховим типовима. Због проблема са поравнањем, мешање типова различитих величина насумично може довести до попуњавања бајтова који само троше меморију и, још горе, кеш линије.
Ако преуредимо структуру података тако да прво групишемо велике типове (нпр. doubles или int64_t), затим средње типове и на крају најмање типове (bool, char), обично смањујемо или елиминишемо велики део попуњавања. Ово омогућава да више елемената стане по линији кеша, смањујући оптерећење хијерархије меморије и вероватноћу промашаја меморије.
Изаберите суседне контејнере
Контејнери који чувају елементе у непрекидној меморији , као што су вектори, генерално су много повољнији за кеширање него структуре засноване на ретким чворовима повезаним показивачима (стабла, класичне повезане листе итд.). Приликом обиласка вектора, хардвер може савршено предвидети следећи приступ и унапред учитати следеће линије кеша.
Насупрот томе, структуре попут мапа заснованих на стаблу или повезаних листа дистрибуирају своје чворове по хипу, приморавајући процесор да континуирано јури показиваче. Сваки скок може резултирати промашајем кеша и скупим повратком у главну меморију. Због тога многе модерне библиотеке нуде густе хеш мапе , отворене табеле и друге контејнере који покушавају да податке одрже што компактнијим.
Онлајн складиштење за мале колекције
Многи алгоритми укључују веома мале колекције (неколико целих бројева, неколико структура) које се стално креирају и уништавају. Ако свака од ових колекција покрене алокацију хипа, не само да сносимо трошкове управљања меморијом, већ завршавамо и са подацима расутим по РАМ меморији. Решење је коришћење контејнера са онлајн складиштењем за мале величине.
Ова врста контејнера резервише простор за 8 или 16 елемената директно унутар самог објекта. Све док се ово ограничење не прекорачи, нема потребе за приступом хипу, а подаци остају везани за остатак функције или стања класе, што је веома корисно за кеширање.
Шаблони приступа: од AoS до SoA и употреба битова
Чак и са добро структурираним кеш меморијама, образац приступа подацима у великој мери одређује перформансе. Није исто секвенцијално прелазити кроз низ и скакати са једне адресе на другу на основу листе показивача. Постоје неке понављајуће технике за максимизирање искоришћења кеша.
Низ структура (AoS) у односу на структуру низова (SoA)
Класичан образац је прелазак са дизајна „низ структура“ (AoS) на „структуру низа“ (SoA). У AoS-у, сваки елемент је објекат са много поља (на пример, положај и маса честице), а ови елементи се чувају секвенцијално. Када треба да прочитате само део ових поља (на пример, положај), приморани сте да учитате кеш линије које такође носе некоришћене податке.
С друге стране, у SoA, различити атрибути су раздвојени у паралелне низове: један за x, други за y, трећи за z, трећи за масу и тако даље. Дакле, ако алгоритам ажурира само позиције, он приступа само координатним низовима, а кеш меморија није контаминирана небитним информацијама . Штавише, овај дизајн фаворизује векторизацију и употребу SIMD инструкција.
Скупови битова и референце по индексу
За мале домене (нпр., заставице у распону од 0 до 255), коришћење скупа битова је много ефикасније од структуре скупа засноване на хешу. Скуп битова од 256 позиција заузима само неколико десетина бајтова и омогућава веома брзе, потпуно суседне и кеш-пријатељске операције, уместо да се колизије решавају у хеш табели.
Слично томе, замена показивача индексима у суседним низовима може смањити величину структура (32-битни индекси уместо 64-битних показивача) и побољшати кохерентност кеша. Уместо чворова распоређених по хипу, вектор чворова се чува и приступа му се према њиховој позицији, што олакшава секвенцијални пролаз.
Претходно учитавање: када треба претећи посао
Поред хардверског претходног учитавања, које покушава да предвиди секвенцијалне обрасце приступа, имамо инструкције за софтверско претходно учитавање како бисмо унапредили учитавање података у одређеним случајевима. Ово има смисла када је образац предвидљив, али не и строго линеаран, као што се дешава у хеш табелама или повезаним листама.
Општа идеја је једноставна: током обраде елемента i, налажете хардверу да унесе елемент i+1 (или неки будући блок) у кеш меморију. Када дођете до тог елемента, вероватноћа да је већ у L1 или L2 је велика, а време чекања је смањено. Ово се може имплементирати помоћу примитива за претходно учитавање компајлера или специфичних библиотека.
Међутим, нема смисла користити експлицитно претходно учитавање на потпуно секвенцијалним приступима, јер хардвер то већ аутоматски обрађује. У ствари, додавање непотребног претходног учитавања може затрпати кеш меморију и погоршати перформансе. Као што је скоро увек случај са перформансама, најбоље је мерити пре и после.
Политике кеширане локације, замене и претходног учитавања
На теоретскијем нивоу, системи кеш меморије се заснивају на политикама о томе где се чувају подаци, када се преузимају и које податке избацује када нема довољно простора. Иако овим детаљима управља хардвер или оперативни систем, њихово разумевање помаже у тумачењу одређених необичних понашања.
Што се тиче локације, могу се користити шеме сегментације меморије или асоцијативне алокације скупова, где се свака адреса главне меморије може мапирати само на подскуп кеша. Ово утиче на број сукоба и вероватноћу преклапања две адресе унутар кеша.
Што се тиче пражњења кеша (шта се дешава када дође до промашаја кеша), долазе до изражаја политике замене: LRU (Least Recently Used - најмање коришћени), FIFO или чак насумична замена. LRU покушава да задржи најскорије коришћене податке у кешу, претпостављајући да ће поново бити потребни, док FIFO једноставно одбацује најстарије податке. Свака политика има своје предности у зависности од стварног обрасца приступа.
У одељку за претходно учитавање, постоје механизми засновани на историјским обрасцима: ако хардвер детектује да се сваки приступ помера, на пример, увек 64 бајта, тежиће да претходно учита суседне блокове . У другим случајевима, претходно учитавање простора (преузимање целог блока чак и ако је захтеван само део) се користи да би се минимизирао број посета главној меморији.
Мерење и профилисање понашања кеша
Оптимизација без мерења је као рад на слепо. Постоје алати за анализу учинка који вам омогућавају да видите одређене метрике кеша: референце, промашаје L1, промашаје кеша последњег нивоа (LLC), проценат промашаја итд. Ове метрике показују да ли ваше промене заиста побољшавају ситуацију.
Ако је, на пример, стопа промашаја L1 кеша око 2–3%, то се генерално сматра разумном, док веома високе стопе промашаја у кешу последњег нивоа могу указивати на проблеме просторне или временске локалности . Комбиновање ових бројки са профилима процесора и меморије помаже у идентификацији који делови кода највише оптерећују хијерархију меморије.
Оптимизација кеша и перформанси у оперативном систему Windows
Поред самог кода, многи корисници се питају зашто њихов Windows рачунар ради тако споро ако, „у теорији“, има добар процесор и RAM меморију. Део одговора лежи у чињеници да оперативни систем, резидентне апликације и акумулирано дигитално смеће стално троше процесор, меморију и кеш меморију , остављајући мање ресурса за важне задатке. Применом неколико специфичних оптимизација у Windows 10 и Windows 11, могуће је ослободити ресурсе процесора и RAM меморије ( на пример, конфигурисањем виртуелне меморије ), смањити позадинске процесе и побољшати способност система да кешира релевантне податке. У зависности од почетне ситуације, ова побољшања могу се кретати од мањих подешавања до значајних промена у укупним перформансама.
Ажурирајте Windows и драјвере
Веома основни корак који многи људи занемарују јесте ажурирање оперативног система и драјвера. Ажурирања за Windows не доносе само безбедносне закрпе: она често укључују побољшања у управљању ресурсима , исправке цурења меморије и оптимизацију језгра.
Из панела са подешавањима система Windows (Старт > Подешавања > Ажурирање и безбедност > Windows Update), можете да тражите и општа ажурирања и опционе пакете, укључујући некритичне драјвере који могу да оптимизују перформансе вашег процесора, графичке картице или чипсета. Инсталирање ових компоненти може да реши уска грла или проблеме са стабилношћу који директно утичу на начин коришћења кеш меморије и меморије.
Онемогућите P2P дистрибуцију ажурирања
Од Windows-а 10, систем може да преузима и дели ажурирања користећи P2P механизам са другим рачунарима. Иако је генијалан, овај систем значи да рачунар користи процесор, мрежу и простор на диску да би помогао у дистрибуцији ажурирања, што није увек пожељно.
Онемогућавање „Оптимизације испоруке“ у Windows Update-у спречава ваш рачунар да послужује или преузима фрагменте ажурирања на друге рачунаре. Ово ослобађа ресурсе, смањује активност у позадини и може побољшати укупне перформансе, посебно на мање моћним системима.
Ослободите простор на диску и уклоните нежељене датотеке
Када је ваш чврсти диск пун или скоро пун, Windows има мање простора за странично поделу и креирање привремених датотека, што на крају утиче на перформансе. Коришћење уграђеног алата за чишћење диска вам омогућава да обришете привремене датотеке, ажурирате остатке, ставке у корпи за отпатке и друге непотребне податке.
Поред овог алата за чишћење, препоручљиво је редовно празнити корпу за отпатке и користити опције складиштења система Windows за брисање акумулираних привремених датотека. Што је мање простора на системском диску, то ће меморијски подсистем ефикасније радити и ефикасније ће функционисати кеш меморија диска.
Оптимизујте програме који се покрећу и оне који се покрећу у позадини
Један од највећих непријатеља процесора и кеш меморије на рачунару који се користи свакодневно су програми који се аутоматски покрећу и раде у позадини: синхронизатори, ажурирачи, мали услужни програми које једва користимо итд. Иако могу деловати лагано, сваки од њих додаје нити, меморију, приступе диску и потрошњу кеш меморије.
Из Менаџера задатака или коришћењем Sysinternals-а за праћење процеса , на картици Покретање можете онемогућити аутоматско учитавање непотребних апликација . Такође можете контролисати које апликације могу да раде у позадини у подешавањима приватности. Смањење ове листе не само да побољшава време покретања већ и смањује континуирано оптерећење процесора и РАМ меморије.
Смањите графичке ефекте и обавештења
Анимације прозора, транспарентности и други визуелни украси троше ресурсе. На старијим или мање моћним рачунарима може бити корисно подесити подешавања система Windows тако да се перформансе дају предност изгледу. То се ради путем напредних опција система, у одељку за перформансе, избором конфигурације која фаворизује брзину.
Слично томе, превише обавештења може преоптеретити и корисника и уређај . Онемогућавање непотребних упозорења не само да поједностављује корисничко искуство, већ и спречава пречесто покретање позадинских процеса и провера.
Режими напајања, хибернација и вршне перформансе
Windows укључује неколико планова напајања који директно утичу на начин управљања процесором: да ли се приоритет даје трајању батерије или чистим перформансама. На десктоп и лаптоп рачунарима који су укључени у струју, обично је добра идеја прегледати ова подешавања.
Брзо покретање комбинује функције искључивања и хибернације како би убрзало време покретања система унапред учитавањем дела језгра и драјвера пре искључивања. Омогућавање ове опције може значајно смањити време покретања, мада је препоручљиво да је привремено онемогућите ако изазива проблеме са ажурирањима или приступом BIOS-у.
С друге стране, постоји скривени режим „максималних перформанси“ који приморава процесор и остале компоненте да раде са мање пажње на енергетску ефикасност. Његово активирање може пружити мало више простора за захтевне задатке, али по цену повећаног загревања, буке вентилатора и потрошње енергије.
Ефикасно управљање простором и меморијом у систему
Поред редовног чишћења и контроле резидентних програма, постоје и други начини за боље коришћење физичких ресурса рачунара, а самим тим и кеш меморије процесора и диска.
Претрпаност радне површине иконама, пречицама, фасциклама и датотекама није само визуелни неред: Windows мора да управља свим тим, што додаје додатно оптерећење. Одржавање радне површине разумно чистом и организовање датотека у фасцикле унутар дискова је једноставна пракса која доприноси лакшем окружењу.
Такође помаже ослањање на решења за складиштење у облаку за одређене датотеке, што смањује количину коришћене локалне меморије. Под условом да се то уради разумно (без потпуног ослањања на интернет везу), локални систем може бити мање оптерећен и имати већу флексибилност.
Специфичне технологије: ReadyBoost, оверклоковање и хардвер
На рачунарима са механичким чврстим диском и ограниченом РАМ меморијом, Windows укључује технологије попут ReadyBoost-а, која вам омогућава да користите брзи USB диск као неку врсту додатне кеш меморије. Иако није чаробни штапић, у одређеним конфигурацијама може побољшати перформансе тако што ће смањити оптерећење чврстог диска.
На другом крају спектра, напредни корисници могу оверклоковати своје процесоре користећи алате попут Intel Extreme Tuning Utility (за откључане процесоре). Повећање брзине такта побољшава перформансе, али такође повећава температуру и потрошњу енергије, са реалним ризиком од нестабилности и оштећења ако се напон и хлађење не контролишу пажљиво.
Када све оптимизације софтвера не успеју, време је да размислите о надоградњи хардвера: замени чврстог диска SSD-ом, повећању RAM меморије или чак промени процесора или целог система. SSD, посебно, трансформише перципиране перформансе система, јер драстично смањује време приступа диску, што заузврат омогућава да кеш меморија диска и виртуелна меморија раде много глатко.
Генерално, комбиновање доброг дизајна структуре података и образаца приступа меморији ради искоришћавања кеш меморије процесора са пажљивом конфигурацијом Windows-а (ажурираном, лаганом, без непотребних процеса, са одговарајућим планом напајања и, ако је потребно, са малим помагалима као што су ReadyBoost или побољшања хардвера) омогућава вам да извучете много више из исте машине, постижући апликације које реагују агилно и систем који се осећа приметно бржим без потребе за „магијом“ или езотеричним триковима.