Практические примеры использования sysdig
Feb 12, 2018 08:55 · 1033 words · 5 minute read
В Linux используется целый набор утилит для сбора и анализа информации о состоянии системы. Примеры работы со многими из этих диагностических инструментов мы уже рассматривали — раз, два, три.
Утилита Sysdig благодаря своей фунциональности вполне способна заменить их — давайте разберемся!
Меня данная утилита заинтересовала прежде всего возможностью мониторинга docker-контейнеров:
Sysdig provides additional value by focusing on a few key principles: offering native support for all Linux container technologies, including Docker, LXC, etc
Установка в Debian-based дистрибутивах выглядит следующим образом:
curl -s https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public | apt-key add -
curl -s -o /etc/apt/sources.list.d/draios.list http://download.draios.com/stable/deb/draios.list
apt-get update
apt-get -y install linux-headers-$(uname -r)
apt-get -y install sysdig
Информацию о процессе установки в других дистрибутивах можно найти на официальном сайте.
Первый запуск команды может изрядно испугать:
sysdig
...
223028 16:20:28.018155561 3 mc (4078) < select res=1
223029 16:20:28.018155742 3 mc (4078) > read fd=5(/dev/ptmx) size=128
223030 16:20:28.018155824 2 gnome-terminal- (3564) < read res=116 data=15149 16:20:27.890776487 3 (15982) > switch next=4078(mc) pgft_maj=0 pgft_m
223031 16:20:28.018156006 2 gnome-terminal- (3564) > read fd=15(/dev/ptmx) size=3046
223032 16:20:28.018156183 3 mc (4078) < read res=72 data=15151 16:20:27.890776843 1 gnome-terminal- (3564) > recvmsg fd=4(< u >) ..
223033 16:20:28.018156337 2 gnome-terminal- (3564) < read res=-11(EAGAIN) data=
...
В стандартный вывод попадают события (по одному событию на строку) в следующем формате:
%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args
Здесь:
evt.num
— номер события;evt.time
— время события;evt.cpu
— номер процессора, в котором было перехвачено событие;proc.name
— имя процесса;thread.tid
— номер потока (у однопотоковых процессов он совпадает c номером процесса);evt.dir
— направление события (< — для входящих процессов, > — для исходящих);evt.type
— тип события;evt.args
— аргументы события.
Сохранить информацию о событиях в файл можно так:
sysdig -w myfile.scap
или так (записать 100 событий):
sysdig —n 100 —w myfile.scap
Фильтруем вывод событий одной программы (например, chrome
):
sysdig proc.name = chrome
...
180621 16:34:36.898787194 0 chrome (9083) > futex addr=7FFFFD8F2E0C op=137(FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET) val=1
180622 16:34:36.898790679 0 chrome (9083) > switch next=0 pgft_maj=39 pgft_min=199159 vm_size=1242504 vm_rss=153276 vm_swap=25188
180624 16:34:36.899067296 0 chrome (9150) < futex res=-110(ETIMEDOUT)
180625 16:34:36.899070845 0 chrome (9150) > futex addr=7FFFFD8F2DE0 op=129(FUTEX_PRIVATE_FLAG|FUTEX_WAKE) val=1
180626 16:34:36.899071321 0 chrome (9150) < futex res=0
180627 16:34:36.899083270 0 chrome (9150) > gettid
180628 16:34:36.899083852 0 chrome (9150) < gettid
180629 16:34:36.899149695 0 chrome (9150) > gettid
...
Уберем из предыдущего вывода события типа gettid
:
sysdig proc.name = chrome and evt.type!=gettid
...
209252 16:39:40.670972885 2 chrome (9185) < futex res=0
209271 16:39:40.671141167 2 chrome (9185) > futex addr=7FFFFD8F2E0C op=137(FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET) val=1
209272 16:39:40.671143614 2 chrome (9185) > switch next=0 pgft_maj=0 pgft_min=714232 vm_size=1246760 vm_rss=173320 vm_swap=12756
210554 16:39:40.682201010 3 chrome (26029) < futex res=-110(ETIMEDOUT)
210556 16:39:40.682206257 3 chrome (26029) > futex addr=7FFFFD8F2DE0 op=129(FUTEX_PRIVATE_FLAG|FUTEX_WAKE) val=1
210558 16:39:40.682207044 3 chrome (26029) < futex res=0
210572 16:39:40.682372914 3 chrome (26029) > futex addr=7FFFFD8F2E0C op=137(FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET) val=1
210573 16:39:40.682376030 3 chrome (26029) > switch next=0 pgft_maj=4 pgft_min=85552 vm_size=1230936 vm_rss=160852 vm_swap=6400
...
Форматируем вывод с помощью опции -p
. Например, вывести в консоль имена пользователей, выполняющих команду cd
(системные вызовы chdir
) и имена директорий, в которые переходят пользователи можно так:
sysdig -p"user:%user.name dir:%evt.arg.path" evt.type=chdir
...
user:root dir:/data
user:root dir:/var/run/docker/libcontainerd/containerd/bb9716c53b30446d2cf71b02ae72357d12909c6a23b22faff4c2e6fba64d0911/7128d41f044c88220b6dbdbb7086920e5607cc0e9ba158192d9d9e0130d27f6a
user:root dir:/var/run/docker/libcontainerd/bb9716c53b30446d2cf71b02ae72357d12909c6a23b22faff4c2e6fba64d0911
user:root dir:/var/lib/docker/overlay2/9daf5e57ecc960ed30068bd57f98b041ef6645e051ca14a98a9d4dfcb6156100/merged
...
Также есть возможность использовать для анализа событий готовые lua-скрипты, которые разработчики продукта именуют chisels
(в переводе - “долото”, “стаместка”). Список всех таких скриптов, рассотритованых по категориям, можно увидеть с помощью команды:
sysdig -cl
Описание конкретного скрипта можно прочесть используя команду sysdig -i <имя_скрипта>
, например:
sysdig -i topprocs_net
Category: Net
-------------
topprocs_net Top processes by network I/O
Sort the list of the processes that use the most network bandwidth. This chisel
is compatible with containers using the sysdig -pc or -pcontainer argument, ot
herwise no container information will be shown.
Args:
(None)
Фильтры можно применять и к “чизелам” (chisels
). Например, посмотреть к каким файлам обращается пользователь e.lebed так:
sysdig -c topfiles_bytes "user.name=e.lebed"
Теперь немного о анализе событий в docker-контейнерах. Просмотреть информацию о процессах (в т. ч. запущенных в контейнерах), потребляющих больше всего трафика можно так:
sysdig -pc -c topprocs_net
Bytes Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
800B redis-server 7181 1 redis
784B Chrome_IOThread 8668 8715 host
136B redis-cli 23621 17865 redis
136B redis-cli 23553 17853 redis
136B redis-cli 23691 17877 redis
98B redis-cli 23587 17859 redis
98B redis-cli 23518 17847 redis
98B redis-cli 23656 17871 redis
98B redis-cli 23726 17883 redis
49B avahi-daemon 677 677 host
Информация об использовании дисковой подсистемы (в т. ч. контейнерами):
sysdig -pc -c topprocs_file
Bytes Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
14.05M php-fpm 6886 8 docker_php-fpm_1
14.05M php-fpm 6888 10 docker_php-fpm_1
14.05M php-fpm 6890 12 docker_php-fpm_1
14.05M php-fpm 6889 11 docker_php-fpm_1
2.38M mpegaudioparse3 13372 13393 host
1.28M curl 29468 29468 host
183.14KB Chrome_IOThread 8668 8715 host
Увидеть информацию об использовании процессора так:
sysdig -pc -c topprocs_cpu
CPU% Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
0.00% gmain 716 716 host
0.00% gdbus 1025 1025 host
0.00% systemd 963 963 host
0.00% php-fpm 12858 1 docker_php-fpm_1
0.00% supervisord 13152 1 dynamicus
0.00% bash 13145 1 sphinxsearch
0.00% sysdig 15393 15393 host
0.00% fish 12507 12507 host
0.00% beam.smp 15005 338 rabbitmq
0.00% sshd 25107 25107 host
или так (использование CPU конкретным контейнером):
sysdig -pc -c topprocs_cpu container.name=docker_php-fpm_1
CPU% Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
0.00% php-fpm 6890 12 docker_php-fpm_1
0.00% php-fpm 6886 8 docker_php-fpm_1
0.00% php-fpm 6302 1 docker_php-fpm_1
0.00% php-fpm 6887 9 docker_php-fpm_1
0.00% php-fpm 6889 11 docker_php-fpm_1
0.00% php-fpm 6888 10 docker_php-fpm_1
Приятный бонус: утилита sysdig
также имеет UI (очень похож на интерфейс утилиты htop
). Для запуска нужно использовать команду:
csysdig
Далее можно с помощью функциональных клавиш фильтровать/сортировать вывод событий, менять вид отображения, использовать поиск и “погружаться” (dig
) глубже в интересующий процесс для получения дополнительных сведений. Так как нас прежде всего интересуют docker-контейнеры, изменим текущий вид (View) - нажимаем F2 и с помощью стрелок навигации выбираем пункт Containers. На экране появится информация о запущенных контейнерах.
Далее можно выбрать из списка интересующий нас контейнер и “погрузиться” в подробности нажав клавишу F6 (вернуться на предыдущий уровень можно нажав кнопку Backspace или дважды Esc). По нажатию F8 на интересующем нас контейнере видим список действий, которые можно к нему применить (если вы не выбрали вид (View) отображения Containers, то список доступных действий будет отличаться - будут предложены действия, применимые к процессам).
Стоит отметить, что в последней версии утилиты sysdig
есть виды (View), позволяющие мониторить Kubernetes и его сущности (pods
/ deployments
/ namespaces
/ replicasets
/ services
).