Howto Профилирование Linux
Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
howto:howto_kernel:howto_профилирование_linux [20.09.2018 06:45] олег_стрижеченко Approved(admin 2018/09/20 12:56) |
howto:howto_kernel:howto_профилирование_linux [20.05.2019 15:18] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ===== Введение ===== | ||
+ | **Начать с**: | ||
+ | <code bash> | ||
+ | yum --enablerepo='base-debuginfo' install kernel-debuginfo-`uname -r` kernel-devel perf oprofile gdb kexec-tools crash | ||
+ | </code> | ||
+ | |||
+ | **если по быстрому** | ||
+ | * perf top - не точно показывает адрес топ фукнции | ||
+ | * https://perf.wiki.kernel.org/index.php/Tutorial#Sampling_with_perf_record | ||
+ | * perf top -d 5 -U | ||
+ | * perf top -d 5 -g -U | ||
+ | * perf stat -e task-clock,cycles,instructions,cache-references,cache-misses sleep 5 | ||
+ | * **perf record -a sleep 5** и **потом perf report** | ||
+ | * powertop | ||
+ | **если всерьез** | ||
+ | * oprofile | ||
+ | * sysrq | ||
+ | * ftrace + debugfs | ||
===== Общий алгоритм ===== | ===== Общий алгоритм ===== | ||
- Привести машину в максимально дефалтное состояние. Проверить и устранить аномалии и вредные настройки, например штормы прерываний, постоянный лог ошибок в dmesg и прочее. Убрать все оптимизации, если они были наугад включены. | - Привести машину в максимально дефалтное состояние. Проверить и устранить аномалии и вредные настройки, например штормы прерываний, постоянный лог ошибок в dmesg и прочее. Убрать все оптимизации, если они были наугад включены. | ||
Строка 8: | Строка 26: | ||
- Попробовать решить задачу оптимизацией настроек и оборудования и правил и тп workaround | - Попробовать решить задачу оптимизацией настроек и оборудования и правил и тп workaround | ||
- Если невозможно решить оптимизацией настроек, пробуем оптимизировать код, убрать локи добавить хеши усилить параллельность итп. | - Если невозможно решить оптимизацией настроек, пробуем оптимизировать код, убрать локи добавить хеши усилить параллельность итп. | ||
- | ===== Рекомендации профилированию сетевого стека ядра ===== | + | ===== Рекомендации профилированию сетевого стека ядра для маршрутизаторов и firewall ===== |
+ | **Перед профилированием попробовать решить типовые проблемы, а именно:** | ||
- Убедиться, что нет шторма прерываний(особенно usb и прочее левое оборудование). | - Убедиться, что нет шторма прерываний(особенно usb и прочее левое оборудование). | ||
- Проверить, что dmesg чистый. | - Проверить, что dmesg чистый. | ||
Строка 19: | Строка 38: | ||
- Проверить, что используются только fifo или fast_fifo очереди на сетевках, на qdisc, на imq, тк все остальные хитрые очереди гарантированно дают лишнюю нагрузку и никакой пользы не дают на современных скоростях. | - Проверить, что используются только fifo или fast_fifo очереди на сетевках, на qdisc, на imq, тк все остальные хитрые очереди гарантированно дают лишнюю нагрузку и никакой пользы не дают на современных скоростях. | ||
- Проверить что connlimit либо патченый c hash? либо не используется тк дефалтный очень плохой и тормозной. | - Проверить что connlimit либо патченый c hash? либо не используется тк дефалтный очень плохой и тормозной. | ||
- | - Проверить колво маршрутов в ip route show и ip route show cache, бывает, что там 1млн маршрутов и это будет тормозить | + | - Проверить колво маршрутов в ip route show и ip route show cache, бывает, что там 1млн маршрутов и это будет тормозить, однако если в FORWARD поставить первым ACCEPT или DROP(для зеркальных firewall) и нагрузка упадет в разы значит кеш маршрутов не причем. Оттюнить бакеты и прочее в rt_cache в proc sys |
- | - Проверить колво контраков | + | - Проверить колво контраков, если запредельно, то будет тормозить. Оттюнить колво бакеты и прочее в в proc sy |
- Для carbon_xge проверить, что используется ядро carbon_master с правильными оптимизированными OSV патчами IMQ. | - Для carbon_xge проверить, что используется ядро carbon_master с правильными оптимизированными OSV патчами IMQ. | ||
- Для carbon_xge проверить, что включены все оптимизаци для arp и для route подсистем. | - Для carbon_xge проверить, что включены все оптимизаци для arp и для route подсистем. | ||
Строка 30: | Строка 49: | ||
- Включить и настроить RPS на NUMA0 на все процессоры кроме CPU0 | - Включить и настроить RPS на NUMA0 на все процессоры кроме CPU0 | ||
- Убедиться, что нагрузка на CPU0 и CPU1 не менее 10% если CPU1 менее 10% уменшить колво процов на RPS или даже весь rps повешать на CPU1 | - Убедиться, что нагрузка на CPU0 и CPU1 не менее 10% если CPU1 менее 10% уменшить колво процов на RPS или даже весь rps повешать на CPU1 | ||
- | - Далее проводить профилирование по Общему алгоритму п3 | + | - Далее проводить профилирование по Общему алгоритму |
===== Как работает профилирование oprofile ===== | ===== Как работает профилирование oprofile ===== | ||
Строка 192: | Строка 211: | ||
opcontrol --init | opcontrol --init | ||
opcontrol --reset | opcontrol --reset | ||
- | opcontrol --start --vmlinux=/boot/vmlinux | + | opcontrol --start --vmlinux=/usr/lib/debug/lib/modules/2.6.32-642.el6.x86_64/vmlinux |
# но иногда можно и --no-vmlinux если нам не важно про ядро, а только про юспейс | # но иногда можно и --no-vmlinux если нам не важно про ядро, а только про юспейс | ||
# если баг Failed to open profile device: Device or resource busy, то стопаем все виртуалки KVM, одна из них залочила nmi | # если баг Failed to open profile device: Device or resource busy, то стопаем все виртуалки KVM, одна из них залочила nmi | ||
sleep 10 # ждем сбора статистики | sleep 10 # ждем сбора статистики | ||
opcontrol --stop | opcontrol --stop | ||
+ | |||
+ | # включаем watchdog обратно | ||
+ | echo 1 > /proc/sys/kernel/nmi_watchdog | ||
# собрали стату, стопнули, чтоб не грузить. | # собрали стату, стопнули, чтоб не грузить. | ||
</code> | </code> | ||
Строка 235: | Строка 257: | ||
==== Отчета о кастомном модуле ==== | ==== Отчета о кастомном модуле ==== | ||
+ | opreport -l -w -p /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/i40e/\\ | ||
opreport -l -w -p **/node/bin** 2>&1| head -n 100 | grep flas\\ | opreport -l -w -p **/node/bin** 2>&1| head -n 100 | grep flas\\ | ||
0000000000007d30 5385 1.3249 flashcache.ko flashcache flashcache_hash_lookup\\ | 0000000000007d30 5385 1.3249 flashcache.ko flashcache flashcache_hash_lookup\\ |