programing

웹 서버가 VMware보다 WSL에서 2-3배 느린 이유는 무엇입니까?(동일한 도커 스택)

megabox 2023. 10. 21. 10:18
반응형

웹 서버가 VMware보다 WSL에서 2-3배 느린 이유는 무엇입니까?(동일한 도커 스택)

다음으로 구성된 도커 구성 설정이 있습니다.

  • 워드프레스: php8.1
  • mariadb:
  • traefik:v2.7

Windows 네트워킹 차이를 배제하기 위해 내부에서 실행되는 벤치마크는 다음과 같습니다.

curl --resolve example.com:443:172.18.0.3 --write-out '%{time_total}\n' --output /dev/null https://example.com

example.com 이 사용자 지정 도메인인 경우 IP는 traefik 컨테이너의 현재 IP입니다.SSH를 VMware에 입력하고 PowerShell에서 입력하는 명령을 실행합니다.wsl를 한 으로 복사했습니다 도커로 프로젝트를 한 곳에서 다른 곳으로 복사했습니다(휴대성을 위해 도커로 쿠도스).

지속적으로 VMware 지원 인스턴스의 경우 ~0.2초를 반환하고 WSL의 경우 0.4~0.6초를 반환합니다.performant WP 사이트의 HTML 소스를 포함하는 index.php 자체의 로드를 나타냅니다. plugin 없이 핸드코드된 테마를 사용합니다.지역적으로, 정적 버전은 두 시스템 모두에서 10ms 미만의 측정 가능한 차이 또는 매우 미미한 차이가 없는 것으로 보입니다.

나머지 구성:

  • Windows 1122H2 22610.1, WSL 2, VMware 16.1.0 build-17198959, Docker는 동일한 방식으로 설치하고 Docker Desktop은 설치하지 않았습니다.
  • UFW 꺼짐.
  • vmdk 및 vhdx 파일이 동일한 SSD에 있습니다.
  • 파일 시스템 간에 /mnt 파일을 사용하지 않음: 모든 것이 각각 각 시스템의 홈 폴더 아래에 있습니다.
  • OS는 WSL에서는 Ubuntu 20.04.4 LTS, VMware에서는 Ubuntu 21.10입니다.WSL과 WM웨어에서도 우분투 22.04 LTS를 사용해 보았습니다. 같은 번호입니다.
  • WSL에서는 Nginx + PHP-FPM 변형 WP를 사용해 보았고 VMware에서는 OpenLiteSpeed를 사용해 보았지만 수치를 변경하는 것은 없었습니다.
  • 내가 아는 유일한 차이점은 내가 해야만 했다는 것입니다.sudo update-alternatives --config iptables선택합니다./usr/sbin/iptables-legacy도커를 WSL에서 작동시키기 위해 WM웨어에서는 할 필요가 없었습니다.

내 대답에 대한 몇 가지 주의 사항:

  • 당신에게 해결책이 있었으면 좋겠지만, 당신의 주된 질문은 왜 그러냐는 것이고, 이것은 답이 되어야 합니다.그리고 아마도 여기 있는 데이터가 우리를 솔루션으로 이끄는 데 도움이 될 것입니다.
  • 제가 이 일에 대해 틀렸으면 좋겠고, 그럴 수도 있습니다.WSL2 공연이 "원주민에 가깝다"는 일화는 항상 들어왔습니다.그러나 귀하의 경험과 아래의 벤치마킹이 결합되어 저는 그것이 사실이 아닐 수도 있다고 믿게 되었습니다.

그렇기는 하지만, 제가 조사하면서 생각해낸 자료를 보고하도록 하겠습니다.

간단히 요약하면 -- 제가 벤치마킹한 결과 Hyper-V와 VMWare 사이에 상당한 디스크 IO와 메모리 성능 델타가 나타나 WordPress 결과를 설명할 수 있을 것 같습니다.

데이터 및 연구 지원

저는 당신의 것과 비슷한 테스트 시나리오로 시작했지만, 가능한 한 많은 MRE로 줄이려고 했습니다.

