[CNDT2020]Linux Observability with BPF Performance Tools

C174e1ef0c746f53d989b1902b4e674e?s=47 go_vargo
September 08, 2020

[CNDT2020]Linux Observability with BPF Performance Tools

C174e1ef0c746f53d989b1902b4e674e?s=128

go_vargo

September 08, 2020
Tweet

Transcript

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

    Tokyo 2020
  2. 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
  3. 3 本講演で目指すこと - トラブルシューティング/パフォーマンスチューニングに有用なBPF Performance Toolsの 効用を理解できること - Linuxカーネルに詳しくない人でも、BPF Toolsを使えるための一助になる

    発表のモチベーション - BPFがなにか? という発表は見るが、どういう風に使っているか? どういう切り口で使っ ていくか? という発表はなかなか見かけないので、BPF利用のきっかけになってほしい - どんどん利用者を増やしたい - BPF Toolsを、日常的に使うLinuxコマンドレベルにまで昇華してほしい 目的
  4. 4 1. BPFとは? / BPF Performance Toolsとは? 2. BCC /

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

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

    Toolsが問題を解く鍵に なるかもしれません。 Linux Analysis top netstat iostat vmstat mpstat free sar pidstat
  7. 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について参考になる資料
  8. 8 • 元々は1992年に開発された(名前通り)「パケットフィルター」用のツール • 現在はパケットフィルター以外の多様な用途(下図参照)に利用される • eBPFという用語もあるが、正式名称としてはBPFのまま BPF(Berkeley Packet Filter)とは?

    BPF Tracing Profile Security Extended Kernel Network
  9. 9 • カーネルレイヤーで、eventのTracingやProfileが可能 • System Call, Perf event, Disk I/O,

    Networkingなどを深掘りできる BPF(Berkeley Packet Filter)とは? BPF Tracing Profile Security Kernel Extension Network 本資料のターゲット
  10. 10 難しくなっていくので、説明を省きます 詳細を知りたい方は 「Linux Observability with BPF」と「BPF Performance Tools」2章 あたりを読みましょう

    BPFの仕組み
  11. 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とは?
  12. 3. BCC / bpftrace

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

    ※ 本資料では提供されているツールの利用が主目的で、 これらのツールを使ったBPFツールの自作方法については触れません BCC / bpftrace
  14. 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
  15. 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
  16. 16 execsnoop: 新しく生成されたプロセスを一覧で表示する 実行例: BCC

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

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

  19. 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
  20. 20 XXXX.bt形式のファイルを実行することも可能(e.g. bpftrace signal.bt) 実行例: bpftrace signal.bt たとえば、左図はsignal.btを使うことで、 シグナルのトレースが可能。 コマンドごとのシグナルをカウントする。

    個人的には、SIGTERMやSIGKILL、 SIGSEGVの発生確認に便利だと感じてます。
  21. 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
  22. 22 BPF Performance Toolsの使いどころ Monitoring Dashboardを眺める サーバーにSSHしてLinuxコマンドで確認 サーバーにSSHしてBPFツールで確認 解決しない場合 解決しない場合(個人的には奥の手)

    top netstat iostat vmstat mpstat free sar pidstat
  23. 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コマンドで使われているイベント
  24. 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
  25. 4. CPU / Memory / Filesystem / Disk / Network

  26. 26 CPU

  27. 27 Linux Traditional Tools CPU Syscall CPU Cache Scheduler Interrupts

    Process Thread top vmstat ps sar pidstat strace perf uptime mpstat sar Entire
  28. 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
  29. 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と時間をまとめる
  30. 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ヒット率をまとめる
  31. 31 runqlat: CPU Run Queueは混んでいる?

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

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

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

  35. 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 <PID>を付ける
  36. 36 profile × FlameGraph nodejsの例 (長すぎるので全景は省略)

  37. 37 Memory

  38. 38 Linux Traditional Tools Memory OOM Physical/ Virtual Allocator Pages/

    Swapping vmstat slabtop top sar free vmstat Entire dmseg top pmap swapon
  39. 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
  40. 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のシュリンク・拡張を測定
  41. 41 BPF Performance Tools(Memory) (2/2) ツール ソース 機能説明 drsnoop bcc

    reclaim eventのトレースとlatencyの表示 swapin bpf book プロセスごとのswap-inを表示 hfaults bpf book プロセスごとにhuge page faultsを表示
  42. 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
  43. 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の有無が分かる 何のプロセスがメモリを求めた結果、 どのプロセスが殺されたも併せて分かる
  44. 44 mmapsnoop: 何がマッピングされている?

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

  46. 46 File System

  47. 47 Linux Traditional Tools File System Syscall VFS Cache strace

    free perf sar Entire df mount
  48. 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
  49. 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をカウント
  50. 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 ヒット統計
  51. 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 ヒットと効率を表示
  52. 52 cachestat: Page Cacheのヒット率は?

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

  54. 54 ext4slower: ext4filesystemは遅くないか?

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

  56. 56 Disk

  57. 57 Linux Traditional Tools Disk BlockDevice Interface Volume Manager Block

    Layer iostat perf sar blktrace
  58. 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
  59. 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をトレース
  60. 60 BPF Performance Tools(Disk) (2/2) ツール ソース 機能説明 iosched bpf

    book I/O schedulerのlatencyをまとめる
  61. 61 biolatency: I/Oは遅くないか?

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

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

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

  65. 65 Network

  66. 66 Linux Traditional Tools Network Queue Socket IP UDP ip

    ss ethtool tc Entire sar TCP Network Device tcpdump ifconfig netstat
  67. 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
  68. 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をまとめる
  69. 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をトレース
  70. 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を表示
  71. 71 BPF Performance Tools(Network) (4/4) ツール ソース 機能説明 ieee80211scan bpf

    book IEEE 802.11 WiFi scanningをトレース
  72. 72 tcplife: TCP通信は遅くなっていないか?

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

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

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

  76. 4. Kubernetes × BPF Performance Tools

  77. 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を活用しています。
  78. 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
  79. 79 ホスト上のあらゆる情報を取得するためのkubectl Plugin Sysdig Inspectと組み合わせることで、複数レイヤの情報を取得可能 kubectl capture 負荷試験環境で取得した実例 リポジトリ: https://github.com/sysdiglabs/kubectl-capture

  80. 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
  81. 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をマウント
  82. 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"] ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。
  83. 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} ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。
  84. 84 kubectl dig/bpftrace メリット・デメリット メリット • BCC/bpftraceのツールをそれぞれ使うことをできる • kubectlのPluginなので導入が楽(PATHに入れるだけ) •

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

  86. 86 • BPF Performance ToolsはLinuxにおける”神の目”を提供してくれる ⇨ カーネルレイヤーのより深い視点を届けてくれる • BPF Performance

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

  88. 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
  89. 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
  90. 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
  91. 91 Thank you for listening!!!