LINUX.ORG.RU

xanmod... рвет linux-rt в low-latency аудио задачах???

 , , , ,


3

5

Я в шоке…

Годами, буквально годами пытаюсь получить минимальную задержку при обработке аудио на ноутбуке с jack, а теперь и с pipewire.

Платформа - Sandy Bridge, встроенное аудио Realtek ALC272.

Всегда считал нормой для этого ноутбука буфер 48000 Гц / 256 семплов (5,3 мс задержка) (кто в теме то поймет что это). Тут на ЛОРе мне много раз писали что это совсем не круто. Да я и на слух слышу задержку при игре на гитаре. Это все на обычном ядре, дефолтном в дистрибутивах. При меньшем буфере стабильно не работает.

Периодически я решал озаботиться улучшением, первое что советуют везде - использовать linux_rt вместо обычного ядра. Это немного улучшало ситуацию, можно было получить вдвое меньшую задержку 48000/128 (2,7 мс). Но не очень стабильно. Это - тоже совсем не айс!

И вот, чисто случайно, без объявления войны, я ставлю NixOS и в нем ядро xanmod 5.14. Происходит какая-то мистика!

Я выставляю 48000 / 64 (это уже 1.3 миллисекунды задержки). Все гранитно стабильно!

Выставляю 48000 / 32 (тридцать два, Карл!) - работает! Иногда похрюкивает.

КАК???? Это вообще законно??

Вопрос у меня вот в чем - как именно в xanmod так выходит, какие опции, или модификации, могут повлиять на то что стало вот так?

ИТАК

Пожалуй подведу окончательные итоги.

  1. Практически все широко распространенные в сети рекомендации надо читать навыворот. Почему - отдельный вопрос.

  2. Лучше всего для обеспечения low-latency при работе с аудио подходит обычное, общего назначения ядро. Даже ванильное ядро с kernel.org может обеспечить экстремально низкую задержку на моем музейном железе.

  3. Ядро linux_rt подходит заметно хуже. Я не знаю почему. Видимо оно для совсем других задач, а то что оно работало со звуком лучше - дела давно минувших дней. Современные версии обычного ядра работают лучше.

  4. Рекомендации по настройке ядра, по CONFIG_HZ, PREEMPT - можно выполнять, можно нет. Низкая задержка достижима с любыми вариантами этих настроек.

  5. Желательно собирать ядро с минимальной конфигурацией. по-видимому я столкнулся с тем, что на конфигурации от Arch Linux на моем железе что-то лишнее мешало.

★★★★

Последнее исправление: James_Holden (всего исправлений: 3)
Ответ на: комментарий от James_Holden

Собери профиль на 10кгц частоте сэмплирования или выше под оба варианта и можно попробовать сравнить. Возможно придётся для чего-то символы поставить.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Вот еще что - есть утилита latencytop, но она выглядит как протухшая и пока завести ее я не смог.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Да, в первом приближении можно примерно так:

perf record -a -F 10000 -- <command> или perf record -aF 10000 -p <pid>

затем - perf report

чтобы два раза не ходить, можно попробовать ещё посмотреть будут ли влиять на результаты ощутимо 100к и 50к частоты, если не будут, то можно и на них глянуть в частности различается ли результат.

Если где-то в топе будут адреса без имён - это мало поможет, нужно символы для указанного бинарника поставить.

pon4ik ★★★★★
()

@James_Holden, я тут сейчас немножечко офонарел от произошедшего.

Суть: пришёл домой, дай думаю, проверю работу разных ядер с JACK и внешней видеокартой. Запускаю ПК, загружаюсь с Zen-ядром, а там…

https://ibb.co/TTKH57w

Это как вообще?! 64 сэмпла при 192кГц! Я же точно помню, что полгода назад ниже 512 сэмплов на том же ядре не опускалось, а тут на тебе, ни одного XRUN-а даже!

А я ещё хотел Xanmod протестировать, да кому оно надо с такими низкими задержками! Или влияет то, что ПК на Intel, а раньше было AMD?

Korchevatel ★★★★★
()
Ответ на: комментарий от Korchevatel

Дело точно не в xanmod. Можешь с ним не заморачиваться. Что-то произошло с линуксом, он начал просто все рвать по задержке. У тебя точно какая версия ядра и дистрибутив?

James_Holden ★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от Korchevatel

ПК на Intel, а раньше было AMD

