[운영체제] DMA 와 고성능 소켓

https://youtu.be/VmclwfKzNO0?si=KnjGslnz3YJxiWk2

 

DMA(Direct Memory Access)기술을 적용할 경우 불필요한 I/O가 없어지며 성능이 좋아집니다. 보통은 NIC(Network Interface Card)가 DMA를 지원합니다. 또한 이러한 특성을 활용해 빠른 속도로 소켓 통신이 가능합니다.


Direct Memory Access(DMA)와 고성능 데이터 전송

DMA(Direct Memory Access)를 이야기할 때 항상 따라다니는 키워드는 '고성능'이다. DMA는 컴퓨터의 메모리, 즉 RAM의 일부를 장치를 위해 예약하는 방식이다. 컴퓨터의 메모리는 RAM과 CPU에 위치하며, CPU에는 캐시 메모리와 레지스터 메모리가 포함된다.

모든 데이터 전송 과정에서 IO 매니저가 역할을 하지만, 정보가 CPU를 거쳐야만 하는가? 굳이 IO 매니저를 통과할 필요가 있을까?

그렇다면 데이터는 직접 지정된 메모리 위치에 한 번에 바로 쓸 수 있다. IO 매니저를 거치지 않고 약속된 위치에 직접 데이터를 쓰게 되면 성능을 크게 향상시킬 수 있다. 이러한 방식이 바로 Direct Memory Access(DMA)이다. DMA는 특히 NIC(Network Interface Card)에서 가장 많이 사용되어, 네트워크 데이터 전송을 효율적으로 처리한다.

DMA

 

 

소켓과 데이터 전송 과정 및 수신 단계


소켓은 네트워크 통신을 위한 추상화된 파일 인터페이스이다. 운영체제의 커널은 소켓을 통해 네트워크 통신을 처리하며, 소켓은 이 과정에서 파일 시스템의 일부로 동작한다. 파일에는 기본적으로 IO 버퍼가 연결되어 있다. 

하드디스크에서 메모리를 읽거나 다른 I/O 작업을 수행할 때, 커널은 해당 작업을 처리하기 위한 다양한 구성요소를 관리한다. 네트워크에서 정보를 수신하는 경우, 커널은 TCP/IP 스택을 통해 이 작업을 처리한다. 사용자 모드에서 위치한 파일은 소켓이라고 부르며, 이는 네트워크와 상호작용하는 방법을 제공한다.

맨 밑의 하드웨어(디바이스)는 네트워크 인터페이스 카드(NIC)로, 이 NIC는 실제 물리적인 네트워크 통신을 담당한다. 따라서 소켓은 사용자와 커널 사이의 네트워크 통신을 추상화하여 관리하고, NIC는 실제 데이터 전송을 수행한다.

 

송신의 단계 : 

  1. user 단 상위 어딘가에서 송신할 데이터를 적재한다.
  2. user단 File (Socket)에서 데이터를 Write(Send) 한다. 
  3. 데이터가 IO 버퍼에 복사가 된다.
  4. 버퍼가 커널로 내려오면서 세그멘테이션이 일어난다. 
  5. 세그먼트 들이 HW장치(NIC)로 내려오면 네트워크로 전송하게 된다.

중간에서 데이터가 들어오면, 데이터는 입출력 버퍼라고 불리는 메모리 영역에 담긴다. 이 버퍼는 데이터가 네트워크를 통해 전송되거나 수신될 때 사용된다. 데이터는 세그먼트 안에 포함되어 있으며, 이 과정에서 여러 단계의 버퍼를 거친다. 예를 들어, 데이터는 NIC에서 수신된 후, NIC의 메모리 버퍼에 저장되고, 이후 커널의 IO 버퍼를 통해 프로세스의 메모리로 전달된다.

 

이러한 과정에서 모든 버퍼는 RAM 메모리 영역에 위치하고, NIC에도 자체적인 RAM 메모리가 있을 수 있다. NIC의 RAM 메모리는 네트워크에서 수신한 데이터를 저장하는 데 사용된다. 데이터가 네트워크를 통해 들어오면, NIC의 RAM을 거쳐 프로세스의 메모리로 전달된다.

 

이 과정은 수신의 경우에도 동일하게 적용된다. 데이터는 NIC의 메모리에서 커널의 버퍼를 거쳐 사용자 프로세스의 메모리로 전달된다.

 


DMA를 지원하는 NIC의 데이터 전송 효율성

DMA를 지원하는 NIC(Network Interface Card)의 경우, 네트워크에서 수신한 데이터가 성능을 크게 향상시킬 수 있다. NIC가 DMA를 지원하면 데이터가 직접 메모리로 전송될 수 있으며, 이 과정에서 중간의 버퍼를 생략하게 된다.

