Tool for Troubleshooting Problems in Serverless Scenarios

背景紹介

完全にホストされたサーバーレスコンピューティングプラットフォームは、ユーザーにより低い運用保守コスト、より強力な安定性、そしてより迅速な柔軟性をもたらします。サーバーレスの実装において、主要な課題の 1 つは、サーバーレスプラットフォームが開発者に十分なセキュリティをどのように提供するかです。開発者が負担なくサーバーレスを使用し、信頼できるようにすることが私たちの目標です。

完全ホスティングの本来の目的は、開発者の使用と運用保守の複雑さを軽減することですが、これはある程度、ユーザー自身のサービスに対する制御力を低下させます。たとえば、多くのシナリオで、ユーザーは自分のアプリケーションの実際の動作をどのように把握するか知りたい場合があります。アプリケーションの問題かクラウドプラットフォームの問題かをどのように迅速に特定できるか?クラウドプラットフォームの問題である場合、サービスを迅速に復旧し、タイムリーに損失を停止するにはどうすればよいか?これらの問題の根本的な原因は、ユーザーがクラウドプラットフォームを完全に信頼できないことであり、これがアプリケーションの移行とビジネスシナリオの拡大を妨げています。したがって、私たちはこの不信の状況を打破し、ユーザーがリソースレベルでより多くの制御を持つことができ、同時にリソースレベルの複雑な運用保守から解放される方法を考えています。

このような背景と需要の下、Alibaba Cloud の機能コンピューティングの革新により、サーバーレスシナリオで関数インスタンスのコマンドライン操作機能が導入されました。コンソールインターフェースから関数インスタンスにログインしたり、ツールを使用してインスタンス上で指定されたコマンドを実行したりできるようになりました。この記事では、この機能の使用方法とシナリオについて詳しく説明します。

インスタンスコマンドライン操作機能の位置づけと使用法

インスタンスコマンドライン操作機能は、K8S Pod Exec および Docker Container Exec と一貫した使用体験を提供し、関数インスタンスの実際の動作環境で特定のコマンドを実行できます。

同時に、サーバーレスの極めて柔軟な従量課金特性により、サーバーレスシナリオのインスタンス InstanceExec 機能は K8S や Docker と本質的に異なります。

1. InstanceExec 操作は、存続しているインスタンス(リザーブドインスタンスおよびオンデマンドアクティブインスタンスを含む)に対してのみ実行できます。オンデマンドインスタンスがアイドルタイムアウトでリリースされた場合、再度実行することはできません。

2. InstanceExec リクエストはインスタンスの同時実行数を消費しません。したがって、関数のインスタンス同時実行数が 1 に設定されている場合でも、InvokeFunction と InstanceExec 操作の両方を同時に実行できます。

3. InstanceExec の操作は InvokeFunction リクエスト呼び出しとして扱われます。InstanceExec リクエストによって確立された WebSocket 接続が関数インスタンスから切断されない限り、関数インスタンスは常にアクティブな状態を維持し、InvokeFunction と同じ課金ルールが適用されます。ユーザーは InstanceExec の idleTimeout パラメーターを設定して、指定されたアイドル時間後にクライアントを積極的に切断できます。

インスタンスコマンドライン操作機能は、コンソールでのインスタンスへのログイン、Serverless Dev ツールを使用したコマンド実行、または SDK 呼び出しインターフェースを使用したコマンド実行をサポートしています。

コンソールからのインスタンスログイン

Function Compute の公式ウェブサイトのコンソールで、関数の詳細 - モニタリング指標 - インスタンス指標ページで、右端からインスタンスにログインできます。

「インスタンスにログイン」をクリックすると、ターミナルインターフェースが表示されます。すぐにインスタンスにログインしてコマンドを実行し、問題をトラブルシューティングできます。

関数の詳細 - モニタリング指標 - インスタンス指標ページで、インスタンス ID をクリックして関数のインスタンス詳細ページに入ります。インターフェースの右上にインスタンスログインボタンがあります。クリックしてインスタンスに入ります。

SDK 呼び出し

Golang SDK を例にとると、他の SDK の呼び出し方法もほぼ同様です。

SDK は InstanceExec API をカプ化しています。インターフェースを呼び出す際、OnStdout と OnStderr を使用して 2 つのコールバック関数を渡す必要があります。コールバック関数は Exec チャネルから返されるデータを処理する具体的なロジックを定義します。同時に、返された execConn を使用して stdin メッセージを入力し、リモート Exec チャネルに送信できます。

適用シナリオ

1. オンライン問題のトラブルシューティング

