Назад | Перейти на главную страницу

Высокая частота прерываний системы

На моем сервере 24 ядра процессора, 96 ГБ памяти, установлена ​​CentOS 7.2 x86_64.

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

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

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

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

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

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

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

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

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

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

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