продался собака. предал родину…

anonymous
()
Ответ на: комментарий от James_Holden

Arch, ядро – 5.15.10.

P.S. Таки словил 1 XRUN, пока писал – накаркал! :) Правда, я на 96000/32 переключился, дабы Guitarix помучить.

Korchevatel ★★★★★
()
Ответ на: комментарий от Korchevatel

Один это фигня. На такой задержке тем более. У меня сейчас то же самое на стационарнике core 2 duo. Такая задержка, иногда можно словить один xrun.

Подозреваю что вообще ковыряюсь зря, просто новые ядра стали работать адски.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от R_He_Po6oT

Заморожу ядро к чертям, пока не разберусь в чем дело. Я же на NixOS, а тут частичные обновления - норма, в отличие от арча )))

James_Holden ★★★★
() автор топика
Ответ на: комментарий от pon4ik

НИ ХРЕ НА

не понятно.

Вот снял с 50 кГц частотой

Это хорошее

6,86%  ArdourGUI        libzita-convolver.so.4.0.3          [.] Convlevel::process
   4,53%  swapper          [kernel.kallsyms]                   [k] intel_idle
   2,34%  RT-main-(nil)    lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   2,34%  RT-main-(nil)    kpp_deadgate.so                     [.] kpp_deadgate::compute
   1,63%  RT-2-(nil)       kpp_tubeamp.so                      [.] mydsp::compute
   1,50%  RT-2-(nil)       lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   1,50%  RT-1-(nil)       kpp_tubeamp.so                      [.] mydsp::compute
   1,48%  ArdourGUI        libfftw3f.so.3.6.9                  [.] hc2cfdftv_32
   1,48%  RT-1-(nil)       lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   1,26%  RT-main-(nil)    kpp_tubeamp.so                      [.] mydsp::compute
   1,14%  RT-2-(nil)       kpp_deadgate.so                     [.] kpp_deadgate::compute
   1,04%  RT-1-(nil)       kpp_deadgate.so                     [.] kpp_deadgate::compute
   0,96%  RT-2-(nil)       libzita-convolver.so.4.0.3          [.] Convlevel::process
   0,95%  ArdourGUI        libfftw3f.so.3.6.9                  [.] hc2cbdftv_32
   0,91%  RT-1-(nil)       libzita-convolver.so.4.0.3          [.] Convlevel::process
   0,85%  RT-2-(nil)       libstdc++.so.6.0.28                 [.] __dynamic_cast
   0,82%  RT-main-(nil)    libstdc++.so.6.0.28                 [.] __dynamic_cast
   0,80%  RT-1-(nil)       libstdc++.so.6.0.28                 [.] __dynamic_cast
   0,71%  RT-main-(nil)    libzita-convolver.so.4.0.3          [.] Convlevel::process

это плохое

6,22%  ArdourGUI        libzita-convolver.so.4.0.3          [.] Convlevel::process
   3,67%  swapper          [kernel.kallsyms]                   [k] mwait_idle_with_hints.constprop.0
   0,95%  ArdourGUI        libfftw3f.so.3.6.9                  [.] hc2cfdftv_32
   0,93%  RT-1-(nil)       lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   0,90%  RT-main-(nil)    lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   0,89%  RT-2-(nil)       lsp-plugins-lv2.so                  [.] avx::x64_biquad_process_x8
   0,85%  ArdourGUI        libfftw3f.so.3.6.9                  [.] hc2cbdftv_32
   0,70%  RT-2-(nil)       kpp_deadgate.so                     [.] kpp_deadgate::compute
   0,68%  RT-main-(nil)    kpp_deadgate.so                     [.] kpp_deadgate::compute
   0,67%  RT-1-(nil)       kpp_deadgate.so                     [.] kpp_deadgate::compute
   0,66%  RT-main-(nil)    kpp_tubeamp.so                      [.] mydsp::compute
   0,65%  RT-2-(nil)       kpp_tubeamp.so                      [.] mydsp::compute
   0,63%  RT-1-(nil)       kpp_tubeamp.so                      [.] mydsp::compute
   0,62%  swapper          [kernel.kallsyms]                   [k] menu_select

Видны как раз потроха Ardour и тех плагинов, которые работают в проекте. Разница - только intel_idle в хорошем, mwait_idle_with_hints.constprop.0 вместо него в плохом. Я ума не приложу как это может влиять (по моему никак).

