파일 I/O bound 작업 뿌시기

About_work·2024년 4월 10일
0

process, thread

목록 보기
22/23

0. 들어가기전에: 기초지식

  • 캐시, 버퍼, 그리고 RAM은 모두 컴퓨터에서 데이터를 임시로 저장하는 메모리 형태들이지만, 그 용도와 특성에서 차이가 있습니다.

0.1. RAM (Random Access Memory)

  • 정의 및 용도:
    • RAM은 현재 실행 중인 프로그램과 그 프로그램이 사용하는 데이터를 저장
  • 특징:
    • 접근 속도가 빠르며, 컴퓨터가 작업을 수행하는 동안 필요한 모든 데이터와 프로그램 코드를 저장

0.2. 버퍼

  • 정의 및 용도:
    • 버퍼는 데이터를 한 장소에서 다른 장소로 전송하는 동안 임시로 저장하는 메모리 영역
    • 버퍼링은 입출력 작업의 효율성을 높이기 위해 사용되며, 버퍼를 통해 데이터는 더 빠르게 처리될 수 있음
    • 예를 들어, 비디오 스트리밍 시, 버퍼는 비디오 데이터를 미리 로드하여 재생 중에 발생할 수 있는 지연을 최소화하는 데 사용
    • 이는 데이터의 흐름을 조절하여, 생산자와 소비자 사이의 속도 차이를 관리
    • 버퍼는 주로 메모리(RAM)에 위치
  • 특징:
    • 예를 들어, 데이터를 디스크에서 RAM으로 또는 네트워크를 통해 전송할 때 사용
    • 버퍼링은 데이터를 일정량 모아서 한 번에 전송함으로써 효율성을 높이고, 자원 사용을 최적화

0.3. 캐시

  • 정의 및 용도:
    • 캐시는 CPU나 웹 브라우저처럼 자주 사용되는 데이터나 결과를 임시로 저장하는 메모리 영역
    • 이를 통해 데이터에 대한 빠른 접근이 가능하며, 시스템의 전체 성능을 향상
    • 데이터의 접근 속도 개선이 목적
    • 메모리에도 있고, 디스크 캐시도 있다.
  • 특징:
    • 캐시는 접근 시간이 매우 짧으며, 작은 용량일 수 있지만 높은 속도로 데이터에 접근할 수 있음
    • 예를 들어, CPU 캐시는 프로세서가 빠르게 반복적으로 필요로 하는 명령어나 데이터를 저장

1. 본문: 파일 I/O 바운드 작업 이해에 필요한 요소들

  • 파일 I/O 바운드 작업: 컴퓨터가 파일을 읽거나 쓰는 작업을 하는 것

1.1. 운영 체제(OS)

  1. 요청 전달:
  • 프로그램이 파일을 읽거나 쓰기를 원할 때, 그 요청을 받아서 실제 파일 시스템에 전달
    • 파일시스템: 컴퓨터의 저장 장치에 저장된 파일과 디렉터리를 관리하는 시스템
    • 예를 들어, 디스크의 비디오를 열거나, 사진을 저장할 때, 파이썬 코드의 요청이 어떻게 처리되어야 하는지 OS 가 알아서 처리
  1. 권한 검사:
  • 파일에 접근하기 전에, 그 작업이 허용되는지 확인
  1. 데이터 전송:
  • 요청된 파일 데이터를 메모리와 하드 드라이브 사이에서 옮깁니다.

1.2. I/O 서브시스템

  • I/O 서브시스템은 운영 체제의 일부
  • 입출력 장치(예: 하드 드라이브, SSD 등)를 관리
  • 파일 I/O 작업에서 I/O 서브시스템은 다음과 같은 역할을 합니다:
  1. 버퍼링:
  • 입출력 작업 시 , 데이터를 임시로 저장하는 공간(버퍼)을 관리하여, 데이터 전송이 더 효율적으로 이루어지도록
  • 예를 들어, 한 번에 많은 양의 데이터를 읽거나 쓸 때, 이를 적당한 크기로 나누어 처리
    • 파일 시스템에서 데이터를 읽거나 네트워크를 통해 데이터를 전송할 때, 데이터는 직접 RAM으로 가기 전에 "버퍼"라 불리는 임시 저장 영역을 거치곤 해.
    • 버퍼는 데이터를 임시로 저장하는 메커니즘으로, I/O 작업의 효율성을 높이는 데 사용돼.
    • 예를 들어, 비디오 파일을 순차적으로 읽을 때, 시스템은 파일의 일부를 미리 버퍼에 로드하여 I/O 요청의 횟수를 줄이고, 읽기 작업의 전반적인 속도를 향상시킬 수 있어.
  1. 캐싱:
  • 자주 사용되는 데이터를 빠르게 접근할 수 있도록 메모리에 임시로 저장
  • 이로 인해 같은 파일을 여러 번 열 때 더 빠른 속도로 열 수 있음
  • 캐시:
    • 이는 프로세서 내부에 있는 CPU 캐시 또는 운영 체제에 의해 관리되는 디스크 캐시
    • 일반 메모리보다 더 빠르게 읽고 쓸 수 있습니다.
  1. 에러 관리:
  • 데이터 전송 중에 발생할 수 있는 오류를 감지하고, 가능한 한 그 오류를 복구하려고 시도
  • 예를 들어, 파일을 읽는 도중에 문제가 생기면, I/O 서브시스템이 문제를 알려주고, 가능하면 다시 시도

