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

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

    bpftrace 3. CPU / Memory / Filesystem / Disk / Network 4. Kubernetes × BPF Performance Tools 5. Summary Agenda
  4. 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について参考になる資料
  5. 9 • カーネルレイヤーで、eventのTracingやProfileが可能 • System Call, Perf event, Disk I/O,

    Networkingなどを深掘りできる BPF(Berkeley Packet Filter)とは? BPF Tracing Profile Security Kernel Extension Network 本資料のターゲット
  6. 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とは?
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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コマンドで使われているイベント
  12. 27 Linux Traditional Tools CPU Syscall CPU Cache Scheduler Interrupts

    Process Thread top vmstat ps sar pidstat strace perf uptime mpstat sar Entire
  13. 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
  14. 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と時間をまとめる
  15. 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ヒット率をまとめる
  16. 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>を付ける
  17. 38 Linux Traditional Tools Memory OOM Physical/ Virtual Allocator Pages/

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

    reclaim eventのトレースとlatencyの表示 swapin bpf book プロセスごとのswap-inを表示 hfaults bpf book プロセスごとにhuge page faultsを表示
  21. 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
  22. 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の有無が分かる 何のプロセスがメモリを求めた結果、 どのプロセスが殺されたも併せて分かる
  23. 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
  24. 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をカウント
  25. 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 ヒット統計
  26. 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 ヒットと効率を表示
  27. 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
  28. 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をトレース
  29. 66 Linux Traditional Tools Network Queue Socket IP UDP ip

    ss ethtool tc Entire sar TCP Network Device tcpdump ifconfig netstat
  30. 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
  31. 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をまとめる
  32. 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をトレース
  33. 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を表示
  34. 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を活用しています。
  35. 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
  36. 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
  37. 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をマウント
  38. 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"] ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。
  39. 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} ※ 情報の提供のみを目的としています。実施する場合は必ずご自身の責任と判断によって行ってください。 一切の動作保証はしておらず、いかなる責任も負いません。
  40. 84 kubectl dig/bpftrace メリット・デメリット メリット • BCC/bpftraceのツールをそれぞれ使うことをできる • kubectlのPluginなので導入が楽(PATHに入れるだけ) •

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

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