Как установить Intel SSD NVME irq Affinity на Ubuntu 16.04 LTS?
Спасибо за чтение этого вопроса (я везде искал, чтобы найти существующий ответ без успеха...) Вопрос в заголовке, но здесь более подробно:
Вот моя установка:
- Я работаю с сервером S2600WT от Intel с двумя процессорами (Xeon v4 с 24 ядрами на процессор), работающими на Ubuntu 16.04 LTS.
- Ядра [00..23] принадлежат ЦПУ № 1
- Ядра [24..47] принадлежат процессору № 2
- У меня есть 2 твердотельных накопителя Intel: DC3700 подключен к PCIe ЦПУ № 1 (PCIe x4-gen3 каждый через NVME)
- У меня есть плата сбора данных (Innovative X6-1000M) на другом слоте PCIe CPU#1 (PCIe x8-gen2)
Мы пытаемся запустить программное обеспечение для сбора данных от нашей компании, которое собирает данные с платы для сбора данных и записывает их на твердотельные накопители.
- Когда у меня только один процессор, программа работает как положено, и мы можем записывать со скоростью до 2,4 ГБ / с.
- Когда у меня два процессора, у нас программный тупик, и программа зависает. Когда я использую отладчик, я вижу, что программа зависает при попытке записи в SSD.
Таким образом, я попытался бы иметь два ЦП, но запускать программное обеспечение только на ЦП № 1 и направлять все прерывания непосредственно на ЦП № 1.
Для этого я написал файл /proc/irq/defaut_smp_affinty
в 0000,00000004
, Это работает для платы сбора данных, я вижу, что все прерывания напрямую передаются в ядро № 2 (на ЦПУ № 1)
Тем не менее, я вижу, что прерывания моего NVMe по-прежнему распределяются по всем ядрам, а также по ядрам CPU#2 (ядра 24..47).
Я пытался сделать:
cat /proc/interrupts | grep -i nvme
чтобы увидеть номер прерывания, принадлежащего твердотельному накопителю NVMe, а затем вручную изменить файл (irq [157–186])
sudo -i echo 0000,00000004 > /proc/irq/186/smp_affinity
permission denied
Я пробовал также:
sudo sh -c "echo 0000,00000004 > /proc/irq/186/smp_affinity"
sh: echo I/O error
sudo sh -c "echo 1,3 > /proc/irq/186/smp_affinity_list"
sh: echo I/O error
Я не могу изменить эти файлы.
Я также пытался перезапустить сервис irqbalance
таким образом:
export IRQBALANCE_BANNED_CPUS=ffff,fffffff0
sudo service irqbalance stop
sudo irqbalance --debug
Я тоже пробовал numactl
запустить программу на CPU#1 CORE#2
Но пока ничего не получалось, я вижу, что некоторые прерывания NVMe все еще принимаются ЦПУ № 2. Есть ли у вас какие-либо идеи, как мне удалось бы передать прерывания NVM только на CPU # 1 и полностью исключить CPU # 2 из моего программного обеспечения?
Большое спасибо за ответ, я надеюсь, что я был достаточно откровенен, чтобы вы мне помогли:) в противном случае, просто попросите более подробную информацию.
EDIT_1: мне удалось заставить мое программное обеспечение работать, отключив все ядра CPU # 2 с помощью команды:
for i in {24..47} do; sudo sh -c "echo 0 > /sys/devices/cpu/cpu$i/online"
Проблема в том, что, делая это, я просто деактивирую все CORES ЦПУ № 2 и просто уменьшаю свою вычислительную мощность на два. Но это дает мне больше подсказок, что запуск программного обеспечения только на одном процессоре работает.