日常的なシナリオでは、インスタンスコマンドライン操作は、ユーザーの習慣により一致した、より効率的で便利なトラブルシューティング方法を提供します。

ユーザーの王さんはサーバーレスの初心者ユーザーです。プログラムを書いて Function Compute にデプロイした後、関数で設定された環境変数が有効になっていないことに気づきました。さらにトラブルシューティングするには、コードを変更し、ログを出力し、再デプロイし、ログを確認するというような面倒なトラブルシューティング方法が必要です。現在、インスタンスコマンドライン操作を活用して、王さんは直接コマンド 1 つで問題を特定できます:s exec {instance_id} ENV

インスタンスコマンドライン操作は、複雑なシナリオでユーザーがアプリケーション問題を解決するのに役立つ便利なログイン体験を提供します。場合によっては、関数ログとモニタリング指標を通じて具体的に問題を特定できず、coredump、tcpdump、jmap などのツールを使用した深入りしたトラブルシューティングが必要です。

たとえば、ユーザーの李さんは、オンラインプログラムが最近いくつかの機能エラーを起こし、リモートサービスへの接続がタイムアウトしたというエラーが報告されたことに気づきました。李さんは、関数インスタンスとリモートサービス間のネットワークリンクが不安定ではないかと疑っています。インスタンス内に入って、インスタンスとリモートサービス間のネットワーク状況を調査・分析したいと考えています。次の手順に従います:

• 内部インスタンスにログインした後、まず tcpdump ツールをインストールします。apt-get update と apt-get install tcpdump の 2 つのコマンドを実行する必要があります:

インストール後、tcpdump コマンドを実行してリモートサービス IP リクエストのパケットをキャプチャし、キャプチャ結果を tcpdump.cap ファイルに保存します:

パケットをキャプチャした後、OSS コマンドラインツール ossutil64 を使用して tcpdump.cap ファイルを自分の OSS にアップロードし、ローカルにダウンロードします。分析ツール wireshark を使用して分析できます。

2. プログラムのパフォーマンス最適化

多くの場合、開発者はさまざまなプロファイリングツールを使用してパフォーマンス、リソース使用量などの問題を分析する必要があります。たとえば、CPU やメモリなどのアプリケーションインスタンスのリソース利用率が期待通りではない、アプリケーションパフォーマンスが期待より低い、プロファイリングツールを通じてボトルネックが見つかるなどです。インスタンスコマンドライン操作を通じて、開発者は言語やフレームワークが提供するさまざまなプロファイリングツールを簡単に実行し、プログラムパフォーマンスとリソース使用量を最適化できます。

Function Compute で実行されている Gaode の自動運転を例にとると、ピーク時の TPS は数十万レベルに達します。リアルタイムオンラインアプリケーションとして、サービスは数十ミリ秒のリクエスト遅延を許容できます。コスト圧力を考慮して、オンライン前に、単一インスタンスが耐えられる最大 TPS と対応する呼び出し遅延を測定し、必要なインスタンス数を評価することを期待しています。

しかし、負荷テストで、Gaode は単一インスタンスの平均/ロングテール遅延が期待通りではないことを発見しました。単一インスタンスの TPS が 300 TPS に達すると、リクエスト遅延が線形に上昇します。アプリケーションにパフォーマンスボトルネックがあるのか、それとも Function Compute ランタイムのパフォーマンスに問題があるのかを特定したいと考えています。インスタンスコマンドライン操作を活用して、インスタンス内部にログインできます。プロファイリングを通じて深入り分析した後、パフォーマンス問題を発見し、最終的にプログラムパフォーマンスを最適化してオンライン基準を満たしました。

カスタムランタイムを例にとります:デモサンプルプログラムは Golang を使用して記述され、Function Compute にデプロイされます。

• インスタンスにログインした後、Golang インストールパッケージをダウンロードします:

• go を展開してインストールします:

• go tool pprof コマンドを実行し、分析ファイルを生成します:

/root/pprof/pprof.bootstrap.samples.cpu.001.pb.gz

• 最後に、OSS コマンドラインツール ossutil64 を使用して、ossutil64 cp コマンドで分析ファイルを自分の OSS バケットにアップロードし、ユーザーのローカルにダウンロードして視覚的に分析します。

まとめ

インスタンスコマンドライン機能の導入により、ユーザーがサーバーレスを使用する際の「ラストマイル」を排除し、実際の関数動作環境をユーザーに直接提示できることを期待しています。これにより、サーバーレスはもはや「ブラックボックス」ではなくなり、ユーザーはより信頼してサーバーレスプラットフォームに依存し、より多くのビジネスシナリオと規模を拡大できます。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.