Q&A에 올려도 될지 모르겠지만 그냥 이렇게 올리면 아시는분이 답해줄꺼라생각해서
물론 VMM팀은 아니지만 개인적으로 관심이 많은 분야여서요..^^;....
세미나 중에 이더넷 가상화에 대해 질문 드립니다. 얼마전 프로젝트로 VM비슷한 걸 했는데 저도 이더넷 부분에서 머리가 한 두움큼정도 빠졌었거등요...ㅋㅋㅋㅋ
최영호 씨 세미나 중
guest OS가 동작중에 이더넷 패킷이 수신되었을때 hypercall로 Xen으로 진입한다음 하드웨어의 이더넷 패킷을 처리한 후(하드웨어의 버퍼를 비운다??)에 os를 스케쥴을 하게되며 패킷을 받을 guest OS에게로 os_communication이나 shared memory를 통하여 Domain0가 패킷을 보내준다라고 들었습니다. 제가 제대로 들었는지 모르겠네요..
1.그럼 패킷이 들어올때마다 hypercall로 xen으로의 점프는 엄청난 부하를 가져오는데 이렇게 밖에 할 수 없는 이유가 즉각즉각 이더넷카드의 하드웨어적인 버퍼를 비워주어야 하기 때문인가요??(최영호님 말로는 엄청난 논문이 쏟아졌지만 아직 해결책이 제시되지 않고 있다고....)
2.그리구 Dom0가 그외의 모든 guest에게로 패킷을 전부 보내는 것이겠지요?? ip로 분기하기에는 브로드캐스팅이나 이런것들이 문제가 될꺼 같은데요....xen은 어떻게 구현되었는지 너무너무 궁금합니다.
물론 VMM팀은 아니지만 개인적으로 관심이 많은 분야여서요..^^;....
세미나 중에 이더넷 가상화에 대해 질문 드립니다. 얼마전 프로젝트로 VM비슷한 걸 했는데 저도 이더넷 부분에서 머리가 한 두움큼정도 빠졌었거등요...ㅋㅋㅋㅋ
최영호 씨 세미나 중
guest OS가 동작중에 이더넷 패킷이 수신되었을때 hypercall로 Xen으로 진입한다음 하드웨어의 이더넷 패킷을 처리한 후(하드웨어의 버퍼를 비운다??)에 os를 스케쥴을 하게되며 패킷을 받을 guest OS에게로 os_communication이나 shared memory를 통하여 Domain0가 패킷을 보내준다라고 들었습니다. 제가 제대로 들었는지 모르겠네요..
1.그럼 패킷이 들어올때마다 hypercall로 xen으로의 점프는 엄청난 부하를 가져오는데 이렇게 밖에 할 수 없는 이유가 즉각즉각 이더넷카드의 하드웨어적인 버퍼를 비워주어야 하기 때문인가요??(최영호님 말로는 엄청난 논문이 쏟아졌지만 아직 해결책이 제시되지 않고 있다고....)
2.그리구 Dom0가 그외의 모든 guest에게로 패킷을 전부 보내는 것이겠지요?? ip로 분기하기에는 브로드캐스팅이나 이런것들이 문제가 될꺼 같은데요....xen은 어떻게 구현되었는지 너무너무 궁금합니다.
댓글 3
-
박은병
2008.01.05 14:03
-
최영호
2008.01.09 14:24
안녕하세요. 이거 질문을 너무 늦게 봤네요. ^^
위에서 김태훈님께서 자세히 답변을 해주셔서 간단하게만 추가 설명을 드리도록 하겠습니다.
질문-01) Packet이 들어올때 마다 hypercall로 xen으로의 점프 이유?
답변)
hypercall은 domain에서 xen으로 요청하는 system call 같은 것입니다. 그러므로 이런 경우는 hypercall에 의해서 domain에서 xen으로 이동하는 것은 아닙니다. hypercall에 의해서 xen으로 이동했다면 domain에서 요청을 했다는 의미가 되어 버리죠.
Packet이 들어왔을 때 Xen으로 이동할 수밖에 없는 이유는 모든 인터럽트를 Xen에서 처리해 주기 때문입니다. 즉, Domain에서 동작을 하다가 인터럽트가 발생하면 해당 인터럽트 핸들러로 점프하면서 자연스럽게 Xen으로 이동하는 것입니다.
질문-02) Dom0으로 스케줄이 되면 그제서야 native드라이버가 패킷을 수신하는 방법
답변)
위와 같은 관점에서 바라보면 인터럽트 방식으로 Packet을 처리할 때는 위와 같이 할 수 없고, Network Device Driver를 Polling 방식으로 동작하면 이렇게 할수도 있습니다. 하지만 김태훈님께서 지적해 주신 것처럼 H/W의 Packet Buffer의 용량에 한계가 있어서 Packet이 유실 될 수 있는 문제가 발생합니다. 그렇게 좋은 방법인것 같지는 않네요 :)
질문-03) Dom0가 guest에게로 패킷을 보내는 방법
답변)
제가 메모리쪽을 소개해 드리면서 Grant Table이라는 메모리 공유 방식을 설명 드렸습니다. 이미 짐작하시겠지만 Domain간 Network/File Data를 전송하는 방법은 이런 Grant Table(=Shared Memory)을 이용한 메모리 복사 방식을 사용합니다.
질문-04) Hypervisor에서 Network 성능을 향상 시키는 방법
답변)
이 것에 대한 답변은 x86의 VT기술에서 정답을 찾을 수 있습니다. KVM을 보면 KVM에서는 I/O만을 Simulator 해주는 Application을 띄워놓고 각각의 도메인은 해당 Simulator 위에서 동작을 하게 되어 있습니다. 대략 이런 방식으로 도메인과 Hypervisor의 Context Switch가 일어나지 않고도 I/O 통신이 가능하게 하도록 하기 때문에 속도 향상된다고 합니다.
위 답변을 보시면 모호하시죠? ^^. 저도 이 부분을 정확하게 알지는 못한답니다. 자세한 내용은 KVM과 Xen에서 Intel VT 기술을 어떻게 적용해서 I/O 성능을 향상시켰는지에 관련된 자료를 찾아보시면 될거에요.
-
백창우
2008.01.10 20:05
감사합니다. 최영호님 :)
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 프로그래밍 관련 Q&A 게시판 입니다. | woos | 2016.04.09 | 22251 |
18 | 디버거 원리.. [6] | 박은병 | 2008.01.31 | 13441 |
17 | PS/2 mouse port control | 백창우 | 2008.01.17 | 7196 |
» | VMM 세미나중 디바이스 가상화 관련 질문^^.. [3] | 박은병 | 2008.01.04 | 7252 |
15 | 질문..음.. [2] | 박은병 | 2007.12.14 | 6453 |
14 | arm 보드 구매에 대한 조언 부탁 드립니다. [1] | 김성준 | 2007.10.27 | 8581 |
13 | Linux kernel source 분석 study에 대하여 질문이 있습니다. [1] | 온정상 | 2007.10.19 | 8712 |
12 | 모집 공고 보고 참석 메일 보냈는데요. [1] | 문경원 | 2007.10.17 | 8273 |
11 | 스터디 참여에 관해서 질문이있습니다. [1] | 최대진 | 2007.09.12 | 8530 |
10 | s3c2440기반의 리눅스 커널 분석 중 MM관련 질문입니다. | 유태경 | 2007.09.02 | 21523 |
9 | 커널 스터디는 어떻게 참여해야하느건가요? [1] | 김태진 | 2007.08.10 | 8806 |
8 | 커널 스터디에 관해서;;. 질문드립니다. [5] | 한상은 | 2007.07.11 | 8693 |
7 | 다음 커널분석 스터디에 참가하고 싶습니다. [1] | 김기태 | 2007.07.04 | 8820 |
6 | 아키텍쳐 바이블 책 문의입니다. [2] | 이경호 | 2007.03.18 | 11958 |
5 | i386의 i 와 386은 각각 어떤 의미인가요? [4] | 이경호 | 2007.03.07 | 13685 |
4 | ppc에서 preempt 완벽 지원여부 아시는분? [1] | 최종환 | 2007.02.22 | 16131 |
3 | 알아볼 내용. [6] | 원민수 | 2006.11.12 | 9892 |
2 | u-boot 소스 분석에서 궁금한 점이 있습니다. [6] | 원민수 | 2006.06.28 | 15196 |
1 | 홈페이지 어떻습니까? [8] | 백창우 | 2006.06.05 | 9722 |
.
실제로 저도 이런 비슷한 방법으로 구현을 했었는데(개념적으로 7,8번 생략)..ping을 때렸을시 native driver를 가지고 있는 OS와 그렇지 않은 경우의 OS의 속도차이가 대략 5배정도 차이가 났었습니다.(ping에서 몇ms라고 나오는거 있잖아요...) 하지만 xen같은 경우는 스케쥴링 알고리즘도 복잡하고 그러니 더 부하가 심할텐데 guest OS에서 잘 돌아가는지가 의심스럽군요^^;....
그럼 이런 방법은 어떨까요..어차피 Domain0가 실제적인 native driver를 가지고 있으니 패킷이 들어왔다고 하더라도 바로 Dom0로 스케쥴링을 하는것이 아니라 자연스럽게 Dom0으로 스케쥴이 되도록 기다리고 있다가 Dom0으로 스케줄이 되면 그제서야 native드라이버가 패킷을 수신하는 겁니다. 위의 1번 질문의 (하드웨어적인 버퍼를 비운다??) 것은 이런 맥락에서의 질문이였네요..그리구 또한 바로 해당 패킷이 수신되어야할 GuestOS로 스케쥴링을 하는것이 아니라 자연스럽게 해당 GuestOS로 스케쥴링 될때까지 기다리는 거죠..그러면 두번의 인위적인 스케쥴링을 방지할수 있지 않을까 생각합니다. 물론 이더넷에 대한 반응은 많이 떨어지겠지만 쓸데없는(?) Dom간 스케쥴링때문에 생기는 부하는 줄어들지 않을까 생각합니다. 기가비트 이더넷정도되면 패킷이 미친듯이 들어올텐데 들어올때마다....캐안습..ㅜㅜ....사실 최초에 이런 개념으로 구현을 해봤었는데 그게 잘 안되더군요....제 구현 실력이 많이 부족하기도 했던거 같고..ㅜㅜ..이유는 찾지 못했습니다.
항상 알찬정보를 제공해주셔서 감사합니다..정말 많은걸 배웁니다.^^