Slide 1

Slide 1 text

Linux Observability with BPF Performance Tools 2020/09/08 Cloud Native Days Tokyo 2020

Slide 2

Slide 2 text

2 名前: 磯 賢大(@go_vargo) 所属: 株式会社コロプラ    インフラグループ 第2チーム 最近ハマっていること: 良い感じのBPFツールを探すこと Linux KernelとBPFは勉強中 Minikube Contributor 出版: 「実践Helm」「Kubernetesカスタムコントローラーへの道」インプレスR&D 自己紹介 外部発表: ・Cloud Native Days Kansai 2019 Best Speaker ・Google Cloud Anthos Day

Slide 3

Slide 3 text

3 本講演で目指すこと - トラブルシューティング/パフォーマンスチューニングに有用なBPF Performance Toolsの 効用を理解できること - Linuxカーネルに詳しくない人でも、BPF Toolsを使えるための一助になる 発表のモチベーション - BPFがなにか? という発表は見るが、どういう風に使っているか? どういう切り口で使っ ていくか? という発表はなかなか見かけないので、BPF利用のきっかけになってほしい - どんどん利用者を増やしたい - BPF Toolsを、日常的に使うLinuxコマンドレベルにまで昇華してほしい 目的

Slide 4

Slide 4 text

4 1. BPFとは? / BPF Performance Toolsとは? 2. BCC / bpftrace 3. CPU / Memory / Filesystem / Disk / Network 4. Kubernetes × BPF Performance Tools 5. Summary Agenda

Slide 5

Slide 5 text

1. BPFとは? / BPF Performance Toolsとは?

Slide 6

Slide 6 text

6 例えば...「なにかサーバーの様子がおかしい」時、Linuxコマンドを使った調査を することはエンジニアには珍しいことではないかもしれません。 Linuxでは伝統的なコマンドが提供されており、 そのツールを使って問題やボトルネックを 発見・解決することも多いでしょう。 しかし逆に言えば、そのツールが提供されていない レイヤーの問題を見つけることは非常に難しくなります。 そういう場合、BPF Performance Toolsが問題を解く鍵に なるかもしれません。 Linux Analysis top netstat iostat vmstat mpstat free sar pidstat

Slide 7

Slide 7 text

7 ・BPF Performance Tools https://www.oreilly.com/library/view/bpf-performance-tools/9780136588870/ ・Linux Observability with BPF https://www.oreilly.com/library/view/linux-observability-with/9781492050193/ ・eBPF - Rethinking the Linux Kernel https://docs.google.com/presentation/d/1AcB4x7JCWET0ysDr0gsX-EIdQSTyBtmi6OAW7bE0jm0 ・Tutorial: Using BPF in Cloud Native environments https://github.com/kinvolk/cloud-native-bpf-workshop/blob/master/slides.pdf ・BCC(BPF Compiler Collection) for Ruby https://speakerdeck.com/udzura/bcc-bpf-compiler-collection-for-ruby BPFについて参考になる資料

Slide 8

Slide 8 text

8 ● 元々は1992年に開発された(名前通り)「パケットフィルター」用のツール ● 現在はパケットフィルター以外の多様な用途(下図参照)に利用される ● eBPFという用語もあるが、正式名称としてはBPFのまま BPF(Berkeley Packet Filter)とは? BPF Tracing Profile Security Extended Kernel Network

Slide 9

Slide 9 text

9 ● カーネルレイヤーで、eventのTracingやProfileが可能 ● System Call, Perf event, Disk I/O, Networkingなどを深掘りできる BPF(Berkeley Packet Filter)とは? BPF Tracing Profile Security Kernel Extension Network 本資料のターゲット

Slide 10

Slide 10 text

10 難しくなっていくので、説明を省きます 詳細を知りたい方は 「Linux Observability with BPF」と「BPF Performance Tools」2章 あたりを読みましょう BPFの仕組み

Slide 11

Slide 11 text