배열

하드웨어:

  • i9500
  • RAM 16GB
  • SSD
  • WSL2를 사용하도록 설정한 Windows 11 Pro의 최신/최근 설치
  • VMware Workstation 16 Player 새로 설치

가상화:

  • 기본 VMWare 설정(CPU 2개, RAM 4GB)
  • WSL2 기본 설정(CPU 6개, RAM 8GB)

WSL2 및 VMWare 모두에서 다음을 수행합니다.

  • Ubuntu Server 20.04 게스트/배포
  • Docker가 둘 다에 설치됨(Docker Desktop이 아닌 공식 레포에서)
  • ubuntu:latest(22.04)
  • Ubuntu 22.04 Docker 컨테이너에 설치된 MySQL 서버(MariaDB) 및 Sysbench

아래 벤치마킹의 경우 다음과 같습니다.

  • WSL2를 테스트할 때 VMWare를 닫았고, 그 반대의 경우도 마찬가지입니다.
  • 테스트 사이에 Windows 호스트를 재부팅하지 않았습니다.그러나 이러한 테스트 중 일부는 VMWare와 WSL2/Hyper-V 모두에서 결과에 큰 차이가 없이 여러 번 실행되었기 때문에 재부팅해도 결과가 크게 달라지지는 않았을 것입니다.
벤치마킹

CPU와 메모리의 기본적인 Sysbench 테스트부터 시작했습니다.이것은 도커 컨테이너 안에서 이루어졌습니다.

  • 단순한sysbench cpu --time=300 run:

    VM웨어 WSL2
    이벤트/초 1,250.97 1,252.89
    # 사건들 375,294.00 375,869.00
    레이턴시
    ↪ 민 0.77 0.77
    ↪ 평균 0.80 0.80
    ↪ 맥스 31.40 4.07
    ↪ 95백분위수 0.87 0.86

    거의 대등한 경기지요

  • sysbench memory run:

    VM웨어 WSL2
    총작업량 64,449,416.00 6,456,274.00
    MiB 전송됨 62,938.88 6,304.96
    레이턴시
    ↪ 민 0.00 0.00
    ↪ 평균 0.00 0.00
    ↪ 맥스 23.63 0.12
    ↪ 95백분위수 0.00 0.00

    아야 - WSL2의 도커 이미지는 VMWare의 메모리 대역폭의 약 10%에서 실행됩니다.솔직히 말씀드리지만, 여기 테이블에 쉼표 구분자를 삽입하기 전까지는 이 부분을 찾기 어려웠습니다 ;-).언뜻 보기에는 두 사람이 대등하다고 생각했습니다.

  • 저는 Sysbench를 사용하는 MySQL 테스트를 생략하기로 결정했습니다. 이 테스트는 WordPress 사용률과 가장 일치할 수 있기 때문입니다.이 작업이 수행되었습니다(해당 작업 후).prepare) 포함:

    sysbench oltp_read_write.lua --mysql-user=root --time=300 --tables=10 --table-size=1000000 --range_selects=off --report-interval=1 --histogram run
    

    히스토그램과 초당 결과는 생략하지만(누구에게나 유용한 경우 저장합니다), 요약 데이터는 다음과 같습니다.

    VM웨어 WSL2
    수행된 쿼리
    ↪ 읽기 583,220 66,910
    ↪ 쓰기 233,288 26,764
    ↪ 기타 116,644 13,382
    ↪ 토탈 933,152 107,056
    거래 58,322 6,691
    무시된 오류 0 0
    다시 연결 0 0
    레이턴시
    ↪ 민 2.08 14.54
    ↪ 평균 5.14 44.83
    ↪ 맥스 71.67 193.75
    ↪ 95번째 백분위수 11.65 81.48

    WSL2의 MySQL 성능(적어도 Docker는)은 VMware의 약 10분의 1 수준으로 벤치마킹하고 있습니다.관측된 성능 차이의 대부분이 이러한 결과에 나타나는 것일 수 있습니다.

