A와 B라는 두 개의 가상 머신이 있습니다.
두 이미지 모두 커널 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 웹 애플리케이션(아래 코드)이 있습니다. 웹 애플리케이션은 localhost에서 수신 대기하는 내장 웹 서버를 실행하는 것 외에는 아무것도 수행하지 않습니다.
- 가상 머신 A에서 웹 애플리케이션은 CPU 사용량이 0%인 상태로 실행됩니다.
- VM B에서는 동일한 웹 애플리케이션이 계속해서 VM B CPU의 10~20%를 소비합니다. (다른 모든 프로세스는 분명히 0% CPU를 소비합니다.) 나는 top과 htop을 사용하고 있습니다.
cProfile을 사용하여 두 개의 가상 머신에서 Python 웹 애플리케이션을 프로파일링했습니다. 결과는 두 경우 모두 거의 모든(>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 웹 애플리케이션이 생성되었습니다.
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