11 BPFを利用したPerformance Tracing Toolsのことを便宜上、 「BPF Performance Tools」または「BPF Tools」と呼びます(正式名称ではない) IO VisorというLinux Foundation Projectがあり、このProjectには 「BCC」「bpftrace」といった、BPF Toolsのリポジトリがあります。 BCC: https://github.com/iovisor/bcc bpftrace: https://github.com/iovisor/bpftrace 本資料では、BPF Performance Tools「BCC」「bpftrace」を使った トラブルシューティング・パフォーマンスチューニングについて着目していきま す。 BPF Performance Toolsとは?

Slide 12

Slide 12 text

3. BCC / bpftrace

Slide 13

Slide 13 text

13 BCC: BPF Compiler Collectionの略。カーネルトレーシングや操作用のツールキット。 PythonやLuaのインターフェイスを用意しておりBPFツールの開発を支援している が、利用者向けに多くのトレーシングツールも提供している。 bpftrace: DTraceやSystemTapに触発されて開発された、BPF/BCCベースのトレースツール スクリプト言語が印象として近く、ワンライナーで実行も可能。 ※ 本資料では提供されているツールの利用が主目的で、 これらのツールを使ったBPFツールの自作方法については触れません BCC / bpftrace

Slide 14

Slide 14 text

14 出典: https://github.com/iovisor/bcc/blob/master/images/bcc_tracing_tools_2019.png CPU / Memory / Filesystem / Disk / Networkなど、各レイヤーごとに単一目的 のツールを提供 ※ BCCとbpftraceで使えるツールが異なるので注意 BCC / bpftrace Tracing Tools

Slide 15

Slide 15 text

15 Linux Performance Analysis in 60,000 Milliseconds by Netflix エンジニアがサーバーにSSHして1分で調査するコマンド 参考) Linux 60-Second Analysis 参考: https://netflixtechblog.com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55 1. uptime 2. dmesg | tail 3. vmstat 1 4. mpstat -P ALL 1 5. pidstat 1 6. iostat -xz 1 7. free -m 8. sar -n DEV 1 9. sar -n TCP,ETCP 1 10. top

Slide 16

Slide 16 text

16 execsnoop: 新しく生成されたプロセスを一覧で表示する 実行例: BCC

Slide 17

Slide 17 text

17 biolatency: Block Device I/O レイテンシーをヒストグラムで表示 実行例: BCC

Slide 18

Slide 18 text

18 tcpconnect: tcp connectをIP/Portレベルでトレース 実行例: BCC

Slide 19

Slide 19 text

19 スクリプトベースで任意のトレースを実行可能 実行例: bpftrace ワンライナー $ bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }' Attaching 1 probe... @[signal_thread.*]: 8 @[out_detect_exc*]: 12 @[runc:[0:PARENT]]: 16 @[php]: 17 @[google-fluentd]: 18 @[runc:[1:CHILD]]: 26 @[bpftrace]: 28 @[ruby]: 30 @[multipathd]: 31 @[docker-init]: 33 @[supervisord]: 38 @[dbus-daemon]: 46

Slide 20

Slide 20 text

20 XXXX.bt形式のファイルを実行することも可能(e.g. bpftrace signal.bt) 実行例: bpftrace signal.bt たとえば、左図はsignal.btを使うことで、 シグナルのトレースが可能。 コマンドごとのシグナルをカウントする。 個人的には、SIGTERMやSIGKILL、 SIGSEGVの発生確認に便利だと感じてます。

Slide 21

Slide 21 text

21 基本は使いたいツールがある方を選択する。例えば次の場合はBCCを選択する BCC: ツールAを提供している / bpftrace: ツールAを提供していない 初めてBPFツールを触るときは、次のステップで考えてみます 初心者: BCCのツールを使ってみる 中級者: bpftraceのツール(スクリプト)を作ってみる 上級者: BCCのツールを開発する、BCCやbpftraceにコントリビュートする BCC / bpftraceの使い分け 参考: http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html

Slide 22

Slide 22 text

22 BPF Performance Toolsの使いどころ Monitoring Dashboardを眺める サーバーにSSHしてLinuxコマンドで確認 サーバーにSSHしてBPFツールで確認 解決しない場合 解決しない場合(個人的には奥の手) top netstat iostat vmstat mpstat free sar pidstat

Slide 23

Slide 23 text

