Slide 1

Slide 1 text

過去事例から⾒るモニタリングの⼤切さ 株式会社サイバーエージェント CIU Development div 
 Nakanishi Kento @whywaita TechFeed Experts Night# 20 #techfeed_live Webパフォーマンス‧チューニング最前線 : 前編 (概要、モニタリング、負荷テスト編)@ 2023/06/07

Slide 2

Slide 2 text

Nakanishi Kento / whywaita • 株式会社サイバーエージェント 2019〜 • 業務: CAグループ向けプライベートクラウド開発 • IaaS の開発 / CIサービス (myshoes) の開発 • ISUCON 8 優勝 (学⽣) • ISUCON 10 運営 (インフラ提供) • 趣味: ポーカー / XREAL Air / ⾃宅インフラ

Slide 3

Slide 3 text

ISUCON本 担当 • Chapter 2  モニタリング • Chapter 9  OSの基礎知識とチューニング 3

Slide 4

Slide 4 text

※発表の前の注意事項 • 数年前に発⽣した事象です • あくまで「こういう事もある」という学び の共有です 4

Slide 5

Slide 5 text

プライベートクラウド? 5

Slide 6

Slide 6 text

プライベートクラウド 6 •社内(CAグループ)向けクラウド基盤 •特徴 •社内の需要に合わせた物理設計 •⼀括購⼊によるコストメリット •安価に計算機資源を利⽤可能

Slide 7

Slide 7 text

Cycloud 7 •Cy(berAgent)cloud •各種サービスの提供 •IaaS / KaaS / PaaS / ML Platform •Cycloud-hosted runner (myshoes)

Slide 8

Slide 8 text

8 https://www.cyberagent.co.jp/news/detail/id= 2 84 8 4

Slide 9

Slide 9 text

9 https://isucon.net/archives/ 55 5 3 3 0 13 .html

Slide 10

Slide 10 text

今回はプライベートクラウド上で 
 発⽣した事案 10

Slide 11

Slide 11 text

11 (トラブルとの)出会い、 突然に。

Slide 12

Slide 12 text

プライベートクラウドで使われる物理サーバ 12 •管理⽤プロセス向けサーバ •OpenStackの管理プロセスなどが動作するサーバ •ハイパーバイザー •ユーザのVMが動作するサーバ •ストレージ向けサーバ

Slide 13

Slide 13 text

プライベートクラウド概要図 13 L 2 Overlay Network (VXLAN on IP CLOS) Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 neutron 
 Container KVM / Container OpenStack 
 Controller 
 Container other 
 Container User 
 Components OpenStack 
 Components Physical 
 Components Storage

Slide 14

Slide 14 text

プライベートクラウド (OpenStack) の展開 14 L 2 Compute Node Compute Node Compute Node k master k 
 k 
 Storage Storage KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 KVM / Container OpenStack 
 other 
 User 
 Components OpenStack 
 Physical 
 我々が提供するのはユーザ向けのVM

Slide 15

Slide 15 text

プライベートクラウド (OpenStack) の展開 15 L 2 Compute Node Compute Node Compute Node k master k 
 k 
 Storage Storage KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 KVM / Container OpenStack 
 other 
 User 
 Components OpenStack 
 Physical 
 VM⽤のストレージは ネットワークごしにマウント

Slide 16

Slide 16 text

プライベートクラウド概要図 16 L 2 Compute Node Compute Node Compute Node k master k 
 Firewall Load 
 KVM / Container Users 
 Users 
 Users 
 nova 
 neutron 
 Container KVM / Container OpenStack 
 Controller 
 Container other 
 Container User 
 OpenStack 
 Components Physical 
 Storage プロセスがたくさんあります!

Slide 17

Slide 17 text

プライベートクラウド概要図 17 L 2 Overlay Network (VXLAN on IP CLOS) Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 neutron 
 Container KVM / Container OpenStack 
 Controller 
 Container other 
 Container User 
 Components OpenStack 
 Components Physical 
 Components Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage

Slide 18

Slide 18 text

プライベートクラウド概要図 18 L 2 Overlay Network (VXLAN on IP CLOS) Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 neutron 
 Container KVM / Container OpenStack 
 Controller 
 Container other 
 Container User 
 Components OpenStack 
 Components Physical 
 Components Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage Compute Node Compute Node Compute Node k 8 s master k 8 s 
 master Firewall Load 
 Blancer Storage nova 
 neutron 
 Container OpenStack 
 Controller 
 Container other 
 Container nova 
 neutron 
 Container OpenStack 
 Controller 
 Container other 
 Container nova 
 neutron 
 Container OpenStack 
 Controller 
 Container other 
 Container nova 
 neutron 
 Container OpenStack 
 Controller 
 Container other 
 Container nova 
 neutron 
 Container OpenStack 
 Controller 
 Container other 
 Container

