KVM 게스트 io가 호스트 io보다 훨씬 느립니다. 정상입니까?


13

CentOS 6.3에 Qemu-KVM 호스트 시스템 설정이 있습니다. 소프트웨어 RAID10에서 작동하는 4 개의 1TB SATA HDD. Guest CentOS 6.3은 별도의 LVM에 설치됩니다. 사람들은 게스트의 성능이 호스트의 성능과 거의 같다고 말하지만, 나는 그렇지 않습니다. 내 i / o 테스트는 호스트 시스템보다 게스트의 성능이 30-70 % 더 느립니다. 스케줄러 ( elevator=deadline호스트 및 elevator=noop게스트 설정) blkio.weight를 변경하고 cgroup에서 1000으로 설정 하고 io를 virtio 로 변경하려고 시도했지만 이러한 변경 사항 중 어느 것도 중요한 결과를 얻지 못했습니다. 이것은 게스트 .xml 구성 부분입니다.

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/dev/vgkvmnode/lv2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

내 테스트가 있습니다 :

호스트 시스템 :

요 오존 테스트

# iozone -a -i0 -i1 -i2 -s8G -r64k
                                                            random  random 
              KB  reclen   write rewrite    read    reread    read   write 
         8388608      64  189930  197436   266786   267254   28644   66642 

dd 읽기 테스트 : 하나의 프로세스와 네 개의 동시 프로세스

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct
1073741824 bytes (1.1 GB) copied, 4.23044 s, 254 MB/s

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 14.4528 s, 74.3 MB/s
1073741824 bytes (1.1 GB) copied, 14.562 s, 73.7 MB/s
1073741824 bytes (1.1 GB) copied, 14.6341 s, 73.4 MB/s
1073741824 bytes (1.1 GB) copied, 14.7006 s, 73.0 MB/s

dd 쓰기 테스트 : 하나의 프로세스와 네 개의 동시 프로세스

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 6.2039 s, 173 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 32.7173 s, 32.8 MB/s
1073741824 bytes (1.1 GB) copied, 32.8868 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9097 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9688 s, 32.6 MB/s

게스트 시스템 :

요 오존 테스트

# iozone -a -i0 -i1 -i2 -s512M -r64k
                                                            random  random
              KB  reclen   write rewrite    read    reread    read   write
          524288      64   93374  154596   141193   149865   21394   46264 

dd 읽기 테스트 : 하나의 프로세스와 네 개의 동시 프로세스

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024
1073741824 bytes (1.1 GB) copied, 5.04356 s, 213 MB/s

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 24.7348 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7378 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7408 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.744 s, 43.4 MB/s

dd 쓰기 테스트 : 하나의 프로세스와 네 개의 동시 프로세스

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 10.415 s, 103 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 49.8874 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8608 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8693 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.9427 s, 21.5 MB/s

나는 이것이 정상적인 상황인지 궁금하거나 무언가를 놓친 것입니까?


더 나은 성능을 제공하는 버스 유형의 virtio를 사용하도록 게스트를 변경했지만 이러한 이점을 얻기 위해서는 virtio 드라이버가 설치되어 있어야합니다. 당신은 당신이 그들을 사용하고 있는지 말하지 않았다. 이 드라이버가 기본적으로 게스트에 있을지 여부에 대해 CentOS에 대해 충분히 언급 할 수 있을지 모르겠습니다.
jwbensley

1
@javano CentOS에는 항상 virtio가 포함되어 있으므로 커널 패키지를 다시 빌드하여 명시 적으로 제거해야합니다.
Michael Hampton

항상 알기
편리함

답변:


22

아직 성능 조정이 완료되지 않았습니다.

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>

먼저 사용할 I / O 메커니즘입니다.

QEMU에는 두 개의 비동기 I / O 메커니즘이 있습니다. 작업자 스레드 풀을 사용하는 POSIX AIO 에뮬레이션 및 기본 Linux AIO.

io='native'또는 io='threads'각각을 벤치 마크하도록 XML에 설정하십시오 .

두 번째는 사용할 캐싱 메커니즘입니다. 당신은 설정할 수 있습니다 cache='writeback', cache='writethrough'또는 당신은 그것을 해제 할 수 있습니다 cache='none'당신은 실제로 최고의 작품을 찾을 수있다.

원시 볼륨 또는 파티션을 사용하는 경우 캐시를 완전히 피하는 것이 가장 좋습니다. 이렇게하면 데이터 사본과 버스 트래픽이 줄어 듭니다.

writebackRAID 어레이가 배터리로 백업되거나 데이터가 손실 될 위험이 없으면 사용 하지 마십시오 . (물론 데이터 손실이 괜찮다면 자유롭게 느끼십시오.)

셋째, 장벽을 끄고 게스트에서 마감일 스케줄러를 사용하는 것을 도울 수있는 다른 것들이 있습니다.

마지막으로 몇 가지 조사를 수행하십시오. IBM은 2010 Linux Plumbers Conference에서 KVM I / O 성능에 대해 매우 흥미로운 프레젠테이션을했습니다 . 또한 KVM 사용에 대한 광범위한 모범 사례를 보유하고 있으며 이는 확실히 흥미로울 것입니다.

PS Longy 순차 읽기 및 쓰기가 실제 워크로드를 나타내는 것은 아닙니다. 프로덕션에서 실행할 실제 응용 프로그램과 같은 다른 유형의 워크로드로 벤치 마크를 수행하십시오.


"IO 패턴으로 테스트"+1
Javier

아, 좋은는 IBM의 문서에 좋아, +1 :
jwbensley

1
매우 도움이되었습니다. 감사합니다! 이제 호스트 성능에서 게스트 결과가 최대 90 % 향상되었습니다. 내 잘못은 매우 어리 석었습니다. 변경 사항을 virsh reset <domain>적용하지 않았고 virsh edit <domain>게스트가 virtio를 사용했다고 생각했지만 실제로는 그렇지 않았습니다. 만 virsh destroy <domain>다음에 virsh start <domain>도움을 주었다. 버티 오 규칙! ;)
Evolver

1
cache = writeback은 실제 위험을 추가하지 않습니다 (중요한 데이터는 위험하지 않고 기내 데이터 만 발생하며 충돌시 버려집니다). cache = unsafe 만 수행합니다. 쓰기 저장은 추가 하드웨어 요구 사항을 의미하지 않습니다 ( "배터리 백업 RAID 어레이"는 어떤 식 으로든 도움이되지 않습니다). HDD 쓰기 캐시와 동일한 무결성 수준을 갖습니다. 운영 체제에서 필요할 때 모두 플러시됩니다.
korkman

io='native'내 경우에 거의 20-30 %의 추가 쓰기 성능을 제공
rahul286
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.