23 BPF Performance Toolsは、カーネルが提供しているEventSourceをトレースします。 つまり、既存のカーネルの機能の上に成り立っている機能、だと言えます。 参考) BPFとEvent Source Event Source 概要 kprobe Kernel Level Dynamic Tracepoint uprobe User Level Dynamic Tracepoint tracepoints Kernel Level Static Tracepoint USDT User Space Static Tracepoint Dynamic USDT User Space Dynamic Tracepoint PMCs Programmable Hardware Counters perf event Perfコマンドで使われているイベント

Slide 24

Slide 24 text

24 「BPF Performance Tools」の著者 Brendan Greggさんが、本への掲載用に開発 した自作のツールを下記のリポジトリにて公開しています(bpftraceのみ)。 公開されているツールには非常に有用なものが多いので、bpftraceを使う場合は 積極的に利用したいところです。 個人的にはNetwork系のツール(sockstat.btやsoconnlat.bt)などが便利で好きで す。 参考) BPF Performance Tools(Book) リポジトリ: https://github.com/brendangregg/bpf-perf-tools-book

Slide 25

Slide 25 text

4. CPU / Memory / Filesystem / Disk / Network

Slide 26

Slide 26 text

26 CPU

Slide 27

Slide 27 text

27 Linux Traditional Tools CPU Syscall CPU Cache Scheduler Interrupts Process Thread top vmstat ps sar pidstat strace perf uptime mpstat sar Entire

Slide 28

Slide 28 text

28 Entire argdist profile funccount trace BPF Performance Tools CPU Syscall CPU Cache Scheduler Interrupts Process Thread top vmstat ps sar pidstat strace perf execsnoop exitsnoop syscount llcstat cpudist softirqs hardirqs smpcalls runqlat runqlen offcputime runqslower uptime mpstat sar Entire

Slide 29

Slide 29 text

29 BPF Performance Tools(CPU) (1/2) ツール ソース 機能説明 execsnoop bcc/bpftrace 実行されているプロセスを一覧表示 exitsnoop bcc exitしたプロセスと理由を表示 runqlat bcc/bpftrace CPU run queue latencyをまとめる runqlen bcc/bpftrace CPU run queue lengthをまとめる runqslower bcc 規定値より遅いrun queueの表示 cpudist bcc on-CPU timeをまとめる cpufreq bpf book プロセスごとのcpu frequencyのサンプリング profile bcc CPU stack traceのサンプリング offcputime bcc/bpf book off-CPU stack traceと時間をまとめる

Slide 30

Slide 30 text

30 BPF Performance Tools(CPU) (2/2) ツール ソース 機能説明 syscount bcc/bpftrace system callをカウント argdist bcc system call解析に利用可能 trace bcc system call解析に利用可能 funccount bcc function callをカウント softirps bcc software 割り込み時間をまとめる hardirps bcc hardware 割り込み時間をまとめる smpcalls bpf book SMP call functionの時間をまとめる llcstat bcc プロセスごとのLLCヒット率をまとめる

Slide 31

Slide 31 text

31 runqlat: CPU Run Queueは混んでいる?

Slide 32

Slide 32 text

32 run queue上のレイテンシは大部分が 0-63usec(※)なので、比較的早い状態 ※マイクロ秒 runqlat: CPU Run Queueは混んでいる?

Slide 33

Slide 33 text

33 cpudist: on-CPU時間は飽和している?

Slide 34

Slide 34 text

34 cpudist: on-CPU時間は飽和している? CPU上の時間が分かるので、 WorkloadがCPUバウンドかどうか判定できる 今回はほぼ1msecなので比較的早い

Slide 35

Slide 35 text

35 profileコマンドはstack traceをサンプリングできるBCCツールです。 profileコマンドとFlameGraph(Visualizationツール)を組み合わせることで、 CPU上のワークロードを可視化できます FlameGraph with BPF profile $ profile -af 30 > out.stacks01 $ git clone https://github.com/brendangregg/FlameGraph $ cd FlameGraph $ ./flamegraph.pl < ../out.stacks01 > out.svg ※ pidで絞るときは profile -p を付ける

Slide 36

Slide 36 text