Пробовал добавлять параметр ядра idle=nomwait там и там - ничего не поменялось в работе, вместо intel_idle стало acpi_idle. То есть по-видимому это не влияет.

Еще что сделал - запустил LFS систему на ядре от NixOS. Тот же эффект - резко начинает лучше работать. То есть дело точно в ядре.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Из того, что видно можно сказать ещё, что в «хорошем» варианте почему-то полезный код работает больше.

А когда это всё работает на приятных настройках - на CPU нагрузка высокая?

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

[k] menu_select

Вот чего ещё не углядел. Судить тут могу только по названию, но выглядит как что-то связанное с вводом выводом или переключением контекста. притом объём сопоставим с полезной нагрузкой, в «хорошем» варианте такого нет.

Может @Kron4ek чего знает про истинное назначение сей функции?

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Можно, но это ничего не даст, потому что проблема не в избыточной нагрузке.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от anonymous

100% согласен. Просто сбои обычно под нагрузкой видно. А узкое место точно только под нагрузкой ведущей к сбоям видно.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Пока вот что:

  1. Собрал 100% ванильное ядро, с минимальным конфигом под железо. (кстати в NixOS используется именно ванильное ядро). Работает прекрасно.

  2. CONFIG_HZ=100 поставил - задержка супер, так же как на дефолтном ядре с CONFIG_HZ=1000 и на xanmod с CONFIG_HZ=500. То есть на задержку это вообще не влияет.

  3. Режимы PREEMPT заметным образом не влияют, на всех трех одинаково.

  4. Тоже ванильное ядро, но с конфигом от Arch, без изменений вот как есть - работает намного хуже.

Это же какое-то разрушение мифов! Ни CONFIG_HZ=1000, ни full preempt не делают ни тепло, ни холодно.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Разрушители мифов это классика.

anonymous
()
Ответ на: комментарий от James_Holden

Тоже ванильное ядро, но с конфигом от Arch, без изменений вот как есть - работает намного хуже

Что само по себе - зажигательное открытие. Особенно для арчелюбов.

ist76 ★★★★★
()
Ответ на: комментарий от ist76

На самом деле это даже логично - конечно урезанное под мое железо ядро должно справляться с низкими задержками лучше, потому что там лишнего мало.

Я думаю тут даже не дело в том что Арч плохой. Вон у Корчевателя в Арче все лучше чем у меня. Просто в дистрибутивное ядро напихано всего, где-то да и начинает мешать. Наверное.

И видимо мне так повезло, что в NixOS то что именно мне мешает не включено.

Пока могу только сделать вывод, что надо делать как гентушники - настраивать сборку ядра под себя, только то что нужно. Очевидно одно - само по себе ванильное ядро может обеспечивать очень низкие задержки.

James_Holden ★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Очевидно одно - само по себе ванильное ядро может обеспечивать очень низкие задержки.

И это очень хороший и очень полезный вывод.
Выходит, если разобраться с железом - решить проблему скрытых задержек в аудиоинтерфейсе - вполне можно будеть играть в линукс-комп с задержками меньше 5мс. В идеале - 3))

ist76 ★★★★★
()
Ответ на: комментарий от James_Holden

Вот конфиг

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

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от ist76

Выходит, если разобраться с железом - решить проблему скрытых задержек в аудиоинтерфейсе - вполне можно будеть играть в линукс-комп с задержками меньше 5мс. В идеале - 3))

К сожалению не все так просто. По статистике которую я видел, даже профессиональные карты дают неустранимую задержку, помимо этих буферов, не меньше 4-5 мс. Так что 3 тут я думаю не достижимо никак. Но это еще фигня, главная проблема не в этом.

Все что я делаю - на моем железе по сути бесполезно… Потому что на любом даже небольшом проекте с такой низкой задержкой банально захлебывается проц. Надо иметь намного более мощный процессор для того чтобы работать с низкими задержками.

Вся эта феерия жарит только в холостую.

Да, реалтайм это не про нагрузку, а про точность - как выше писал анонимус. Но с уменьшением задержки растет нагрузка, и проект обвешанный плагинами будет требовать нормального железа, а не моего музейного.

В итоге, при реальной записи меня отбрасывает на те же 15 мс задержки (96000/512 буферы) которые достигаются гранитно стабильно на любом ядре. Только так гарантированно нет xrun’ов.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от ist76

