Знайдіть час від часу ярмарок ядра процесора


11

У мене ядро ​​PREEMPT 2.6.35 працює на процесорі ARMv7 з помірною швидкістю. Приблизно кожні 100 - 125s щось спричиняє, що ядро ​​не може досить швидко обробити деякі пов'язані зі звуком драйвери, щоб уникнути недоліків. Затримка, як правило, знаходиться в межах 15-30 мс, але може бути набагато довше. Незрозуміло, чи є затримка повністю в ядрі чи може стосуватися планування користувацького процесу, що працює з пріоритетом у режимі реального часу (SCHED_RR, 2).

Я здогадуюсь, що є (принаймні один) драйвер, який не грає добре з викупом.

Деякий вихід напруги з користувальницького процесу ілюструє певний аспект як нормальної, так і ненормальної поведінки, хоча я не впевнений, як інтерпретувати різні часові звіти?

Звичайний випадок:

     0,000518 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3415) = 1 
     0,010202 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0,000585 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3404) = 1 
     0,000302 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3404) = 1 
     0,010706 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3393) = 1 
     0,000480 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3392) = 1 

Блокування в опитуванні для виведення на fd6 не відбувається, і, коли для введення запитується лише fd10, виникає блок близько 10 мс. Це відображається як у звіті про тривалість системного виклику, так і інтервал між системними дзвінками (вони відповідають).

Випадок відмови (крайній приклад):

     Опитування 0,000305 ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3543) = 1 
     0,010730 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3533) = 1 
     Опитування 0,000475 ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT}], 2, 3532) = 1 
     0,000329 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL, revents = POLLIN}], 1, 3532) = 1 
     0,953349 опитування ([{fd = 10, події = POLLIN | POLLERR | POLLNVAL}, {fd = 6, події = POLLOUT | POLLERR | POLLNVAL, revents = POLLOUT | POLLERR}], 2, 2578) = 1 

Зауважте в цьому випадку, що, хоча другий останній дзвінок записується як 10 мс (звичайно), він становить 953 мс до останнього дзвінка.

Які інструменти я можу використовувати, щоб знайти винуватця?


2
Бонусні бали за цікаве питання. Я не знаю, як на це відповісти, але у мене виникає питання, як відстежити його до використання процесора (на відміну, наприклад, від шипів в iowait)?
Братчлі

1
Перша здогадка - якщо ви використовуєте JFFS2 або YAFFS на великій NAND-спалаху, особливо якщо ви записуєте. Вимкніть все, що пише, щоб прошивати і побачити, чи це допомагає. Як виглядає ваша таблиця процесів? Ви можете використовувати ftrace в крайньому випадку, якщо у вас є ланцюжок інструментів для створення ядра.
Джонатан Бен-Аврахам

sar -bu може це зробити .. linux.die.net/man/1/sar
Grizly

У роботі використовується деякий спалах; SD-карта з встановленою файловою системою ext4. І пише, що це справді можливе джерело цих проблем (але чому саме?), Але, мабуть, не єдине.
awy

Відповіді:


1

perfможе бути для вас корисним. Він є частиною утиліт ядра Linux.

Наприклад:

perf record -R -a -g fp -e cycles -e syscalls:sys_enter_poll -e syscalls:sys_exit_poll
#Just ctrl+c if you are done, and view ith
perf script 

Він покаже всі часи введення / виходу системного виклику та параметри (наприклад, strace), вкаже ім'я двійкового файлу, що викликає syscall, та вилучить виклик стека виклику кожного процесора з певною частотою (включаючи символи ядра). Таким чином, ви дійсно можете побачити, який код виконувався під час syscall. У багатопроцесорній системі вам потрібно звернути увагу на id процесора (наприклад, [001]).


Я роздивлюся, як створити парф для платформи - дякую за підказку.
awy

0

Можливо, atopможна пролити трохи світла на вашу проблему.

Він може показувати процеси, які вже вийшли, а також може використовувати процесор , пам'ять , диск та мережеве використання.

Ви можете запустити його інтерактивно, дозволити йому записувати у текстовий файл або запускати його як sarзаздалегідь заданий інтервал, створюючи файл бінарної історії, через який ви зможете перейти далі.

Я використовую його для пошуку свиней усіх видів, які важко знайти :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.