36 profile × FlameGraph nodejsの例 (長すぎるので全景は省略)

Slide 37

Slide 37 text

37 Memory

Slide 38

Slide 38 text

38 Linux Traditional Tools Memory OOM Physical/ Virtual Allocator Pages/ Swapping vmstat slabtop top sar free vmstat Entire dmseg top pmap swapon

Slide 39

Slide 39 text

39 BPF Performance Tools Memory OOM Physical/ Virtual Allocator Pages/ Swapping slabtop free vmstat dmseg top pmap swapon oomkill mmapsnoop brkstack faults ffaults hfaults swapin memleak shmsnoop drsnoop vmstat top sar Entire vmscan

Slide 40

Slide 40 text

40 BPF Performance Tools(Memory) (1/2) ツール ソース 機能説明 oomkill bcc/bpftrace OOM Kill eventの情報を表示 memleak bcc memory leak code pathを表示 mmapsnoop bpf book システム全体のmmap(2)をトレース brkstack bpf book user stack traceとbrk(2) callを表示 shmsnoop bcc shared memory callを表示 faults bpf book user stack traceごとにpage faultsを表示 ffaults bpf book ファイル名ごとにpage faultsを表示 vmscan bpf book VM scannerのシュリンク・拡張を測定

Slide 41

Slide 41 text

41 BPF Performance Tools(Memory) (2/2) ツール ソース 機能説明 drsnoop bcc reclaim eventのトレースとlatencyの表示 swapin bpf book プロセスごとのswap-inを表示 hfaults bpf book プロセスごとにhuge page faultsを表示

Slide 42

Slide 42 text

42 oomkill: OOM Killされていないか? Tracing OOM kills... Ctrl-C to stop. 10:44:06 Triggered by PID 154587 ("php-fpm"), OOM kill of PID 154587 ("php-fpm"), 128000 pages, loadavg: 1.06 0.95 0.60 30/646 174647

Slide 43

Slide 43 text

43 oomkill: OOM Killされていないか? Tracing OOM kills... Ctrl-C to stop. 10:44:06 Triggered by PID 154587 ("php-fpm"), OOM kill of PID 154587 ("php-fpm"), 128000 pages, loadavg: 1.06 0.95 0.60 30/646 174647 dmesgだとKernelのログの中から OOM Killのログを探す必要があったが、 一発でOOM Killの有無が分かる 何のプロセスがメモリを求めた結果、 どのプロセスが殺されたも併せて分かる

Slide 44

Slide 44 text

44 mmapsnoop: 何がマッピングされている?

Slide 45

Slide 45 text

45 mmapsnoop: 何がマッピングされている? mmap メモリマッピングの詳細が見れるので、 デバッグに有効 オプションがなく、絞り込みができないので注意

Slide 46

Slide 46 text

46 File System

Slide 47

Slide 47 text

47 Linux Traditional Tools File System Syscall VFS Cache strace free perf sar Entire df mount

Slide 48

Slide 48 text

48 BPF Performance Tools File System Syscall VFS Cache strace free perf filelife sar Entire df mount opensnoop statsnoop syncsnoop mmapfiles scread vfsstat vfscount vfssize fsrwstat fileslower filetop filetype writesync cachestat writeback dcstat icstat bufgrow mountsnoop xfsslower xfsdist ext4dist readhead fmapfault

Slide 49

Slide 49 text

49 BPF Performance Tools(FileSystem) (1/3) ツール ソース 機能説明 opensnoop bcc/bpftrace openされたファイルをトレース statsnoop bcc/bpftrace stat(2) callをトレース syncsnoop bcc/bpftrace sync(2) callをトレース mmapfiles bpf book mmap(2) fileをカウント scread bpf book read(2) fileをカウント fmapfault bpf book file map faultsをカウント filelife bcc/bpf book short lived fileのライフスパンを表示 vfsstat bcc/bpftrace VFS operationの統計 vfscount bcc/bpftrace すべてのVFS operationをカウント

Slide 50

Slide 50 text