이 시점에서 WSL2와 도커를 완전히 무시한 채 하이퍼바이저 수준에서 좀 더 일반적인(IO) 방식으로 문제를 재현할 수 있다는 의구심이 들기 시작했습니다.물론 WSL2는 Hyper-V로 지원되는 VM(사용자에게 숨겨진) 내부에서 실행됩니다. Hyper-V 관리자가 필요하지는 않지만 말입니다.

Hyper-V를 활성화하고 Ubuntu 20.04 게스트를 추가로 설치했습니다.그런 다음 VMware 및 Hyper-V 게스트 Ubuntu OS에 Sysbench를 설치했습니다.

  • 그런 다음 디스크 IO를 다음과 비교했습니다.

    sysbench fileio --file-total-size=15G prepare
    sysbench fileio --file-total-size=15G --file-test-mode=rndrw --time=300 --max-requests=0 --histogram run
    

    결과적으로 의심은 사라졌습니다.

    VMware Ubuntu 게스트 Hyper-V Ubuntu 게스트
    파일작업
    ↪ 읽기/초 2,847.07 258.37
    ↪ 초당 쓰기 수 1,898.05 172.25
    ↪ fsyncs/sec 6,074.06 551.20
    처리량
    ↪ 초당 MiB 읽기 44.49 4.04
    ↪ MiB/sec 쓰기 29.66 2.69
    레이턴시
    ↪ 민 0.00 0.00
    ↪ 평균 0.09 1.02
    ↪ 맥스 329.88 82.77
    ↪ 95번째 백분위수 0.32 4.10

    이 단계에서 주목해야 할 한 가지 흥미로운 점은prepareHyper-V에서 Sysbench의 작동 속도가 약 30% 빨라졌습니다(IIRC).나는 그 이후로 결과를 포착하지 못했습니다.prepare단계는 벤치마킹의 일부가 되어서는 안 됩니다.

    하지만, 당신의 코멘트를 읽고 벤치마킹한 후에,unzipWSL2가 빠를수록 연관성이 있는 것 같습니다.VMware와 Hyper-V/WSL2 모두 동적으로 크기가 조정된 가상 Disk를 사용합니다("희소"라고 부르기도 함).호스트 OS의 가상 디스크 크기는 기본적으로 0바이트에 가까운 파일로 시작하여 필요에 따라 최대 크기까지 증가합니다.

    다음 중 하나일 수 있습니다.

    • Hyper-V는 가상 디스크를 키울 때 성능 면에서 유리합니다.
    • 또는 테스트에서 VMW는 이러한 작업을 위해 Disk를 확장해야 하지만 Hyper-V/WSL2 Disk에는 이미 사용 가능한 여유 공간(이전에 삭제된 파일에서)이 초과되어 있었습니다.

    어떤 순서로 작업을 했는지 확실히 말할 수는 없으며, 확실히 알 수 있는 유일한 방법은 가상 디스크를 "축소/압축"한 후 다시 시도하는 것입니다.

요약

제가 보기에, 그리고 적어도 Windows의 "Pro" 수준에서는 Hyper-V가 VMWare와 비교할 때 성능에 심각한 제한이 있는 것으로 보입니다.

조정 시도 및 기타 비교

Hyper-V 시스템을 좀 조정해 보았지만, 그 부분에 대해서는 전문가가 아닙니다.그럼에도 불구하고 사용자로서는 Hyper-V 튜닝을 WSL2로 확장하기 위해 할 수 있는 일이 많지 않습니다. Microsoft는 이러한 변경 사항을 대부분 변경해야 할 것입니다.

동적 VHDX를 고정형으로 변환하여 IO를 증가시킬 수 있기를 바라며 시도해 보았지만 큰 변화는 없었습니다.

