Позвольте мне подробно описать наше требование. Мы выполняем какое-то задание, которое требует захвата IP-данных через сетевую карту и последующей обработки полученных данных в режиме реального времени. Обработка захваченных данных может быть выполнена частично или полностью в зависимости от доступности процессора. Но все, что можно сделать, будет сделано в режиме реального времени.
Наша архитектура выглядит примерно так. Мы используем один поток для захвата данных IP с карты NIC. И число потоков создается для обработки захваченных данных в режиме реального времени, и это число может доходить до чего угодно (скажем, 500), которые являются внутренними потоками ЦП.
Вот наши наблюдения: Обратите внимание, что у нас есть один поток для сбора данных IP. Когда мы создаем меньше потоков обработки (скажем, 10) и загружаем центральный процессор на уровне около 95%, абсолютно не возникает проблем в потоках захвата данных IP. Но когда мы создаем огромное количество потоков обработки (скажем, 250) и загружаем ЦП на уровне около 80%, поток захвата не может правильно захватывать данные IP. В последующем, доступность процессора выше, но проблема возникает.
Таким образом, мы решили, что проблема может быть связана с количеством потоков и их планированием (также переключением контекста). Мы подумали о следующем типе распределения ЦП среди потоков. Используя сходство, мы установим 25% ядер для захвата потока и 75% ядер для других потоков обработки.
Для начала мы написали простую программу на четырехъядерном компьютере i7 с HT ON. Предположим, что логическими ядрами являются A1 A2 B1 B2 C1 C2 D1 D2 (реальные ядра - ABCD). Наш пример потока таков, что он потребляет все ресурсы на одном ядре HT. Так что, если я запустил 8 таких потоков на всех 8 логических ядрах, загрузка ЦП показывает 100%. Теперь мы попытались присвоить близость. Если мы создадим 2 ядра и установим сродство к A1 и B1 (это не один поток к A1, а другой поток к B1, это объединенное сродство для двух потоков), то это работает нормально, и загрузка ЦП показывает 25%. Но если мы установим объединенное сходство для A1 и A2 для двух потоков, то будет использовано только 12,5% (диспетчер задач показывает, что используется только одно ядро). Но если мы установим сродство 4 потоков к A1, A2, B1, B2, то загрузка ЦП покажет 50%. Так что вопрос в том, почему второй случай (12,5%) не работает?