50 BPF Performance Tools(FileSystem) (2/3) ツール ソース 機能説明 vfssize bpf book VFS read/write sizeを表示 fsrwstat bpf book file system typeごとのVFS read/writeを表示 fileslower bcc/bpf book 遅いfile read/writeを表示 filetop bcc top(1)コマンドのファイル版 filetype bpf book file typeとプロセスごとのVFS read/writeを表示 writesync bpf book sync flagによるregular fileへのwriteを表示 cachestat bcc Page cacheの統計 writeback bpftrace write-back eventとlatencyの表示 dcstat bcc/bpf book directory cache ヒット統計

Slide 51

Slide 51 text

51 BPF Performance Tools(FileSystem) (3/3) ツール ソース 機能説明 dcsnoop bcc/bpftrace directory cache lookupをトレース mountsnoop bcc システム全体のmount, umountをトレース xfsslower bcc 遅いXFS operationを表示 xfsdist bcc XFS operation latency ヒストグラムを表示 ext4dist bcc/bpf book ext4 operation latency ヒストグラムを表示 icstat bpf book inode cache ヒット統計 bufgrow bpf book buffer cache growthを表示 readahead bpf book read ahead ヒットと効率を表示

Slide 52

Slide 52 text

52 cachestat: Page Cacheのヒット率は?

Slide 53

Slide 53 text

53 cachestat: Page Cacheのヒット率は? Page Cacheのヒット率が100%なので、 アプリケーションはDisk I/Oを待つことなく、 メモリにアクセスしている

Slide 54

Slide 54 text

54 ext4slower: ext4filesystemは遅くないか?

Slide 55

Slide 55 text

55 ext4slower: ext4filesystemは遅くないか? 10msを超えたext4 operationが一覧で出るが、 そこまで高いレイテンシーではない ※ 他にも、xfsslowerでxfsも確認可能

Slide 56

Slide 56 text

56 Disk

Slide 57

Slide 57 text

57 Linux Traditional Tools Disk BlockDevice Interface Volume Manager Block Layer iostat perf sar blktrace

Slide 58

Slide 58 text

58 BPF Performance Tools Disk BlockDevice Interface Volume Manager Block Layer iostat perf sar blktrace mdflush iosched blkthrot biolatency biosnoop biotop bitesize seeksize biopattern biostacks bioerr

Slide 59

Slide 59 text

59 BPF Performance Tools(Disk) (1/2) ツール ソース 機能説明 biolatency bcc/bpftrace block I/O latencyのヒストグラムを表示 biosnoop bcc/bpftrace disk I/OをPIDとlatencyなどとまとめる biotop bcc top(1)のblock I/O版 bitesize bcc/bpftrace プロセスごとのdisk I/O sizeをヒストグラムで表示 seeksize bpf book disk I/O seekのsizeを表示 biopattern bpf book diskアクセスパターンをrandom/sequentialに分類 biostacks bpf book I/O initialization stack traceとlatencyを表示 bioerr bpf book disk errorをトレース mdflush bcc/bpftrace md flush requestをトレース

Slide 60

Slide 60 text

60 BPF Performance Tools(Disk) (2/2) ツール ソース 機能説明 iosched bpf book I/O schedulerのlatencyをまとめる

Slide 61

Slide 61 text

61 biolatency: I/Oは遅くないか?

Slide 62

Slide 62 text

62 biolatency: I/Oは遅くないか? ヒストグラムで見ると、Disk I/Oは比較的遅め (だいたい2-8msec程度) 遅い理由として、 ・I/OがランダムI/Oになっていないか ・I/Oのサイズが大きすぎないか などを疑う

Slide 63

Slide 63 text

63 biosnoop: どのプロセスのI/Oが遅い?

Slide 64

Slide 64 text

64 biosnoop: どのプロセスのI/Oが遅い? プロセス・ディスク・レイテンシーが確認できる ので、I/Oが遅いものを特定可能

Slide 65

Slide 65 text

65 Network

Slide 66

Slide 66 text

66 Linux Traditional Tools Network Queue Socket IP UDP ip ss ethtool tc Entire sar TCP Network Device tcpdump ifconfig netstat

Slide 67

Slide 67 text

