Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[CNDT2020]Linux Observability with BPF Performance Tools

go_vargo
September 08, 2020

[CNDT2020]Linux Observability with BPF Performance Tools

go_vargo

September 08, 2020
Tweet

More Decks by go_vargo

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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について参考になる資料

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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とは?

    View Slide

  12. 3. BCC / bpftrace

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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コマンドで使われているイベント

    View Slide

  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

    View Slide

  25. 4. CPU / Memory /
    Filesystem / Disk /
    Network

    View Slide

  26. 26
    CPU

    View Slide

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

    View Slide

  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

    View Slide

  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と時間をまとめる

    View Slide

  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ヒット率をまとめる

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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 を付ける

    View Slide

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

    View Slide

  37. 37
    Memory

    View Slide

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

    View Slide

  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

    View Slide

  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のシュリンク・拡張を測定

    View Slide

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

    View Slide

  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

    View Slide

  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の有無が分かる
    何のプロセスがメモリを求めた結果、
    どのプロセスが殺されたも併せて分かる

    View Slide

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

    View Slide

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

    View Slide

  46. 46
    File System

    View Slide

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

    View Slide

  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

    View Slide

  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をカウント

    View Slide

  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 ヒット統計

    View Slide

  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 ヒットと効率を表示

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  56. 56
    Disk

    View Slide

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

    View Slide

  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

    View Slide

  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をトレース

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  65. 65
    Network

    View Slide

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

    View Slide

  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

    View Slide

  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をまとめる

    View Slide

  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をトレース

    View Slide

  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を表示

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  76. 4. Kubernetes
    ×
    BPF Performance Tools

    View Slide

  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を活用しています。

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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をマウント

    View Slide

  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"]
    ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。
    一切の動作保証はしておらず、いかなる責任も負いません。

    View Slide

  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}
    ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。
    一切の動作保証はしておらず、いかなる責任も負いません。

    View Slide

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

    View Slide

  85. 5. Summary

    View Slide

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

    View Slide

  87. Appendix

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  91. 91
    Thank you for listening!!!

    View Slide