Как ОС Linux планирует потоки при наличии нескольких сокетов
Например, в системе с двумя сокетами с 2 четырехъядерными процессорами планировщик потоков пытается сохранить потоки от тех же процессов в одном процессоре? Потому что чередование потоков разных процессов в разных процессорах может снизить производительность в случае, когда потоки в процессе имеют много общего доступа к памяти.
1 ответ
Это зависит.
На современных платформах Intel по умолчанию BIOS выглядит так, что память чередуется между сокетами в системе, страница за страницей. Выделите 1 Мбайт, и половина будет на одном сокете, половина на другом. Это означает, что везде, где находятся ваши потоки, они имеют равный доступ к данным.
Это делает его очень простым для операционных систем - где угодно.
Это может работать против вас. Аппаратная среда SMP, представленная ОС, синтезируется процессорами, взаимодействующими через QPI. Если все потоки обращаются к одним и тем же данным, тогда эти ссылки могут быть очень заняты. Если они слишком заняты, это ограничивает производительность, и вы ограничены вводом / выводом. Вот где я; Ядра Z80 с дизайном подсистемы памяти Intel будут такими же быстрыми, как и ядра нахелем, которые у меня есть (ну, может быть, я преувеличиваю...).
В конце концов, настоящая проблема в том, что память просто не достаточно быстра. Intel и AMD недавно сделали несколько впечатляющих вещей с памятью, но мы все еще сдерживаемся ее медлительностью. В идеале память должна быть достаточно быстрой, чтобы у всех ядер было время доступа к ней. Процессор Cell вроде как делал это - у каждого SPE есть немного SRAM вместо кеша, и как только вы обдумываете их, вы можете заставить их действительно петь.
=== РЕДАКТИРОВАТЬ ===
Это еще не все. Как намекает Василий Старынкевич, альтернативный подход заключается в том, чтобы принять NUMA.
NUMA - это то, что на самом деле воплощают современные процессоры, поскольку доступ к памяти неравномерен, поскольку память в других сокетах процессора не доступна напрямую через шину. Вместо этого процессоры выполняют запрос данных по каналу QPI (или Hypertransport в случае AMD), чтобы попросить другой процессор извлечь данные из своей памяти и отправить их обратно. Поскольку процессор делает все это для вас аппаратно, он в конечном итоге выглядит как обычная среда SMP. И QPI / Hypertransport очень быстрые, поэтому в большинстве случаев достаточно быстро.
Если вы пишете свой код так, чтобы отразить архитектуру аппаратного обеспечения, вы теоретически можете внести улучшения. Так что это может включать (например) наличие двух копий ваших данных в системе, по одной на каждом сокете. В Linux есть подпрограммы сродства к памяти, которые специально распределяют память таким образом, а не чередуют все сокеты. Есть также подпрограммы привязки к ЦП, которые позволяют вам контролировать, на каком ядре ЦП работает поток, идея состоит в том, что вы запускаете его на ядре, которое близко к буферу данных, который он будет обрабатывать.
Хорошо, так что это может означать большие инвестиции в исходный код, чтобы заставить это работать на вас (особенно, если это дублирование данных не вписывается в поток программы), но если QPI стал проблемным узким местом, это единственный что ты можешь сделать
Я в некоторой степени возился с этим. В каком-то смысле это правильный ответ. Все мышление Intel и AMD (и, следовательно, операционных систем и библиотек) состоит в том, чтобы предоставить вам среду SMP, которая в большинстве случаев довольно хороша. Тем не менее, они позволяют вам играть с NUMA, имея множество библиотечных функций, которые вы должны вызывать, чтобы получить необходимое вам размещение потоков и памяти.
Однако для крайних случаев, когда вам нужна эта небольшая дополнительная скорость, было бы проще, если бы архитектура и ОС были строго NUMA, без SMP вообще. Точно так же, как процессор Cell на самом деле. Проще, не потому что писать было бы просто (на самом деле это было бы сложнее), но если вы вообще его запустили, вы бы точно знали, что это было настолько быстро, насколько это когда-либо могло достичь аппаратное обеспечение. С фальшивым SMP, который у нас есть сейчас, вы экспериментируете с NUMA, но в большинстве случаев вы задаетесь вопросом, насколько он быстр, как это возможно. Это не то, что библиотеки говорят вам, что вы обращаетесь к памяти, которая фактически находится в другом сокете, они просто позволяют вам делать это без намека на то, что есть место для улучшений.