67 BPF Performance Tools Network Queue Socket IP UDP ip ss ethtool tc netstat Entire sar TCP Network Device tcpdump ifconfig sockstat sofamily soprotocol soconnect soaccept socketio socksize sormem soconnlat solstbyte tcpconnect tcpaccept tcplife tcptop tcpsynbl tcpwin tcpnagle tcpretrans udplife udpconnect gethostlatency ipecn superping qdisk-fq(...) nettxlat netsize

Slide 68

Slide 68 text

68 BPF Performance Tools(Network) (1/4) ツール ソース 機能説明 sockstat bpf book high-level socket 統計 sofamily bpf book プロセスごとに、new socketのaddress familiyをカウント soprotocol bpf book プロセスごとに、new socket protocol(TCP,UDP,UNIX)を表示 soconnect bcc/bpftrace socket IP-protocol connectionをカウントする soaccept bpf book socket IP-protocol acceptをカウントする socketio bpf book I/Oをカウントしつつsocket詳細をトレース socksize bpf book socket I/O sizeをプロセスごとのヒストグラムで表示 sormem bpf book socket receive bufferとoverflowの状況を表示 soconnlat bpf book stackと一緒にIP socket connection latencyをまとめる

Slide 69

Slide 69 text

69 BPF Performance Tools(Network) (2/4) ツール ソース 機能説明 solstbyte bpf book socket first byte latencyをまとめる tcpconnect bcc/bpftrace/book TCP active connection(connect())をトレース tcpaccept bcc/bpftrace/book TCP passive connection(accept())をトレース tcplife bcc/bpf book TCP sessionのlifespanをトレース tcptop bcc top(1)のTCP版 tcpretrans bcc/bpftrace TCP retransmitをトレース tcpsynbl bpf book TCP SYN backlogをヒストグラムとして表示 tcpwin bpf book TCP send congestion widow sizeや他のパラメータを表示 tcpnagle bpf book TCP nagleの状況とtransmit delayをトレース

Slide 70

Slide 70 text

70 BPF Performance Tools(Network) (3/4) ツール ソース 機能説明 udpconnect bpf book new UDP connectionをトレース gethostlatency bpftrace/book library call経由でDNS lookup latencyをトレース ipecn bpf book IP inbound explicit congestion notificationをトレース superping bpf book ICMP echo latencyをトレース qdisc-fq(...more) bpf book FQ qdisc queue latencyを表示 netsize bpf book net device I/O sizeを表示 nettxlat bpf book net device transmission latencyを表示 skbdrop bpf book kernel stack traceと一緒にsk_buff dropをトレース skblife bpf book sk_buffのlifespanを表示

Slide 71

Slide 71 text

71 BPF Performance Tools(Network) (4/4) ツール ソース 機能説明 ieee80211scan bpf book IEEE 802.11 WiFi scanningをトレース

Slide 72

Slide 72 text

72 tcplife: TCP通信は遅くなっていないか?

Slide 73

Slide 73 text

73 tcplife: TCP通信は遅くなっていないか? どのプロセスがどこからどこ宛に 通信しているのか一目で把握できる どこの通信が遅いのか、 レイテンシーから判別することも可能 オプションでLocalPort, RemotePortの 絞り込みもできて、とても便利

Slide 74

Slide 74 text

74 tcpretrans: TCPの再送が起きていないか?

Slide 75

Slide 75 text

75 tcpretrans: TCPの再送が起きていないか? TCPの再送が起きているか、一目で分かる。 再送が起きると、1~3sほどの遅延が 発生するので、発生しているのであれば 原因を深掘りしていく

Slide 76

Slide 76 text

4. Kubernetes × BPF Performance Tools

Slide 77

Slide 77 text

77 Kubernetes上で実施するBPF Tracing Kubernetes上で実施するBPF Performance Toolsとして、kubectlのPluginの形 で提供されているOSSがあります。 ● kubectl trace (by IO Visor) ● kubectl capture (by Sysdig) ● Inspektor Gadget (by Kinvolk) コロプラでも独自のkubectl pluginを使って、本番環境も含めてBPF Tracing Toolを活用しています。

Slide 78

Slide 78 text

