CAT - Контрол на размера на кеша на процесора
Архитектите на x86 процесори исторически се противопоставят на предоставянето на директен контрол на кеша на програмистите. Един ми каза през 2009 г. - "никога няма да направим това, кешът винаги трябва да е прозрачен за програмиста." Някои RISC процесори предоставят архитектурна възможност за контрол на данните/кода, които завършват в кеша. И накрая, нещо подобно се появи в x86 архитектурата (започвайки с Broadwell*). Преди две години написах публикация за това как кешовете L1 и L2 не са изцяло ексклузивни за всяко ядро и че политиката за заместване на линията на псевдо-LRU кеш L3 кеша е директен път към инверсия на приоритета. Читателите попитаха дали има някаква хардуерна функция, която би позволила преодоляване на инверсията на приоритета, предотвратяване на процесите с нисък приоритет да изхвърлят данни от кеш паметта на първо и второ ниво на други хора и предотвратяване на по-голямата част от кеша от трето ниво от отвличане.
Вече има такава функция и се нарича CAT - Cache Allocation Technology. Тогава нямах право да описвам тази функция на Habré, тъй като все още не беше официално пусната. Беше описано в Ръководство за разработчици на софтуер за архитектури Intel® 64 и IA-32, том 3, глава 17, част 15, беше показано на IDF'15 в Сан Франциско и имаше дълга дискусия в lkml за това кой интерфейс към CAT ще влезе в ядрото на Linux. Най-вероятно интерфейсът ще бъде реализиран чрез cgroups. По този начин планировчикът на задачи ще гарантира, че потребителските задачи с определен приоритет получават определена част от кеша.
По подразбиране всички битови маски са зададени на 1 (т.е. 0xfffff в моя пример) на всеки процесор, а IA32_PQR_ASSOC за всеки ярд е 0, така че функциятанеактивен.
Както можете да видите, ако използвате CAT без поддръжка на операционната система, ще трябва ръчно да наблюдавате съответствието между IA32_PQR_ASSOC за всяко ядро и кои процеси / нишки се изпълняват на него.
Възможен е и интересен „хак“: можете по някакъв начин да „заключите“ данни (и / или код) в кеша, ако първо активирате няколко начина, поставите данни там и след това изключите тази част от кеша от всички активни битови маски. Тогава тези данни ще останат в кеша (можете да ги промените, разбира се) и никой няма да може да ги изхвърли насила.
Има интересен клас атаки на страничен канал на LLC. Тъй като тези атаки използват измерението, по който се намират данните, тогава чрез споделяне на кеша между виртуални машини без пресичане с помощта на CAT, ние сме напълно защитени от тези класове атаки.
Кешът, както знаете, е направен асоциативен с причина. Използвайки CAT, ние намаляваме асоциативността. Ако дадеш на някое ядро 1/10 от кеша, излиза, че има собствен L3 кеш от 4 мегабайта, 2-way. 4 мегабайта не е лошо, но 2-way е много малко. Очевидно ще има много пропуски в кеша поради липса на асоциативност. Този ефект може да бъде измерен. Преди няколко години написах публикация, в която описах подробно как да разделя L3 кеша на части, които не се припокриват, като използвам оцветяване на кеша. Тази техника има редица недостатъци, така че за тази цел не се използва в обикновени операционни системи и хипервайзори (има няколко специализирани хипервайзора, където се използва, но не мога да ги назова в статията.) И така, малък микробенчмарк. Едно ядро управлява STREAM, второто измерва времето за достъп до редовете на кеша. Използвайки CAT и оцветяване на кеша, разделяме кеша между тях на неприпокриващи се региони с различни размери, а във втория тест променяме пропорционално размера на региона с данни.

За да проверите дали CAT е наличен за определен модел процесор, има отделен флаг cpuid. Той е деактивиран на някои модели, дори ако CAT се поддържа в това семейство. Но предполагам, че може да има хакер, който да разбере как да го активира на всеки процесор след Haswell.
Това е всичко, накратко, което трябва да знаете, за да използвате CAT. В допълнение, CAT е част от нова фамилия технологии за качество на услугата на платформата, които могат да бъдат описани в отделна публикация, ако се интересувате. В допълнение към CAT, те включват CMT (Cache Monitoring Technology), която ви позволява да измервате ефективността на споделянето на споделен кеш, MBM (Memory Bandwidth Monitoring), който прави същото с паметта, и CDP (Code and Data Prioritization).