python Web 应用程序在两个相同的虚拟机 (Linux) 上具有非常不同的 cpu 负载

python Web 应用程序在两个相同的虚拟机 (Linux) 上具有非常不同的 cpu 负载

我有两个虚拟机,分别称为 A 和 B。

两个映像均采用 Ubuntu 18.04,内核为 4.15.0-66-generic #75-Ubuntu SMP、x64 arch、1 核 Intel(R) Xeon(R) CPU E5-2660 v2 @ 2.20GHz; A 具有 2 GB 内存,而 B 具有 4 GB 内存。所有更新均已安装。两个虚拟机都位于同一虚拟化基础架构上。

两者上运行的值得注意的服务:sshd、postgresql。

在虚拟机 B 上,之前安装了 Oracle 12 RDBMS,然后将其删除(修改了一些系统参数,我对 /sbin/sysctl -a 进行了比较)。

两台虚拟机均已从 Ubuntu 16.04 升级到 Ubuntu 18.04。

问题如下:

我有一个非常简单的 Django 2 Web 应用程序(代码如下),在 virtualenv 中使用 python 3.7;除了运行在本地主机上侦听的嵌入式 Web 服务器之外,Web 应用程序不执行任何操作。

  • 在虚拟机 A 上,Web 应用程序以 0% CPU 使用率执行
  • 在 VM B 上,相同的 Web 应用程序在 vm B 上持续消耗 10% 到 20% 的 CPU。(所有其他进程显然消耗 0% CPU)。我正在使用 top 和 htop。

我已经使用 cProfile 来分析两个虚拟机上的 python Web 应用程序:结果是,在这两种情况下,几乎所有(> 99%)的 cpu 时间都花在 waitpid 系统调用上(根据 cProfile 报告的“tottime”值) )。

关于 /bin/sysctl -a 的差异,这些差异可能(或可能不)令人感兴趣:

  • fs.aio-最大-nr = 1048576
  • fs.epoll.max_user_watches = 814612
  • fs.文件最大值 = 6815744
  • 内核.shmall = 2097152
  • 内核.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

相关内容