Но на нормальном современном стационарнике, если подобрать нормальное железо - играть вполне можно, видимо да.

James_Holden ★★★★
() автор топика

Больше я не знаю что отсюда выжать, написал с основной пост окончательные выводы, отметил как решенную.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

не меньше 4-5 мс.

Я ведь правильно понимаю что это 1.5 виртуальных метра и в сравнении с реальным помещением вполне адекватная задержка?

Вопрос в том, что это адекватно когда это вся задержка, а не ЕЩЁ +5 к имеющимся 15.

Scondo
()
Последнее исправление: Scondo (всего исправлений: 1)
Ответ на: комментарий от Scondo

Я ведь правильно понимаю что это 1.5 виртуальных метра и в сравнении с реальным помещением вполне адекватная задержка?

Да.

Вопрос в том, что это адекватно когда это вся задержка, а не ЕЩЁ +5 к имеющимся 15.

Да!

Конечно. Вся фишка в том, что - меньше 10 мс не ощущается, 10 - 20 мс некоторый дискомфорт, больше 20 мс неприемлимо.

Теперь считаем задержку - это то что дает железо + расстояние до динамика.

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

Если железо крутое и дает 5 мс (как и цифровой комбик, столько же его процессор дает примерно), то у нас остается всего 1.5 метра запаса до динамика.

Если как у меня - 15 мс, то все, приплыли, уже в наушниках дискомфорт, а через динамик вылетаем за 20 мс.

Если чистый аналог - доли миллисекунды задержка железа, и запас расстояния до динамика 3 метра, чтобы уложиться в 10 мс.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от pon4ik

Нет, под арчем как раз у меня не круто. Что-то там не так, выяснять у меня здоровья не хватит что именно. Проще выпилить все ненужное из ядра.

К тому же, в арче ядро не ванильное. Фиг знает что они на него накатили.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от James_Holden

Эх, жалко, это вообще очень интересная тема безотносительно звука.

pon4ik ★★★★★
()

Платформа - Sandy Bridge, встроенное аудио Realtek ALC272.

у кого какие минимальные задержки на проф аудио оборудовании?
на проф аудио софте? в win \ os x?

smilessss ★★★★★
()
Ответ на: комментарий от Kron4ek

Там у тебя вроде от энергосбережения что-то лагало, попробуй ОТключить конкретно C1E, оставь всё остальное энергосбережение ВКлюченным.

anonymous
()
Ответ на: комментарий от ist76

я уже говорил, что всё упирается в железки и драйверы

у меня задержки низкие по моим ощущениям, могу ещё раз измерить, скажите как

kott ★★★★★
()
Ответ на: комментарий от kott

Самый правдивый способ - записать (например телефоном) короткий щелчок (скажем, перед микрофоном, включённым в тракт) и его «эхо» из колонок и измерить задержку между ними

ist76 ★★★★★
()
Ответ на: комментарий от James_Holden

Да кончайте вы эти теоретические цыфарки переворачивать. Поиграйте в живой куб и в комп. Я же сам пробовал: ставишь куб в дальний угол, садишься к компу поближе и тренькаешь через разветвитель в оба одновременно. Задержки от куба из дальнего угла не ощущается, а от компа перед мордой есть. Стереоэффект без никаких обработок.

R_He_Po6oT ★★★★★
()
Ответ на: комментарий от R_He_Po6oT

Проверил xanmod. Чуда не произошло

Какого именно? В отношении чего?

anonymous
()
Ответ на: комментарий от R_He_Po6oT

По моим цифрам как раз видно что так и будет, как ты описываешь.

James_Holden ★★★★
() автор топика
Ответ на: комментарий от ist76

выставил в qjackctl частоту 96000, буфер 32, периоды - default

мерилка показывает 1.510 мс

но, думаю, при таких параметрах посыпятся xrun-ы при игре, дам «результат» попозже

карта - PCI Echo Gina3G

kott ★★★★★
()
Ответ на: комментарий от kott

Что-то, значит, не то
Полной задержки 1.5мс нет нигде
Мне кажется, и какая-нибудь амт пангея, все же, медленнее
Хотя, я бы померял

ist76 ★★★★★
()
Ответ на: комментарий от ist76

Я же про это выше писал. В линуксе «мерилка» не мерилка, она показывает просто величину буфера, а не полную задержку (как в ASIO).

James_Holden ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.