Slide 19

Slide 19 text

これを解決するために Kubernetesを導⼊ 19

Slide 20

Slide 20 text

20 $ kubectl get nodes | grep ^cn cn0001 Ready cn,node cn0002 Ready cn,node cn0003 Ready cn,node cn0004 Ready cn,node

Slide 21

Slide 21 text

プライベートクラウド概要図 21 L 2 Compute Node Compute Node Compute Node k master k 
 k 
 Storage Storage KVM / Container Users 
 Users 
 Users 
 nova 
 neutron 
 Container KVM / Container OpenStack 
 other 
 User 
 OpenStack 
 Components Physical 
 Components OpenStack⽤のコンポーネントは 
 Podとして管理

Slide 22

Slide 22 text

22 $ kubectl get pod -n openstack -o wide | grep nova-api nova-api-849dff6d5b-68z8h 2/2 Running 0 22d x.x.x.x k8smaster01 nova-api-849dff6d5b-8d95z 2/2 Running 0 22d x.x.x.x k8smaster02 nova-api-849dff6d5b-bp64w 2/2 Running 0 22d x.x.x.x k8smaster03 nova-api-849dff6d5b-cxhwt 2/2 Running 0 22d x.x.x.x k8smaster04 複数ノードに渡るプロセスを ⼀括管理可能!

Slide 23

Slide 23 text

平穏な⽣活を過ごしていたある⽇ 23

Slide 24

Slide 24 text

プライベートクラウドで使われる物理サーバ 24 •管理⽤プロセス向けサーバ •OpenStackの管理プロセスなどが動作するサーバ •ハイパーバイザー •ユーザのVMが動作するサーバ •ストレージ向けサーバ

Slide 25

Slide 25 text

🔥 アラート発⽕ 🔥 25

Slide 26

Slide 26 text

🔥 ハイパーバイザーの 🔥 
 🔥 CPU利⽤率増加 🔥 26

Slide 27

Slide 27 text

CPU利⽤率が⾼いとは? 27

Slide 28

Slide 28 text

CPU利⽤率が⾼いとは? →ISUCON本 9章 (p 243 ) 
 PromQL 100 - avg by (host, cpu) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 28

Slide 29

Slide 29 text

プロセス⼀覧をモニタリング 👀 
 →kubeletのsysが⾼負荷 29

Slide 30

Slide 30 text

go tool pprof で確認 30

Slide 31

Slide 31 text

31

Slide 32

Slide 32 text

32 1番⼤きいところに注⽬

Slide 33

Slide 33 text

33 libcontainer (*Handler).GetStats 
 ↓ fs (*Handler).GetStats ↓ fs (*BlkioGroup).GetStats ↓ fs getBlkioStat ↓ bu fi o (*Scanner).Scan ↓ Poll (*FD).Read ↓ syscall Syscall

Slide 34

Slide 34 text

GetStats ? 34 • Kubernetes (kubelet含)に組み込まれている 
 メトリクス出⼒機能関連の関数だと観測できる • https://kubernetes.io/docs/concepts/cluster-administration/ system-metrics/ • google/cadvisor (の内部処理)を⽤いてメトリクス取得を⾏ってい る • ⼤元は google/cadvisor/manager (*containerData).housekeeping

Slide 35

Slide 35 text

kubeletはどうやってメトリクスを取得しているか 35 • cgroupfs を使ってメトリクスを取得してそう • 今回は /sys/fs/cgroups にマウント • cgroup: コントロールグループ • リソースの割当 / 調整を実現する機能 
  Linux Kernelが提供 • コンテナの状況‧ホストの状況などをメトリクス化

Slide 36

Slide 36 text

cgroupfs周りで調査 🏃 36

Slide 37

Slide 37 text

iovisor/bcc/opensnoop 37 • BPFベースのツール群 (bcc) の1つ • プロセスがopen(2)しているファイルを Traceできる

Slide 38

Slide 38 text

iovisor/bcc/opensnoop 38 https://github.com/iovisor/bcc/blob/ a 078 cbc 7 cfbdcee 8 8 c 9 cf 3 e 2 b 76 c 2 c 8 c 1 51 7 e 47 8 /tools/opensnoop_example.txt より # ./opensnoop PID COMM FD ERR PATH 17326 <...> 7 0 /sys/kernel/debug/tracing/trace_pipe 1576 snmpd 9 0 /proc/net/dev 1576 snmpd 11 0 /proc/net/if_inet6 1576 snmpd 11 0 /proc/sys/net/ipv4/neigh/eth0/retrans_time_ms 1576 snmpd 11 0 /proc/sys/net/ipv6/neigh/eth0/retrans_time_ms 1576 snmpd 11 0 /proc/sys/net/ipv6/conf/eth0/forwarding 1576 snmpd 11 0 /proc/sys/net/ipv6/neigh/eth0/base_reachable_time_ms 1576 snmpd 11 0 /proc/sys/net/ipv4/neigh/lo/retrans_time_ms 1576 snmpd 11 0 /proc/sys/net/ipv6/neigh/lo/retrans_time_ms

