Python Webアプリケーションは、2つの同じ仮想マシン(Linux)でCPU負荷が非常に異なります。

Python Webアプリケーションは、2つの同じ仮想マシン(Linux)でCPU負荷が非常に異なります。

AとBという2つの仮想マシンがあります。

両画像ともカーネル4.15.0-66-generic #75-Ubuntu SMP、x64アーチ、1コアIntel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHzを搭載したUbuntu 18.04を特徴とし、Aには2GB RAMがあります。 Bのメモリは4GBです。すべてのアップデートがインストールされました。両方の仮想マシンは同じ仮想化インフラストラクチャにあります。

sshd、postgresqlの両方で実行される注目すべきサービスです。

VM Bでは、Oracle 12 RDBMSが以前にインストールされて削除されました(一部のシステムパラメータを変更して/ sbin / sysctl -aを比較しました)。

どちらの仮想マシンもUbuntu 16.04からUbuntu 18.04にアップグレードされました。

質問は次のとおりです。

virtualenvでPython 3.7を使用する非常に単純なDjango 2 Webアプリケーション(以下のコード)があります。 Webアプリケーションは、localhostでリッスンする組み込みWebサーバーを実行する以外は何もしません。

  • 仮想マシンAでは、WebアプリケーションはCPU使用率が0%の状態で実行されます。
  • VM Bでは、同じWebアプリケーションは引き続きVM B CPUの10〜20%を消費します。 (他のすべてのプロセスは明らかに0%CPUを消費します。)私はtopとhtopを使用しています。

cProfileを使用して、2つの仮想マシンでPython Webアプリケーションをプロファイリングしました。結果は、どちらの場合も、ほぼすべての(> 99%)CPU時間がwaitpidシステムコールに費やされることです(cProfile tottime」値として報告されます)。

/bin/sysctl -aの違いに関して、次の違いは興味深いかもしれません。

  • fs.aio-max-nr=1048576
  • fs.epoll.max_user_watches = 814612
  • fs.filemax=6815744
  • kernel.shmall = 2097152
  • kernel.shmmax = 8589934592
  • カーネルの最大スレッド数 = 31074

どんなアイデアがありますか?ヒント? Linuxの構成に問題があります(Oracleの要件のため) Pythonインタプリタに問題がありますか?私は間違った場所を探していますか?

私はvm Bを破壊して再生成できることを知っていますが、何が起こっているのか理解したいと思います。これは興味深い技術的な質問です。

次のコマンドを使用して、非常に単純なDjango Webアプリケーションが作成されました。

source venv/bin/activate  # venv is a python 3.7.5 virtualenv with Django package
mkdir test
cd test
django-admin startproject mysite
cd mysite
python manage.py runserver

ベストアンサー1

おすすめ記事