
背景を説明すると:
同じアプリを実行するサーバー環境が 2 つあります。1 つ目は、多くの制限がある標準の Google App Engine 環境ですが、これは廃止するつもりです。2 つ目は、Gunicorn を使用して Python アプリを実行する Google Kubernetes クラスタです。
同時実行性
最初のサーバーでは、複数のリクエストをアプリに送信でき、アプリは同時にその多くに応答します。両方の環境でアプリに対して 2 つのバッチの同時リクエストを実行します。Google App Engine では、最初のバッチと 2 番目のバッチが同時に応答され、最初のバッチは 2 番目のバッチをブロックしませんでした。
Kubernetes では、サーバーは同時に 6 つしか応答せず、最初のバッチが 2 番目のバッチをブロックします。Gunicorn の同時実行を gevent またはマルチスレッドで実現する方法に関する投稿をいくつか読みましたが、それらすべてで CPU コアが必要であると書かれていますが、問題は、CPU をどれだけ投入しても制限が続くことです。Google ノードを 1VCPU から 8VCPU まで試しましたが、あまり変化はありません。
私が見逃している可能性のあるものについて、何かアイデアをいただけませんか? Google Cluster ノードの制限でしょうか?
Kubernetes レスポンス ウォーターフォール
お気づきのように、2 番目のバッチは最初のバッチが終了し始めてから応答が開始されました。
App Engine レスポンス ウォーターフォール
Gunicorn の構成
推奨設定である 2 コア + 1 と 12 スレッドの標準クラスの両方を試しました。
gevent も試してみました--worker-connections 2000
。
どれも違いはありませんでした。応答時間は非常に似ていました。
私の Kubernetes ファイル コンテナ セクション:
spec:
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
containers:
- name: python-gunicorn
image: gcr.io/project-name/webapp:1.0
command:
- /env/bin/gunicorn
- --bind
- 0.0.0.0:8000
- main:app
- --chdir
- /deploy/app
#- --error-logfile
#- "-"
- --timeout
- "7200"
- -w
- "3"
- --threads
- "8"
#- -k
#- gevent
#- --worker-connections
#- "2000"
答え1
Community Wiki
コミュニティの可視性を高めるためにこれを投稿します。
残念ながら、このシナリオを正確に再現するためのすべての情報 (アプリケーションの設計、テストの実行方法、環境など) が揃っていません。ただし、OP のコメントに基づくと、次のようになります。
Kubernetes では、マルチタスクはポッド レベルで実行されます。多数のスレッドを持つ 1 つの大きなポッドではなく、多数の小さなポッドを実行できます。このスイッチを試すことができます。
OPのGKE
クラスターでは、HPAとCPU
クラスターの自動スケーリングで説明した同様の解決策は、App Engine Flex || Kubernetes Engine — ?記事。
言及する価値のある重要なことは、多くの人が依存しているということですスケーリングタイプ。