Slide 39

Slide 39 text

iovisor/bcc/opensnoop 39 https://github.com/iovisor/bcc/blob/ a 078 cbc 7 cfbdcee 8 8 c 9 cf 3 e 2 b 76 c 2 c 8 c 1 51 7 e 47 8 /tools/opensnoop_example.txt より # ./opensnoop -e -f O_WRONLY -f O_RDWR PID COMM FD ERR FLAGS PATH 28084 clear_console 3 0 00100002 /dev/tty 28084 clear_console -1 13 00100002 /dev/tty0 28084 clear_console -1 13 00100001 /dev/tty0 28084 clear_console -1 13 00100002 /dev/console

Slide 40

Slide 40 text

iovisor/bcc/opensnoop 40 https://github.com/iovisor/bcc/blob/ a 078 cbc 7 cfbdcee 8 8 c 9 cf 3 e 2 b 76 c 2 c 8 c 1 51 7 e 47 8 /tools/opensnoop_example.txt より ./opensnoop -Tp 1956 TIME(s) PID COMM FD ERR PATH 0.000000000 1956 supervise 9 0 supervise/status.new 0.000289999 1956 supervise 9 0 supervise/status.new 1.023068000 1956 supervise 9 0 supervise/status.new 1.023381997 1956 supervise 9 0 supervise/status.new 2.046030000 1956 supervise 9 0 supervise/status.new 2.046363000 1956 supervise 9 0 supervise/status.new

Slide 41

Slide 41 text

調査 41 • opensnoopによりopenファイルが分かっ たので、どのファイルが⼤きいのか調査 
 $ cat snoop.log | awk '{print $8}' | xargs -I%% bash -c "echo %%; time cat %%"

Slide 42

Slide 42 text

発⾒ 42 /sys/fs/cgroup/blkio/blkio.throttle.io_serviced: real 0m3.599s /sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes: real 0m4.455s $ cat /sys/fs/cgroup/blkio/blkio.throttle.io_serviced | wc -l 2071
 "νϣίͨͬ΀Γʂ

Slide 43

Slide 43 text

blkio.throttle.io_serviced とは 43 • Number of bytes transferred to/from the disk by the group. These are further divided by the type of operation - read or write, sync or async. First two fi elds specify the major and minor number of the device, third fi eld speci fi es the operation type and the fourth fi eld speci fi es the number of bytes. • https://github.com/torvalds/linux/blob/a 4 d 7 d 7 011 21 981 e 3 c 3 fe 6 9 ade 3 7 6 fe 9 f 2 6324 1 61 / Documentation/admin-guide/cgroup-v 1 /blkio-controller.rst より引⽤ • ざっくり⾔うと: ディスクとの転送量

Slide 44

Slide 44 text

ディスク 🤔 44

Slide 45

Slide 45 text

[再掲] プライベートクラウド (OpenStack) の展開 45 L 2 Compute Node Compute Node Compute Node k master k 
 k 
 Storage Storage KVM / Container Users 
 VM Users 
 VM Users 
 Service nova 
 KVM / Container OpenStack 
 other 
 User 
 Components OpenStack 
 Physical 
 VM⽤のストレージは ネットワークごしにマウント

Slide 46

Slide 46 text

!!! 46

Slide 47

Slide 47 text

問題発覚 47 • ハイパーバイザはVM起動⽤に多くのディスクが接続さ れている ( /dev/sdca なども頻出) • kubeletはホスト上のメトリクスを無邪気に取得する • ディスクが多い & ネットワーク的要因で cgroup 経由の 
 情報取得がかなり遅延 
 → kubelet の処理時間が⻑くCPU利⽤率の増加!!!! 😇

Slide 48

Slide 48 text

ちなみに 48 Opened this issue on May 3 1 , 20 16 😇 https://github.com/opencontainers/runc/issues/ 8 61

Slide 49

Slide 49 text

まとめ 49 • どんなに著名なOSSでもユーザの使い⽅は様々 • つまり、起きるトラブルも様々 • どんなトラブルが起きるのかを⼈間は予測不可! 問題が起きたときにいち早く気づけるよう、 
 正しくモニタリングしましょう