Я провожу несколько экспериментов с исследовательской базой данных на EC2, используя экземпляр c1.xlarge. Насколько я могу судить, c1.xlarge использует 8 гиперпоточных виртуальных процессоров. Amazon также сообщает, что этот экземпляр использует физический процессор из «семейства Intel Xeon».
Опять же, в системе 8 процессоров, 4 рабочих и 4 других (диспетчер блокировок, коммуникатор, 2 секвенсора). Следовательно, у нас есть соответствие 1: 1 потоку с ЦП. Проводится эксперимент по созданию контрольных точек. Мы создаем 9-й поток для контрольной точки и оцениваем его влияние на пропускную способность. Результаты предсказуемы, когда этот 9-й поток назначается одному из процессоров, содержащих одного из 4 рабочих или диспетчера блокировок - пропускная способность падает. Однако, когда мы помещаем этот 9-й поток на один из оставшихся процессоров, мы не ожидаем увидеть никакого эффекта, поскольку эти потоки не являются узкими местами системы и не должны влиять на рабочие потоки. Однако я вижу падение пропускной способности и ищу объяснение.
Я начал подозревать, что может быть проблема, если поток контрольной точки, порожденный нерабочим потоком, каким-то образом делает недействительным кеш рабочих потоков. У меня нет четкого представления о том, как кэширование работает на этом конкретном экземпляре EC2 или на процессоре Intel Xeon, поэтому я ищу объяснение того, как работает это кеширование, в частности, как оно работает в гиперпоточной системе. Имеют ли оба процессора на гиперпоточном процессоре общий кеш? Распространяют ли потоки общий кэш между процессорами?
Мне удалось найти руководство Intel, в котором говорится, что процессоры Intel Xeon серий 3000 и 5000 используют «интеллектуальную кеш-память второго уровня, которая обеспечивает обмен данными между двумя ядрами для уменьшения трафика памяти». Это то, что может использовать экземпляр, и если да, означает ли это общий кеш всех 8 виртуальных ЦП?
Поскольку между вашей серверной ОС и оборудованием с EC2 существует уровень виртуализации, нет даже гарантии, что все 8 потоков из ваших виртуальных ЦП выполняются на одном физическом ЦП. Попытки измерить такие вещи, как попадания в кеш или паттерны изнутри гостя, бесполезны. Вы не имеете представления о реальном оборудовании.
Виртуальный ЦП не представляет собой физическое ядро ЦП, а 8 виртуальных ЦП не представляют собой один физический ЦП с 8 логическими ядрами. Конечно, планировщик ЦП для большинства гипервизоров будет пытаться запланировать выполнение потоков от одного и того же гостя на одном ядре в многопроцессорной системе, но нет никаких гарантий.