こんにちは!プロジェクトマネージャーとしてNetwork Performance Monitoringプロジェクトを遂行する過程で得た経験について、振り返って見たいと思います。1年にわたり、本プロジェクトを通じて数多くの挑戦と協業を経験し、弊グループが技術問題をどのように解決して製品リリースに成功したのかをご紹介したいと思います。
プロジェクト初期、私たちはNetwork Performance MonitoringにeBPF技術を導入することを決定しました。eBPFはExtended Berkeley Packet Filterの略で、Linuxカーネル内で実行されるプロジェクトを通じてネットワークイベントをキャプチャ・分析できる強力なツールです。eBPFを適用すると、性能測定において高い正確性と効率性を得ることができます。
eBPFを具現化するフレキシブルなアプリケーション言語として、Golangを選択しました。モニタリングエージェントは、データ収集・送信において消費サーバー資源を最少に保つ必要があります。また、単一実行ファイルとして作成できるため、インストール時にも複雑度を下げることができます。eBPFのコードはC言語で作成しなければなりませんが、GolangはCコードを呼び出せるCGO(C Go)パッケージを提供します。eBPFコードを作成してコンパイルした後、Golangで呼び出せるよう準備を整えます。
// example.bpf.c#include <linux/bpf.h>SEC("kprobe/sys_connect")int kprobe__sys_connect(struct pt_regs *ctx) {// eBPF コード作成return 0;}
Golangでは、CGOを利用してeBPFコードをロードできます。必要なヘッダファイルを含み、eBPFコードをGolang関数でパックして使用します。
// main.gopackage main/*#cgo CFLAGS: -I/usr/include#include "example.bpf.c"*/import "C"func main() {// eBPF コードのロードと実行C.kprobe__sys_connect(nil)}
Golangでは、eBPFを使用してネットワークデータをキャプチャ・分析できます。必要に応じてデータを加工し、性能指標を抽出してモニタリングダッシュボードに表示できます。
eBPFを活用してTCP/UDPセッションの性能を測定・収集する作業は、プロジェクトで中核的役割を果たしました。セッションの性能では、帯域幅に該当する秒ごとのバイト数とパケット、安定性を表すjitter、latency、接続数を指標としました。
jitter、latencyは接続の安定性を表す情報で、パケットがサーバーとクライアントを往復する時間と時間の揺らぎの加重平均です。jitter、latencyが悪化すると、ビデオ会議などセッション基盤のサーバーおよびクライアントのリアルタイム作動に影響を及ぼします。また、帯域幅の使用量を観測することで、アプリケーションが設計負荷範囲で作動しているのかを確認し、長期的な増設計画を立てることができます。
また、セキュリティ機能や管理機能を担当するプロセスによって発生するトラフィックも透明性を保って観測され、サービスネットワークと管理ネットワークが分けられていない環境でも、セッションの負荷を個別に観測できました。開発過程でWhaTapのネットワーク使用量を観測した時、分散ネットワークが設計通りに作動しているのを目で確認でき、とても嬉しかったです。
本プロジェクトの主な目標のひとつは、アプリケーション観点で接続性能を徹底的に分析することでした。特に、retransmissionなどの問題発生時に、このイシューがアプリケーションに及ぼす影響を直接比較・分析することができました。接続の安定性と性能を測定する過程で、どういった影響が発生するのかに対する洞察を得ることができました。ユーザーが実際に感じる問題と接続性能との相関関係を交差検証する方法を学びました。トランザクション、CPU、メモリに対するモニタリングは日常的に行割れる反面、ネットワークの接続性能は把握できませんでしたが、WhaTapネットワークにも製品を適用してみて、接続数と帯域幅、特にretransmissionの発生頻度を確認することができました。これをもとに、内部ネットワークの品質と外部API連携時の同時処理性能に対するニーズを理解して、改善に必要な洞察を得ることができました。
製品を作る過程で、リアルタイム接続情報を人が理解できるデータに単純化し、性能情報を伝えることに集中しました。開発者は、設計されたトラフィックの流入経路に合わせて開発を進めるため、実際の環境での負荷分散、内部・外部ネットワークが同時に存在する常用環境におけるアプリケーションの性能影響に対する理解は漠然としています。実際の環境で作動するネットワークの品質と負荷を開発者が理解できるよう単純化・可視化に取り組み、トポロジーを開発しました。ネットワークに対する背景知識がないスタッフも、トポロジーを見て容易にコミュニケーションを交わすことができました。重要な接続に対しては、エッジ(トポロジーのノード間の接続)を強調する機能を加えて、情報伝達性の向上に努めました。
製品販売のための悩み
顧客に製品を紹介するときのセールスポイントを設定するため、PMと開発者は顧客とのプリセールスロールプレイングを実行しました。製品プレゼンテーションとストーリーテリングに対するバーチャルエクスペリエンスを通じて、アジャイル開発サイクルにおける改善点を何度も導出する過程で、顧客に伝えるべきポイントを把握することができました。特に、ネットワーク非専門家と想定して製品を作るため、予算確保段階から顧客に伝えるメッセージが重要であると設定し、機能がメッセージとメッセージに符合するよう努力しました。セールスおよびマーケティング担当者の悩みを多少なりとも実感できました。
私たちは、本プロジェクトで新しい技術であるeBPFを活用して、接続性能を効果的に分析する方法について学び、適用してみました。まず、eBPF導入を通じて、性能測定において高い正確性と効率性を達成できました。Golangを活用してeBPFコードをフレキシブルに具現化することで、モニタリングエージェントの性能を最適化し、単一実行ファイルで手軽にインストールできるメリットを活用しました。
プロジェクトでは、TCP/UDPセッションの性能測定を主に取り扱い、帯域幅、秒ごとのバイト数とパケット、そしてjitter、latencyを通じた安定性状態指標を収集しました。これを通じてセッションの安定性を高め、リアルタイムサービスに影響を及ぼす遅延と揺らぎを最小限に抑えることができました。
アプリケーションの観点で見た接続性能分析は、特に重要な課題でした。Retransmissionなどの問題発生時に、その影響をユーザーエクスペリエンスとして直接比較・分析する方法を習得しました。また、ネットワーク接続性能に対する可視化を通じて、開発者も非専門家も理解し易い情報を提供することができました。
最後に、製品販売に悩む過程で、顧客とのコミュニケーションにおいて重要なポイントを発見しました。プリセールスロールプレイングを通じて製品の強みを浮き彫りにし、アジャイル開発で改善を繰り返しながら、見逃しやすいセールスポイントを把握する機会を得られました。
NPM製品の開発を決定してから実際に製品をリリースするまで、多くの方々よりお力添えをいただきました。Network Performance Monitoringプロジェクトにご尽力いただき、ありがとうございます。本プロジェクトを通じて、私たちは技術的挑戦と協業がいかにして製品開発の成功につながるかについて学び、さまざまな経験を積むことができました。今後も、さらなる挑戦と達成が待っているでしょう。力を合わせて共に歩んでいきましょう!ありがとうございます。