저도 이제 시도해봤습니다.

  • WSL2에서 스왑 비활성화

  • 더 많은 스레드로 Sysbench 테스트 실행

  • WSL2의 고정 12GB RAM 크기 설정

  • 테스트 시스템의 SSD에 비해 메모리와 NVMe 드라이브가 빠른 WSL2에서 sysbench를 실행합니다.

    • 메모리 속도가 크게 향상되었습니다. – 애플 투 오렌지(Apple-to-Orange)지만 데스크톱의 메모리 수는 로우엔드 테스트 시스템에서 실행되는 VMware와 맞먹었습니다.
    • 그러나 이는 디스크 IO 숫자에 아무런 차이가 없었습니다.그들은 여전히 시험 시스템과 같은 범위에 있었습니다.
다음 단계

WordPress 인스턴스와는 별도로 유사한 벤치마킹을 실행할 수 있다면 좋을 것입니다. 이미 두 환경이 설정되어 있기 때문입니다.만약 우리가 데이터를 확증할 수 있다면, 적어도 WSL 팀에는 보고해야 할 것 같습니다.WSL2를 VMware와 거의 동등한 수준으로 조정하는 방법에 대한 지침을 제공하거나 Hyper-V 팀과 협력할 수 있습니다.

Hyper-V와 VMWare의 차이가 너무 크다는 사실이 놀랍습니다.저는 아직도 벤치마킹에서 제 자신이 뭔가 잘못하고 있는 것이 아니라고 믿으려고 애를 씁니다.

자세히 들여다본 후에wsl그리고 고전적인 VM과 약간의 기억력을 새롭게 하기 위해 이론에 도달했지만 증명할 수 없습니다.

이 답변이 어쨌든 도움이 되거나 이 질문에 대한 직접적인 지식을 가진 사람을 끌어들이기를 바랍니다.

저는 여기 댓글과 제 자신에게 이렇게 물었습니다.

Hyper-V가 VMWare보다 '원시 전력'을 훨씬 적게 사용하도록 구성되어 있는 것이 가능합니까? (즉, Microsoft는 WSL에 거의 모든 가용 리소스를 사용하는 것에 비해 우선 순위를 많이 부여하지 않습니다.) 아니면 Hyper-V 성능(코딩 등)에 더 본질적인 문제입니까?

이는 WSL이 웹 페이지를 호스팅하는 것과 같은 리소스 집약적인(네트워크 속도를 포함한) 작업이 아니라 윈도우에서 리눅스 제품에 액세스하기 위한 것으로 보인다는 제 자신의 이해에서 비롯됩니다.WSL의 통합 방식 때문에 일반 VM보다 더 빨리 실행될 것이라고 생각하는 것은 직관적인 것 같지만 VM은 완전히 구성 가능하므로 리소스에 대한 전체 액세스 권한을 거의 부여할 수 있습니다.

이러한 답변을 살펴보면 VM 자체를 대체하기 위한 것은 아닌 것으로 보입니다.

따라서 WSL은 이러한 종류의 작업에 대해 구성되어 있지 않을 수도 있으며, 이를 변경할 수 있을 만큼 충분히 구성할 수 있는 것도 아니라고 생각합니다.

마이크로소프트가 WSL에 목표로 삼은 주요 용도는 Windows 사용자에게 Windows와 Linux 제품 간에 전환할 수 있는 Dinamic 워크플로우를 제공하는 것이었습니다(IMHO, Linux가 Windows보다 콘솔 제품이 훨씬 낫기 때문에). WSL을 모든 특성을 갖춘 본격적인 VM으로 만드는 것은 아닙니다.예를 들어 사용하지 않는 윈도우 환경과 리소스를 공유해야 하는 부담이 있고 '메인'인 리눅스 환경에서 웹페이지를 만들고 호스팅하려는 이유도 일리가 있습니다.

WSL2에는 알려진 네트워킹 병목 현상이 있습니다.

잠재적인 해결 방법은 이 GitHub 문제를 참조하십시오. https://github.com/microsoft/WSL/issues/4901

다른 솔루션에 적합한 솔루션:

언급URL : https://stackoverflow.com/questions/72377252/why-is-a-web-server-2-3x-slower-in-wsl-than-in-vmware-same-docker-stack

반응형