78 bpftraceをKubernetes上で動かすためのPlugin コマンド実施例 kubectl trace $ kubectl trace run pod/app-5989c44dbd-6hn4b -c app-container \ -e "tracepoint:syscalls:sys_enter_* { @[probe] = count(); }" Kernel app app app kubectl-trace kubectl trace Nodeのカーネルヘッダーや/usr, /sysなどのHostPathをマウント リポジトリ: https://github.com/iovisor/kubectl-trace

Slide 79

Slide 79 text

79 ホスト上のあらゆる情報を取得するためのkubectl Plugin Sysdig Inspectと組み合わせることで、複数レイヤの情報を取得可能 kubectl capture 負荷試験環境で取得した実例 リポジトリ: https://github.com/sysdiglabs/kubectl-capture

Slide 80

Slide 80 text

80 BCCのいくつかのツールを動かせるPlugin PodごとにTracing可能 kubectl gadget Kernel app app app gadget kubectl gadget リポジトリ: https://github.com/kinvolk/inspektor-gadget $ kubectl gadget deploy | kubectl apply -f - $ kubectl run --image=busybox shell -- sh -c 'while sleep 1 ; do date ; done' $ kubectl gadget execsnoop -n default -l run=shell

Slide 81

Slide 81 text

81 やりたいこと ● BCCの標準ツールを、Kubernetes上のPodに使ってTracingしたい ▶ kubectl-digとして使用 ● bpftraceの標準ツールを、Kubernetes上のPodに使ってTracingしたい ▶ kubectl-bpftraceとして使用 コロプラ流 kubectl dig + kubectl bpftrace Kernel app app app dig or bpftrace BCCを使いたい → kubectl-dig bpftraceを使いたい → kubectl-bpftrace Nodeのカーネルヘッダーや/usr, /procなどのHostPathをマウント

Slide 82

Slide 82 text

82 kubectl dig: Docker Image FROM sysdig/sysdig:0.26.4 RUN set -eux \ && apt update \ && apt --fix-broken install -y \ && apt install -y build-essential apt-transport-https libcap-ng-utils \ && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD \ && echo "deb https://repo.iovisor.org/apt/xenial xenial main" | tee /etc/apt/sources.list.d/iovisor.list \ && apt update \ && apt install -y libtinfo5 bcc-tools libbcc-examples \ procps strace iproute2 net-tools iputils-ping linux-perf \ tcpdump dstat sysstat vim-tiny dnsutils bsdmainutils \ gdb ncat conntrack git unzip zip \ && cd /root && git clone https://github.com/brendangregg/FlameGraph && cd - \ && echo ENABLED="true" > /etc/default/sysstat ENV PATH /usr/share/bcc/tools:$PATH CMD ["bash"] ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。

Slide 83

Slide 83 text

83 kubectl dig: Kubernetes YAML apiVersion: v1 kind: Pod metadata: name: "${dig_pod}" namespace: "${namespace}" spec: hostNetwork: true hostPID: true containers: - name: dig image: ${BCC_IMAGE}:${BCC_TAG} args: - /bin/bash - "-c" - "echo 'digging container now...'; sleep infinity & wait \$!" resources: requests: cpu: 50m memory: 50Mi securityContext: privileged: true env: - name: SYSDIG_BPF_PROBE value: volumeMounts: - mountPath: /host/var/run/docker.sock name: docker-socket - mountPath: /host/dev name: dev-fs - mountPath: /host/proc name: proc-fs readOnly: true - mountPath: /host/boot name: boot-fs readOnly: true - mountPath: /host/lib/modules name: lib-modules readOnly: true - mountPath: /host/usr name: usr-fs readOnly: true - mountPath: /host/etc name: etc-fs readOnly: true - mountPath: /dev/shm name: dshm volumes: - name: dshm emptyDir: medium: Memory - name: docker-socket hostPath: path: /var/run/docker.sock - name: dev-fs hostPath: path: /dev - name: proc-fs hostPath: path: /proc - name: boot-fs hostPath: path: /boot - name: lib-modules hostPath: path: /lib/modules - name: usr-fs hostPath: path: /usr - name: etc-fs hostPath: path: /etc nodeName: ${node} ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。

Slide 84

Slide 84 text

