Вопрос: Высокая скорость прерывания системы


Мой сервер имеет 24 ядра процессора, память 96G, установлен CentOS 7.2 x86_64.

После запуска моей программы с большой набор данных, моя программа будет использовать около 50 Гб памяти, а система Linux будет показывать высокую скорость системных прерываний, но скорость переключения контекста будет низкой. dstat будет отображаться где-то между 500k int / s и 1000k int / s. Использование процессора будет близким к 100%, около 40% нас, 60% sy.

Если набор данных невелик, программа будет использовать около 5 Гб памяти, и все будет в порядке, загрузка процессора 100%, около 99% нас, 1% sy. Ожидается.

Программа написана сама по себе, это многопоточная программа. Он не делает ни одного сетевого ввода-вывода, очень маленького дискового ввода-вывода, в основном операций с памятью и арифметики. Модель потока и алгоритм одинаковы независимо от размера набора данных.

Мой вопрос в том, как я могу узнать, какие именно прерывания используются больше всего по моей программе (и избавиться от них, чтобы повысить производительность, если это возможно)?


5
2017-12-06 12:03


Источник


Было бы неплохо иметь немного больше контекста (например, язык / интерпретатор / время выполнения, которое вы используете), но похоже, что у вас может быть много ошибок страницы. Вы можете проверить это, запустив sudo pidstat -r -p $PID 1, последний параметр - интервал в секундах. - Tim Lamballais
Арифметика: Каковы ваши типичные операции? На старом i486 я бы догадался, что сопроцессор вызывает эти прерывания. - Nils
cat / proc / meminfo и найдите размер pagetable, если ваша программа использует много памяти, вы можете попытаться использовать большую страницу для уменьшения числа ошибок страницы, sar -B 1 100 может помочь вам увидеть, что у вас много страниц ошибки, посмотрите на colunm pgscank / s man sar - c4f4t0r


Ответы:


Я предполагаю, что у вас нет единой системы сокетов с процессором 24C. Таким образом, это, вероятно, система NUMA с 2x12C. В этом случае я предлагаю убедиться, что программа использует только один numa-узел (обычно сокет), и это локальная половина ОЗУ.

Когда вы используете 50G, это означает, что число numa не может быть гарантировано, так как это больше половины объема памяти.

Для проверки фактического состояния используйте numastat. Если вы находитесь в RHEL, вы можете использовать numad для автоматического определения местоположения памяти. Или вы можете использовать numactl -hardware, чтобы дать вам обзор о ваших узлах HW NUMA. С примерами довольно неплохо:

http://fibrevillage.com/sysadmin/534-numactl-installation-and-examples

Таким образом, вы можете заблокировать свою программу на желаемых CPU.

И я бы предложил проверить, есть ли у вас демон irqbalance, иначе у вас может быть одно ядро, перегруженное прерываниями.


1
2017-09-05 12:48





В Linux: watch cat /proc/interrupts покажет вам количество прерываний на прерывание и процессор. Думаю, в вашем случае вы увидите LOC (местный таймер) и RES (перепланирование).


0
2018-06-08 13:40