1.3. 하드웨어 (예: 하드 드라이브, SSD)

  • 컴퓨터에서 파일을 저장하고 읽는 장소는 주로 하드 드라이브(HDD)나 솔리드 스테이트 드라이브(SSD)와 같은 저장 장치
  • 이들 장치는 컴퓨터의 하드웨어 부분을 담당하며, 파일 I/O 작업의 실질적인 '저장소' 역할
  • 하드 드라이브(HDD):
    • 자기 디스크를 사용해 데이터를 저장
    • 디스크가 회전하면서 읽기/쓰기 헤드가 데이터를 읽거나 쓸 위치로 이동합니다.
    • 이 과정에는 물리적인 움직임이 포함되어 있어서 시간이 조금 걸릴 수 있습니다.
    • 멀티 쓰레딩을 통한, 디스크 병렬+동시 접근이 불가능
  • 솔리드 스테이트 드라이브(SSD):
    • 플래시 메모리를 사용해 데이터를 저장하므로, HDD보다 빠른 속도로 데이터에 접근할 수 있습니다.
    • 플래시 메모리
      • 전기적인 신호를 사용해서 데이터를 저장해.
      • 이 메모리 내의 작은 "셀(cell)"이라는 곳에 데이터를 저장하는데, 이 셀들은 전기를 이용해 데이터를 "쓰거나(저장하거나)" "지우는(삭제하는)" 과정을 통해 작동해. (전원이 꺼져도 저장돼)
    • SSD는 물리적인 움직임 없이 전기 신호로 데이터를 읽고 씁니다.
    • 멀티 쓰레딩을 통한, 디스크 병렬+동시 접근이 가능

1.4. 네트워크 인터페이스 카드 (NIC)

  • 컴퓨터가 네트워크를 통해 데이터를 보내고 받을 수 있게 해주는 하드웨어 부품
  • 이는 파일을 인터넷이나 다른 네트워크를 통해 전송할 때 중요한 역할
  • 데이터 전송:
    • 컴퓨터가 네트워크를 통해 파일을 보내거나 받으려고 할 때, NIC는 이 데이터를 네트워크 형식에 맞게 변환하고, 데이터를 전송
    • 예를 들어, 이메일에 첨부된 사진을 다운로드하거나 클라우드에 문서를 업로드할 때 NIC가 작동
  • 주소 지정:
    • NIC는 컴퓨터가 네트워크 상에서 고유한 주소를 가지게 해줍니다. 이 주소를 통해 데이터가 정확한 목적지로 전송될 수 있습니다.

2. I/O 바운드 작업 설명

  • I/O 바운드 작업은 실제로 CPU 코어가 직접 수행하는 작업이 아닙니다.
  • 이러한 작업은 주로 시스템의 I/O 서브시스템, 운영 체제, 그리고 관련 하드웨어(예: 하드 드라이브, 네트워크 인터페이스 카드)에 의해 수행됩니다.
  • I/O 바운드 작업의 특징은 CPU가 데이터를 요청하고, 그 데이터가 준비될 때까지 기다리는 과정
  • 이 과정에서 데이터의 전송과 처리는 다음과 같이 다른 구성 요소에 의해 이루어집니다:

2.1. I/O 서브시스템과 운영 체제:

  • 운영 체제: I/O 요청을 관리하고, 요청을 실제 하드웨어 장치로 전달하며, 완료되면 데이터를 애플리케이션에 반환
    • 운영 체제는 이 과정에서 다양한 드라이버와 시스템 호출을 사용하여 I/O 작업을 처리
  • I/O 서브시스템:
    • 데이터 전송, 버퍼링, 캐싱 및 에러 검사와 같은 작업을 포함하여, 실제 데이터 이동을 관리
  • 운영 체제가 I/O 작업을 처리하는 과정에서 드라이버와 시스템 호출을 사용하는 것은, 컴퓨터가 다양한 하드웨어 장치와 소프트웨어 리소스를 관리하고 통신하는 방식을 말함
  • 간단히 말해서,
    • 드라이버: 하드웨어 장치를 운영 체제가 이해하고 제어할 수 있도록 하는 번역기
    • 시스템 호출: 프로그램이 운영 체제의 보호된 기능을 안전하게 사용할 수 있도록 하는 요청 방식