84 kubectl dig/bpftrace メリット・デメリット メリット ● BCC/bpftraceのツールをそれぞれ使うことをできる ● kubectlのPluginなので導入が楽(PATHに入れるだけ) ● BCC/bpftrace以外の調査ツール(gdb, strace, tcpdumpなど)も豊富 ● sysdigコマンドも実行可能 デメリット ● NodeにPodをアタッチするので、Node全体の余分な情報が含まれる ○ BCCのツールでオプションを指定して絞り込む/時には諦める、など工夫が必要 ● BCC/bpftraceの切り替えが面倒! ● 「特定のタイミング/条件だけ発生する」エラーの調査には向いていない ○ エラーが発生するPodにアタッチすることが必要だが、どのPodか特定しないといけない

Slide 85

Slide 85 text

5. Summary

Slide 86

Slide 86 text

86 ● BPF Performance ToolsはLinuxにおける”神の目”を提供してくれる ⇨ カーネルレイヤーのより深い視点を届けてくれる ● BPF Performance Toolsは100を超える多彩なツールを提供 ⇨ 使いこなせればエンジニアリングの心強い武器になる ● 本番環境で動かさない方が良いコマンドもあるので注意 ⇨ 『BPF Performance Tools』18章 参照 ● Kubernetes上で動かすベストプラクティスは模索中! ● BPF Performance ToolsはSingle Purposeのツール ⇨ 事象を切り分けして、Tracingした内容を正しく評価するには Linux カーネルの知識が重要 Summary

Slide 87

Slide 87 text

Appendix

Slide 88

Slide 88 text

88 ● Running eBPF Tools in Minikube ※ virtualboxをオススメします とりあえずBPFを動かしてみたい人向け(1/2) 参考: https://minikube.sigs.k8s.io/docs/tutorials/ebpf_tools_in_minikube/ $ minikube start --driver virtualbox --iso-url \ https://storage.googleapis.com/minikube-performance/minikube.iso $ minikube ssh -- curl -Lo /tmp/kernel-headers-linux-4.19.94.tar.lz4 \ https://storage.googleapis.com/minikube-kernel-headers/kernel-headers-linux -4.19.94.tar.lz4 $ minikube ssh -- sudo mkdir -p /lib/modules/4.19.94/build $ minikube ssh -- sudo tar -I lz4 -C /lib/modules/4.19.94/build -xvf \ /tmp/kernel-headers-linux-4.19.94.tar.lz4 $ minikube ssh -- rm /tmp/kernel-headers-linux-4.19.94.tar.lz4 $ minikube ssh -- docker run --rm --privileged -v /lib/modules:/lib/modules:ro \ -v /usr/src:/usr/src:ro -v /etc/localtime:/etc/localtime:ro \ --workdir /usr/share/bcc/tools zlim/bcc ./execsnoop

Slide 89

Slide 89 text

89 ● Running eBPF Tools in Minikube × Inspektor Gadget とりあえずBPFを動かしてみたい人向け(2/2) 参考: https://github.com/kinvolk/inspektor-gadget $ kubectl krew install gadget $ kubectl gadget deploy | kubectl apply -f - $ kubectl run --image=busybox shell -- sh -c 'while sleep 1 ; do date ; done' $ kubectl gadget execsnoop -n default -l run=shell Node numbers: 0 = minikube NODE PCOMM PID PPID RET ARGS [ 0] date 31603 31588 0 /bin/date [ 0] sleep 31604 31588 0 /bin/sleep 1 [ 0] date 31605 31588 0 /bin/date [ 0] sleep 31606 31588 0 /bin/sleep 1 [ 0] date 31614 31588 0 /bin/date [ 0] sleep 31615 31588 0 /bin/sleep 1

Slide 90

Slide 90 text

90 We are Hiring! ● コロプラでは Kubernetes エンジニアを積極採用中です!! ○ GKE, Cloud Spanner を使ったゲームや基盤の開発 ○ Kubernetes の エコシステムを含めた Cloud Native への取り組み コロプラ 採用 検索 ▼詳しくは https://be-ars.colopl.co.jp/recruit/career/engineer/corporate-business-support/kubernetes.html

Slide 91

Slide 91 text

91 Thank you for listening!!!