메모리는 많이 사용하지만 시간은 아주 적게 사용하는 서버 응용 프로그램이 있습니다. 그래서 큰 스왑과 일반 메모리로 실행하는 것이 경제적이어야 한다고 생각합니다.
비동기식 디스크 IO에 대해 배웠을 때 디스크에서 대용량 파일을 제공하는 방법에 대해 읽었으며 FreeBSD가 Linux보다 이를 더 잘 지원한다는 소식을 들었습니다.
내 질문은: 스왑 파티션이 많은 디스크 읽기 및 쓰기를 수행하므로 비동기 디스크 IO가 스왑 공간의 성능에 영향을 줍니까? FreeBSD를 선택해야 하는 이유가 있나요? 저는 Linux(Ubuntu) 작업에 대한 폭넓은 경험을 갖고 있으며 이를 애플리케이션에 사용하는 것을 선호합니다.
답변1
- FreeBSD의 비동기 IO는 Linux보다 더 나은 것은 아닙니다. 귀하의 소스는 AIO 호출 계열(
aio_read
등)이 FreeBSD 커널에서 직접 구현되지만 가능한 경우 요청을 IOCP(소켓, 파이프, 플랫 디스크 액세스 등)로 내부적으로 변환하고 파일 시스템 I/ 커널 스레드를 생성합니다. 이와 대조적으로 Linux는 일련의 AIO 호출에 대해 사용자 공간 스레드를 사용합니다. 이는 더 명시적이지만 작업을 노출하고 더 큰 스레드 컨텍스트가 필요합니다. 다른 모든 측면은 시스템 관리자 조정 기술을 포함한 많은 기능에 따라 달라지는 공통 커널 아키텍처 및 성능과 관련됩니다. - AIO가 명시적으로 스레드를 요구하는 경우 몇 가지 접근 방식이 있습니다. 주요 사례는 파일이 메모리 매핑되어 메모리 영역으로 읽혀지고 실제 읽기가 페이지 오류로 처리되는 경우입니다. 페이지 오류는 특정 제어 흐름(즉, 스레드)을 중단시키기 때문에 독립적인 처리를 위해서는 별도의 스레드가 필요합니다. 이것은 여러분이 가정하고 있는 메커니즘과 매우 유사한 것처럼 보이지만 RAM 사용량을 올바르게 제어하는 경우에만
madvise
필요한 영역과 필요하지 않은 영역을 지정하기 위한 호출이 적어도 많이 발생함을 의미합니다. 때로는 직접 *read()/*write()가 처리된 세그먼트를 RAM에 노출할 필요가 없기 때문에 더 쉽습니다. - AIO 자체는 스위칭과 아무 관련이 없습니다. IO 방법을 사용하려면 최적의 속도로 입력 및 출력이 필요합니다. 그러나 문제는 프로세스 메모리에 많은 양의 데이터를 보관하면 교체가 발생하고 들어오게 된다는 것입니다. "작업 세트"(프로세스 성능이 크게 저하되지 않고 작업하기 위해 RAM에 있어야 하는 페이지 세트)가 RAM에 맞는 것(커널 데이터, 디스크 캐시 등에 대한 오버헤드 포함)보다 큰 경우 지속적인 교환 중간에 붙어 있습니다. 이 경우 작업 세트를 충분히 작게 유지하도록 알고리즘을 조정하는 것이 유일한 해결책입니다.
- 특히 Linux의 경우문제 12309마음. 해당 문제는 해결된 것으로 알려졌으나 티켓에서 기록 및 결과의 중요한 부분이 누락되어 늦은 디스크 캐시 지우기 및 대량 교체 이후에 문제가 다시 발생할 수 있습니다. FreeBSD와의 중요한 차이점은 BSD 시스템에는 이러한 문제가 전혀 없다는 것입니다.