Задержка чтения / записи MMIO

Я обнаружил, что задержка чтения / записи моего MMIO неоправданно высока. Я надеюсь, что кто-нибудь может дать мне несколько предложений.

В пространстве ядра я написал простую программу для чтения 4-байтового значения в адресе BAR0 устройства PCIe. Это сетевая карта PCIe Intel 10G, подключенная к шине PCIe x16 на моем сервере Xeon E5. Я использую rdtsc для измерения времени между началом чтения MMIO и концом, фрагмент кода выглядит так:

vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device  
rdtscl(init); 
ret = readl(vaddr); 
rmb(); 
rdtscl(end);

Я ожидаю, что время, прошедшее между (end, init), будет меньше 1 мкс, в конце концов, данные, проходящие по каналу данных PCIe, должны занимать всего несколько наносекунд. Однако результаты моих тестов показывают, что по крайней мере 5.5use выполняет чтение устройства MMIO PCIe. Мне интересно, разумно ли это. Я меняю свой код на удаленный барьер памяти (rmb), но все равно получаю задержку около 5 мкс.

В этом документе упоминается об измерении задержки PCIe. Обычно меньше 1 мкс. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Нужно ли мне выполнять какие-либо особые настройки, такие как ядро ​​или устройство, для уменьшения задержки доступа MMIO? или Кто-нибудь уже делал это раньше?


person William Tu    schedule 21.07.2013    source источник


Ответы (2)


5usec отлично! Сделайте это статистически в цикле, и вы можете найти гораздо большие значения.

На это есть несколько причин. BAR обычно не кэшируются и не имеют предварительной загрузки - проверьте свой с помощью pci_resource_flags (). Если BAR помечен как кэшируемый, то это означает согласованность кеширования - одной проблемой может быть процесс обеспечения того, чтобы все ЦП имели одно и то же кэшированное значение.

Во-вторых, чтение io - это всегда неопубликованное занятие. ЦП должен остановиться, пока он не получит разрешение на связь по какой-либо шине данных, и еще немного задержаться, пока данные не поступят на указанную шину. Эта шина сделана так, чтобы выглядеть как память, но на самом деле это не так, и остановка может быть непрерываемым ожиданием занятости, но тем не менее непродуктивным. Поэтому я ожидаю, что задержка в наихудшем случае будет намного выше, чем 5 мксек, даже до того, как вы начнете рассматривать приоритетное выполнение задач.

person toomanychushki    schedule 06.04.2016

Если сетевой карте необходимо пройти по сети, возможно, через коммутаторы, чтобы получить данные с удаленного хоста, разумным временем чтения будет 5,5 мкс. Если вы читаете регистр локального устройства PCIe, он должен быть меньше 1 мкс. У меня нет опыта работы с Intel 10G NIC, но я работал с Infiniband и пользовательскими картами.

person Mark Sherred    schedule 05.09.2013
comment
Я измеряю менее 1 мкс, чтобы прочитать слово в полосе пропускания устройства на локальной шине PCIe. Не уверен, почему мой комментарий был отклонен, поскольку я просто подтверждаю, что результаты в статье реалистичны. BAR был отображен в пространстве пользователя, мы только что прочитали адрес. Вы тоже считаете время ioremap_nocache ()? В рамках моей работы я считываю регистры в BAR в системах по всей комнате, и это занимает менее 5,5 мкс. Я использую RDMA поверх Mellanox FDR Infiniband с переключателем IB между системами. - person Mark Sherred; 13.01.2018