Практические примеры использования sysdig

Feb 12, 2018 08:55 · 1033 words · 5 minute read monitoring docker sysdig

В 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).

tweet Share