2016-12-12 7 views
1

У меня есть Intel Xeon E5-2620, который имеет 24 на 2 процессора. Я написал приложение, которое создает 24 потока для дешифрования AES с помощью openssl. Когда я увеличиваю число потоков от 1 до 24 на 1 миллион дешифрования данных, я получаю такой результат, как следующее изображение. enter image description hereСнижение производительности за счет увеличения числа потоков Больше, чем 4 из 24 Core CPU

Проблема заключается в том, когда я увеличить число потоков все из ядра, которое я определил становится 100%, а из-за 32GB оперативной памяти системы всегда по крайней мере, половина из барана свободен, которые показывают, что эта проблема не является основной использование или плунжер. Мне интересно узнать, должен ли я устанавливать специальный параметр для повышения производительности на уровне ОС или это ограничение процесса, которое не может достичь более 4 потоков в максимальной производительности. Я должен упомянуть, что когда я запускаю «openssl evp ...» для тестирования расшифровки шифрования aes из-за вилки процесса, это увеличивает производительность примерно в 20 раз больше, чем одно базовое. Кто-нибудь есть идеи?

+1

Одна проблема заключается в том, что половина «сердечников» не * реальные * ядра, но и своего рода виртуального ядра, эмулировать с некоторыми трюками Конвейеризация. Вот почему у вас (небольшой) удар, когда вы поднимаетесь выше 12 потоков. –

+0

Является ли 'openssl evp' одним потоком? – malat

+1

Есть много возможных объяснений, но мы можем только догадываться *, если вы не показываете нам ориентир cosde * ... (Подсказка). –

ответ

1

Я, наконец, нашел причину. несколько процессоров имеют разные барабаны на серверах, которые имеют разные расстояния. когда я создал потоки до тех пор, пока на одном процессоре не будет создано 4 потока, но пятый поток будет помещен во второй процессор, что уменьшит производительность из-за того, что не используется NUMA в os. поэтому, когда я отключил ядра второго процессора, производительность 6 потоков увеличилась, как ожидалось. можно отключить 7-ядро с помощью следующей команды:

cd /sys/devices/system/cpu/ 
echo 0 > cpu6/online 
+0

Здесь [Процессор Intel® Xeon® E5-2620] (http://ark.intel.com/products/64594/Intel-Xeon-Processor-E5-2620-15M-Cache-2_00-GHz-7_20-GTs-Intel -QPI), он показывает «Максимальное количество каналов памяти = 4». Кроме того, из увеличения графика времени после 4-х ядро. Связаны ли эти вещи? Я думаю, что ядра могут иметь выделенные каналы памяти, и когда потоки создаются, они распределяются равномерно, так что каждый получает свой собственный канал памяти через ядро. Поэтому из 5-го потока начинается конфликт памяти. Можете ли вы показать ядро ​​/ cpu-id отдельных потоков, когда создано только 4 потока? – sameerkn

0

Если многопроцессорность дает 20-кратное ускорение, а эквивалентное многопоточность дает только 2,5x, в многопоточном коде есть узкое место. Кроме того, это узкое место не связано с архитектурой оборудования.

Это может быть что-то в вашем коде или в базовой библиотеке. Это невозможно сказать, не изучая их в деталях.

Я бы начал с рассмотрения спора о блокировке в вашем многопоточном приложении.