2.1.1. 드라이버

  • 정의:
    • 드라이버는 운영 체제하드웨어 장치 간통신을 가능하게 하는 소프트웨어
    • 각각의 하드웨어 장치(예: 프린터, 비디오 카드, 키보드)는 그것을 제어하기 위한 특정 명령어 집합을 가지고 있는데,
      • 드라이버는 이 명령어들을 운영 체제가 이해할 수 있는 방식으로 번역
  • 용도:
    • 예를 들어, 당신이 문서를 인쇄하려 할 때, 운영 체제는 프린터 드라이버에게 인쇄 명령을 보냄
    • 드라이버는 이 명령을 프린터가 이해할 수 있는 언어로 변환하여 실제 인쇄 작업이 이루어지게 함

2.2.2. 시스템 호출

  • 정의:
    • 시스템 호출은 프로그램이 운영 체제의 기능을 요청할 때 사용하는 메커니즘
    • 운영 체제의 보호된 서비스나 데이터에 접근하려고 할 때, 프로그램은 시스템 호출을 통해 운영 체제에 이러한 작업을 대신 실행해달라고 요청
  • 용도:
    • 예를 들어, 프로그램이 파일을 열거나 네트워크를 통해 데이터를 보내고 싶을 때, 프로그램은 이를 직접 할 수 없습니다.
    • 대신, 파일을 여는 시스템 호출을 하거나 네트워크 소켓을 생성하는 시스템 호출을 사용하여 운영 체제가 이러한 작업을 수행하도록 요청

2.2. 하드웨어:

  • 하드 드라이브와 스토리지 장치:
    • 데이터를 읽고 쓰는 실제 작업을 수행
    • 이러한 장치는 자체 내장 프로세서를 사용하여 데이터의 읽기/쓰기 명령을 처리할 수 있음
  • 네트워크 인터페이스 카드 (NIC):
    • 네트워크를 통한 데이터 전송을 담당
    • NIC는 네트워크 통신을 위해 데이터 패킷을 준비하고, 받은 데이터 패킷을 처리

3. 멀티쓰레딩으로 I/O 작업을 수행할 때, 쓰레드 수를 몇개로 해야하나?

  • 그러나 쓰레드의 수를 무한정 늘리는 것이 반드시 더 나은 성능을 의미하지는 않습니다. 여기에는 몇 가지 주요한 이유와 예상되는 문제점이 있습니다:

3.1. I/O 바운드와 CPU 바운드

  • I/O 바운드 작업:
    • 작업이 디스크 I/O에 의해 속도가 결정되는 경우, CPU는 대기 시간이 많아집니다.
    • 이 경우, 멀티 쓰레드가 도움이 될 수 있습니다.
    • 하지만, 쓰레드가 너무 많으면 오히려 디스크 I/O 병목 현상이 발생할 수 있음
    • 비디오 프레임을 읽어오는 것은 주로 I/O 바운드 작업이므로, CPU 바운드에 도달하기 전에 I/O 바운드에 직면할 가능성이 높습니다.

3.2. 디스크 I/O 병목 현상

  1. 디스크의 읽기/쓰기 속도가 포화 상태에 도달:
  • 디스크가 한 번에 처리할 수 있는 I/O 요청의 양은 한정되어 있습니다.
  • 많은 쓰레드가 동시에 요청을 하면, 디스크는 모든 요청을 즉시 처리할 수 없게 됩니다.
  • 이 때문에, 디스크의 처리 용량이 '포화 상태'에 이르게 되고, 추가 요청은 대기해야 함
  • 14개의 멀티 쓰레딩을 사용해도, 10개만 동시+병렬로 처리될 수 있다는 뜻
  1. 디스크 액세스 대기 시간 증가:
  • 디스크가 포화 상태에 이르면, 새로운 I/O 요청은 처리될 수 있을 때까지 대기해야 합니다. 이 대기 시간이 늘어나면, 프로그램이 데이터를 기다리는 시간도 길어집니다.
  • 예를 들어, 비디오 파일에서 프레임을 읽어오는 작업이 지연될 수 있습니다.
  1. 시스템의 전반적인 응답성 저하:
  • 여러 쓰레드가 디스크 I/O를 기다리는 동안, 시스템의 다른 부분에서도 지연이 발생할 수 있습니다.
  • 예를 들어, 사용자 인터페이스가 더디게 반응하거나, 다른 프로그램이 느려질 수 있습니다.

3.3. 컨텍스트 스위칭 오버헤드

  • 쓰레드의 수가 코어의 수보다 많을 경우, 운영 체제는 더 많은 컨텍스트 스위칭을 수행해야 합니다.
  • 컨텍스트 스위칭은 현재 실행 중인 쓰레드의 상태를 저장하고 다른 쓰레드로 전환하는 과정
  • 이 과정에서 추가적인 CPU 자원이 소모되며, 과도한 컨텍스트 스위칭은 시스템의 성능을 저하시킬 수 있음

