Запускаем сервер (БД, Web-сервер или что-то свое собственное) и не получаем желаемый RPS. Запускаем top и видим, что 100% выедается CPU. Что дальше, на что расходуется процессорное время? Можно ли подкрутить какие-то ручки, чтобы улучшить производительность? А если параметр CPU не высокий, то куда смотреть дальше?
Мы рассмотрим несколько сценариев проблем производительности, рассмотрим доступные инструменты анализа производительности и разберемся в методологии оптимизации производительности Linux, ответим на вопрос за какие ручки и как крутить.
5. top, 1
%Cpu0 : 4.9 us, 25.6 sy, 0.0 ni, 20.7 id, 0.0 wa, 0.0 hi, 48.8 si, 0.0 st
%Cpu1 : 7.4 us, 37.0 sy, 0.0 ni, 17.3 id, 0.0 wa, 0.0 hi, 38.3 si, 0.0 st
Основное время тратится в ядре
Процессоры загружены равномерно
6. GDB
(профайлинг по-крестьянски)
# for p in `pidof nginx`; do
gdb -batch -ex "set pagination 0" -ex "thread apply all bt" -p $p | grep "#[01]";
done
#0 0x00007fea49079df3 in __epoll_wait_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x000000000042074b in ngx_epoll_process_events (cycle=0x6a31d0, timer=500, flags=1) at
src/event/modules/ngx_epoll_module.c:577
#0 0x00007fea49079df3 in __epoll_wait_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x000000000042074b in ngx_epoll_process_events (cycle=0x6a31d0, timer=500, flags=1) at
src/event/modules/ngx_epoll_module.c:577
….....
Несколько раз повторяем и (часто) видим bottle-neck
Могли бы увидеть на верху стека прикладной код...