소켓은 기본적으로 IO 버퍼를 가지고 있으며, 프로세스는 메모리를 확보해두고 `recv` 함수를 호출하여 수신 대기를 한다. 이 과정에서 소켓의 IO 버퍼와 프로세스의 메모리가 포함되어 있으며, 메모리는 동기 모드든 비동기 모드든 수신을 대기한다. DMA를 지원하는 NIC는 이러한 메모리 버퍼를 직접 다룰 수 있다.

네트워크에서 정보가 유입되면, DMA를 지원하는 NIC는 데이터를 NIC의 메모리 버퍼에 저장한 후, 직접 프로세스의 메모리로 전송할 수 있다. 예를 들어, 사용자 모드에서 `malloc` 함수를 사용해 할당받은 메모리는 힙 영역의 메모리로, 이는 사용자 모드 애플리케이션 메모리에 해당된다. 커널 메모리는 별도로 관리되지만, DMA를 활용하면 이 사용자 모드 메모리에 직접 데이터를 전송할 수 있다.

 

IOCP


여기서 IOCP(I/O Completion Ports)라는 개념이 중요한 역할을 한다. IOCP는 운영체제가 특정 메모리 영역에 대해 Lock을 걸어 해당 영역이 커널에 의해 사용될 것임을 표시한다. 따라서 네트워크에서 데이터가 들어오면, 이 Lock이 걸린 메모리 영역으로 직접 전달될 수 있다. 이로 인해 성능이 향상된다.

원래 CPU가 RAM을 사용할 때, 데이터는 CPU에서 RAM으로 전송된다. NIC가 DMA를 지원하면, 데이터를 특정 메모리 영역에 직접 쓸 수 있다. 이때 DMA를 사용하면 중간 단계를 생략하게 되어 성능이 크게 향상된다. 모든 데이터는 결국 RAM을 거쳐야 하지만, DMA를 통해 직접 RAM에 쓰여지는 과정이 생략되므로 복사나 중간 단계 없이 효율적으로 데이터가 처리된다.

 

 

가상환경 VM과 DMA

가상환경은 밑의 구조처럼 이루어져 있다. 

 

 

VM 끼리 통신 하는 경우 결국 주황색 화살표로 이동시키겠다는 뜻인데, 그렇다면 VM안의 NIC 들이 DMA를 하는 정도가 아니라, 내부 시스템간의 통신을 활용해 VM안의 RAM끼리의 복사가 이루어지게 된다. 결국 아래 화면 안에 보이는 파란색 RAM 들은 베이스가 되는 컴퓨터의 내부 간의 통신이기 때문에 VM을 활용할 경우 통신 속도가 엄청나게 빨라지게 된다.

 

즉 내부 Host 간의 통신인 경우, 네트워크 통신이 아닌 메모리 Copy 로 모든 일이 끝나게 된다. 가상환경은 성능을 극대화할 수 있는 정말 좋은 툴. 

 


요약 

  • Direct Memory Access(DMA)의 개요: DMA는 불필요한 I/O 과정을 제거하여 성능을 향상시키는 기술. 이를 통해 데이터는 IO 매니저를 거치지 않고 바로 약속된 메모리 위치로 전송된다.
  • NIC(Network Interface Card)와 DMA 지원: 대부분의 NIC는 DMA를 지원하며 이를 통해 빠른 소켓 통신이 가능하다.
  • 소켓 통신의 원리: 소켓은 네트워크 정보를 주고받기 위한 파일 인터페이스이며, 데이터를 IO 버퍼에 복사하고, 커널의 TCP/IP 스택을 통해 네트워크 장치로 전송한다.
  • DMA를 이용한 송신 프로세스:
    1. 사용자 영역에서 송신할 데이터를 적재.
    2. 소켓을 통해 데이터를 Write(Send).
    3. 데이터가 IO 버퍼에 복사된다.
    4. 버퍼가 커널로 내려오면서 세그멘테이션이 일어난다.
    5. 세그먼트들이 NIC로 내려와 네트워크로 전송된다.
  • DMA를 이용한 수신 프로세스: DMA를 지원하는 NIC는 네트워크에서 들어온 데이터를 직접 사용자 모드 메모리에 전달하여 불필요한 메모리 복사를 줄인다. 이를 통해 성능이 크게 향상된다.
  • 가상환경에서의 DMA 활용: VM 간 통신의 경우, 네트워크 통신 대신 메모리 복사로 대체되어 성능이 극대화. 가상환경에서의 DMA 활용은 내부 통신 속도를 크게 향상시킨다.