4. 질문: 중요!

4.1. 어짜피 I/O 작업은 한번에 하나의 쓰레드만 수행 가능한거지?, 하나의 쓰레드가 I/O작업을 완료할 때까지 어짜피 다른 쓰레드들은 i/o 작업을 동시에 할 수 없는거지? -> 아니오.

  • 디스크 I/O 작업의 동시성은 여러 요인에 따라 달라질 수 있어. 이해를 돕기 위해 몇 가지 주요 포인트를 설명할게:
  1. 디스크 유형:
  • HDD(하드 디스크 드라이브)와 SSD(솔리드 스테이트 드라이브) 사이에는 큰 차이가 있어.
  • HDD는 물리적인 움직임(디스크 회전과 읽기/쓰기 헤드의 위치 이동)이 필요하기 때문에, 동시에 여러 I/O 요청을 처리하는 데 제한이 있어.
  • 반면, SSD를 사용하는 경우 여러 쓰레드가 동시에 I/O 작업을 수행할 수 있어.
  1. 운영 체제의 I/O 스케줄링:
  • 현대 운영 체제는 I/O 스케줄링을 매우 효율적으로 처리할 수 있어.
  • 이는 여러 I/O 요청을 동시에 받아들여 순서를 조정하고, 가능한 한 효율적으로 디스크에 요청을 전달할 수 있음을 의미해.
  • 심지어 일부 운영 체제는 NCQ(Native Command Queuing) 같은 기술을 사용하여 하드웨어 레벨에서 I/O 요청의 처리 순서를 최적화할 수 있어,
  • 이는 특히 SSD에서 성능 향상을 가져올 수 있어.
  1. 멀티쓰레딩과 멀티프로세싱:
  • 멀티쓰레딩 환경에서 각 쓰레드는 독립적으로 I/O 작업을 요청할 수 있어.
  • 하지만, 실제로 여러 I/O 작업이 디스크에 동시에 수행될 수 있는지는 디스크의 유형, 운영 체제의 I/O 스케줄링 능력, 그리고 사용 중인 파일 시스템에 따라 달라져.
  • 예를 들어, 현대의 파일 시스템과 운영 체제는 여러 쓰레드로부터 오는 I/O 요청을 동시에 처리할 수 있는 능력이 있어, 이는 동시에 여러 파일을 읽거나 쓸 때 유용해.

4.2. 질문: 비디오 I/O에 적합한 멀티 쓰레드 갯수 정하는 법

  • 너의 상황에 맞는 적절한 쓰레드 수(n)를 결정하는 것은 여러 요소를 고려해야 해. 이론적으로, 쓰레드 수를 결정할 때 고려해야 할 주요 요소는 다음과 같아:
  1. CPU 코어의 수:
  • 프로그램의 성능을 최대화하기 위해서는 사용 가능한 CPU 코어의 수를 고려하는 것이 좋아.
  • 일반적으로, 사용 가능한 CPU 코어 수보다 많은 수의 쓰레드를 생성하면 컨텍스트 스위칭으로 인한 오버헤드가 발생할 수 있어.
  • 하지만 I/O 바운드 작업의 경우, CPU 사용률이 낮기 때문에 CPU 코어 수보다 많은 쓰레드를 생성할 수 있어.
  1. I/O와 CPU 작업의 비율:
  • 너의 작업이 I/O 바운드인지, 아니면 CPU 바운드인지를 판단해야 해. 비디오 프레임을 읽는 작업은 주로 I/O 바운드일 가능성이 높아.
  • I/O 바운드 작업의 경우, I/O 작업을 기다리는 동안에도 다른 쓰레드가 CPU 작업을 진행할 수 있으므로, CPU 코어 수보다 많은 쓰레드를 사용할 수 있어.
  1. 디스크의 성능:
  • SSD의 경우 동시에 여러 I/O 요청을 처리할 수 있는 능력이 있지만, 이 역시 한계가 있어.
  • SSD의 IOPS(Input/Output Operations Per Second)와 처리량을 고려하여 너무 많은 쓰레드가 동시에 I/O 요청을 하지 않도록 주의해야 해.

  • 이러한 요소를 종합적으로 고려할 때, 쓰레드 수를 결정하는 가장 좋은 방법은 여러 설정을 실험해 보는 것이긴 해.
  • 하지만 실험 없이 대략적인 수를 정하고 싶다면, 사용 가능한 CPU 코어 수의 2배 정도로 시작하는 것이 좋을 수 있어.
  • 예를 들어, 너의 시스템에 8개의 CPU 코어가 있다면, 16개의 쓰레드를 생성해 볼 수 있어.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글