# 2021年/雨水(後) Transtracerのジャーナル論文執筆,eBPFなど
Created: March 1, 2021 7:35 AM
Research: transtracer
Tags: ebpf
Week: March 1, 2021 → March 7, 2021
Mackerelチームで,スクラム開発の2週間単位のスプリント名に,二十四節気を使っていたのを思い出して,○月△週って書くのやめて,節気名にしてみた.季節を感じられてよい.ただし,この日誌は1週単位なので前後半にわけないといけない.
> 雨水(うすい)とは、降る雪が雨へと変わり、雪解けが始まる頃のこと。山に積もった雪もゆっくりと解け出し、田畑を潤します。昔から、雨水は農耕を始める時期の目安とされてきました。
[*https://www.543life.com/season/usui*](https://www.543life.com/season/usui)
確かに,雨の日が多かった気がする.
# Research
## Transtracerの研究
ジャーナル論文の続きをやっている。実験結果をグラフ化して考察を書けばほぼ終わり。そろそろ英語化をはじめたいところ。別ネタの国際会議の論文がすぐあとに控えてるので、今やってる論文を英文でだすか和文のままでだすか悩ましい。
### BPF Ringbuf
既存手法の実装(Weave Scopeと同じ方式)のトレーサープロセスのCPU負荷の計測値が不安定な問題にあたった.BPF ring bufferを使っているのだけど,submit時のフラグにポーリング頻度を自動適応モードを設定しているので,それが悪いのかも知れない... ringbuf_reserveに失敗・無視してイベントをロストしているのかとも思ったけど,違った.
ちなみに,bpf_ringbuf_outputも内部ではreserve/commitやっている.reserveが失敗したかどうかはEAGAINが返ってきたかどうかでわかる. [elixir.bootlin.com/linux/v5.8.18/…](http://elixir.bootlin.com/linux/v5.8.18/%E2%80%A6)
bpf ring bufferのsubmitのオプションをデフォルトにしていると,ユーザランド側のpolling時にイベント数が多くても2,3個のイベントを取得して,busy loopになる.pollしたあとにユーザ側でsleepしてCPU負荷を調整していた.
[https://twitter.com/juliusvolz/status/1264930746529132545](https://twitter.com/juliusvolz/status/1264930746529132545)
カーネルの中で集約してからデータを取り出すので,固定インターバルでデータをとることになる.実際は1秒間隔でとっていて,それでリアルタイム性が十分なのかを言いたい.
PrometheusのUser Survey 2020があることを思い出して,簡単に分析をしていた.
```jsx
=QUERY(I2:I211, "select I, count(I) group by I order by count(I) DESC", -1)
count
15 70
30 52
60 28
10 23
20 6
5 5
1 1
3 1
45 1
120 1
300 1
15967 1
```
15秒間隔を採用している利用者が最大で,次点で30秒.ほとんど5-60秒の間に収まる.15967はよくわからない.
### SysdigのKubernrtesのトポロジマップ
[Microservices Monitoring | Sysdig](https://sysdig.com/use-cases/microservices-monitoring/)
[Kubernetes and container topology mapping](https://www.youtube.com/watch?v=7BZWkaqQWlc)
- システムコールレベルで追跡
- レスポンスタイム、ネットワークトラフィック、リソース利用率などのメトリクスを提供
またOSレベルでのネットワークトレーシングツールを見つけてしまった.sysdig-agentはOSSではなさそうなので,ホスト上でどのようにトレースしているかはわからない.
### Droot + bcc
コンテナでエージェントプロセスを動かすのであれば,あまり依存を気にしなくて良いので,llvm/clangに依存するbccでもいいかと思っていたけど,コンテナ以前のVM運用のときには,あまり依存を増やしたくないはず.Drootでchroot環境内にbccのエージェントを閉じ込めて動かすための起動/停止スクリプトでも用意しておけばいいかもしれない.eBPFに対応していない古いカーネルは,Shawkのprocfs+netlinkモードで動かす.
### BPF SOCKHASH
[gRPCをeBPFで動かすこの記事](https://medium.com/nttlabs/grpc-in-ebpf-10a930d0d329)で,eBPFのsockhashと呼ばれる機能があることを知った.
> eBPFのsockhashという機能を使うことで、TCP/UDPソケットにデータが届いた際に、ユーザコードを実行することができます。ユーザコードは、受信したパケットの中身にアクセスし、必要に応じて変更して、送信することなどができます。
要はソケットバッファに対する送受信メッセージ単位でコードをフックできるらしい.Ciliumでもおそらく使われている.もしかするとトレーシングにも使えるかもしれない.
[Introduction - Cilium 1.8.7 documentation](https://docs.cilium.io/en/v1.8/concepts/ebpf/intro/#introduction)
### BPF Performance Tools輪読会
BPF Performance Toolsの輪読会に参加しはじめた.BPF Performance Toolsのカジュアルな輪読会に途中から参加することになったので,追いつくために,序盤からちゃんと読み始めた.Linuxの動的トレーシングの歴史とか,各イベントソースの動作原理が完結にまとめられていて,さっさと読んどけばよかったと思った.2章で各イベントソース(kprobes,uprobes,Tracepoints,Raw Tracepoints,USDT,Dynamic USDTなどの説明はあとで見返す.あとは,BCCをすっとばしていきなりCO-REをやってたので,BCCのtrace(8)とかargdist(8)を知らなかった.
輪読会は,6.1.2 BPF capabilitiesから.
CPUトレーシングのオーバヘッド
- コンテキストスイッチごととかは大変 秒間数百万回とかになる.最悪ケースで10%のオーバヘッド追加
CPU解析のストラテジ
- 解析手順の6番目にいきなりハード割り込みの時間を測定しようとでてきて,ここで登場する理由ははっきりわからなかったが,Gregg先生の経験が反映されていそうだった。
FrameGraphってあんまり使ってないよねって話をした矢先に、GoのpprofでFrameGraphをみるのがわかりやすいケースに遭遇した.
![[ScreenShot_2021-03-04_at_11.00.03.png]]
![[ScreenShot_2021-03-04_at_10.59.54.png]]
## AISREの研究(AIOps)
Chaos Engineeringでは,仮説に基づいて,故障を注入し,振る舞いを検証する.今はいかに継続的に故障を注入するかやSteady Stateの設計段階ではないか.故障を注入できるようになってきたら,検証のための分析に注目するようになるはず.故障注入(FIT)をトリガーにして,TSifterにより,直近で動きのあるメトリックを集めたダッシュボードを自動生成する研究を考えている.
### 国際会議候補
6,7月締め切りでクラウドかネットワーク系でCORE rank B相当の国際会議候補を探している.Full paper以外にShort paperがあるとなお良い.
[CNSM 2021 - 17th International Conference on Network and Service Management](http://www.cnsm-conf.org/2021/)
Izmir, Turkey // 25-29 October 2021
Paper Submission Deadline: 28 May 2021
# Clips
### DCネットワークのBGP
[BGP in the Data Centerを読みました (1/6) : Chapter 1 - Introduction to Data Center Networks - baron tech blog](https://foobaron.hatenablog.com/entry/bgp-in-the-data-center-01)
OSPFはIPv4, IPv6, MPLS, VPNなどのマルチプロトコルサポートがない ⇒ 実装の成熟度も鑑みてBGPを選択.RFC7938にDC内のBGPルーティングが記載されている.こういうのもRFCに書かれるのか.
[RFC 7938 - Use of BGP for Routing in Large-Scale Data Centers](https://tools.ietf.org/html/rfc7938)
### libbpf
[[PUBLIC] Libbpf: the road to v1.0](https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY/edit?usp=drivesdk)
libbpfのv1.0までのロードマップがでていた.
### uprobeの改善
[https://events.static.linuxfound.org/images/stories/pdf/eeus2012_desnoyers.pdf](https://events.static.linuxfound.org/images/stories/pdf/eeus2012_desnoyers.pdf)
### OpenTelemetry Metrics
[OpenTelemetry Metrics Roadmap](https://medium.com/opentelemetry/opentelemetry-metrics-roadmap-f4276fd070cf)
penTelemetryのメトリクスのロードマップがでていた.メトリックと,ログ・トレースとの接続,OpenCensusからの移行,既存のインフラであるPrometheusとStatsDのサポートなど.
### Istioのレイテンシオーバヘッド
[Best Practices: Benchmarking Service Mesh Performance](https://istio.io/latest/blog/2019/performance-best-practices/)
> At 1000 requests per second (RPS), across 16 connections, Istio adds 3 milliseconds per request in the 50th percentile, and 10 milliseconds in the 99th percentile.
Istio 1.2ではsidecar proxyのレイテンシオーバヘッドは,16接続,1,000 RPSで,50%tileが3ms,99%tileが10ms.もちろん,リクエスト経路の遷移が深くなるほど,オーバヘッドは積み重なる.
[Performance and Scalability](https://istio.io/latest/docs/ops/deployment/performance-and-scalability/)
こちらは,1.9.1の話.90%tileが2.65 ms.
### IOT52 研究会
[2020年度第4回(IOT通算第52回)研究会プログラム](https://www.iot.ipsj.or.jp/meeting/52-program/)
**マイクロサービス型システムの監視におけるグラフDB採用によるメトリック問い合わせ最適化の検討**
共同研究先の学生さんの発表を聴いていた.グラフDBにメトリックと依存関係データを格納して,同時に取得することで問い合わせ速度を向上させる.
### Productivityの計測
[Pull Requestから社内全チームの開発パフォーマンス指標を可視化し、開発チーム改善に活かそう - Hatena Developer Blog](https://developer.hatenastaff.com/entry/2021/03/04/093000)
LeanとDevOpsの科学にかかれている指標のうち、変更のリードタイムとデプロイの頻度をトラッキングする話.
### はてなインターン
[https://twitter.com/hitode909/status/1367745459326885890](https://twitter.com/hitode909/status/1367745459326885890)
まったく実感がないが,今は学生なので小芝居をした.はてなインターンに参加したのはもう10年前になるなあ.