2011-12-15 3 views
8

this tutorial에 따르면 비동기식 디스크 파일 io는 적어도 프로그래밍/api 관점에서 볼 때 Linux에서 AIO를 사용하여 쉽게 얻을 수 있습니다. 하지만이 튜토리얼을 시작하기 전과 후에 많은 포스트와 기사를 읽었는데,이 중 하나를 수행 할 수 없거나 패치 및 기타 많은 문제가있는 libevent를 사용해야합니다. 또 다른 것은 루프를 기다려야한다는 신호 였지만,이 튜토리얼을 기반으로 콜백 메커니즘을 사용할 수 있습니다. AIO를 사용하면 훨씬 쉽게 사용할 수 있습니다.Linux 디스크 파일 AIO

지금은 리눅스 프로그래머가 아닙니다. 리눅스에서 비동기 디스크 파일 io를 지원하는 간단한 방법을 찾고 배우고 비동기 디스크 io 라이브러리에 추가하면됩니다. 개인 프로젝트. 현재 비 윈도우 플랫폼에서 윈도우와 io 작업자 스레드에 오버랩 된 io를 사용하고 있습니다. mutithreaded 솔루션은 까다로울 수 있으므로 Linux에서 AIO로 바꾸고 싶습니다.

자,이 튜토리얼에서 설명한 AIO의 문제점은 무엇입니까? 성능입니까? AIO를 사용하여 수행 할 수있는 작업에 대한 제한이 있습니까?

p.s. 주요 리눅스 배포판에서 작동하는 한, 코드가 다른 POSIX 호환 플랫폼으로 이식 가능하지 않더라도 상관하지 않습니다. 그리고 제가 관심을 갖는 것은 일반적인 디스크 파일 io입니다.

감사합니다.

+3

Linux에서 AIO 지원이 잘못되었습니다. 현재 AIO는 버퍼 캐시를 무시하고 디스크 IO를 직접 수행하므로 성능이 크게 저하 될 수 있습니다. – lvella

+0

작업자 스레드 솔루션보다 더 나쁠 수 있습니까? – p00ya00

+1

사용법에 따라 다릅니다. 큰 파일을 순차적으로 읽거나 쓰는 것만해도 성능은 좋지만 무작위로 작은 덩어리에 액세스하면 확실히 악화됩니다. 그런데이 작업자 스레드 솔루션은 POSIX 인터페이스'aio_read() '를 사용하면 얻을 수 있습니다. glibc가 사용자 공간에 스레드를 블로킹하여 구현됩니다. – lvella

답변

11

이 튜토리얼에서는 일반적으로 비동기 I/O에 대한 개요를 제공하고 커널 지원 방법에 대해 설명합니다. 그런 다음 POSIX AIO (비동기 I/O에 액세스하기위한 표준화 된 API)에 대해 이야기하고 있습니다. posix AIO API를 사용하면 AIO에 대한 커널 지원에 액세스 할 수 있습니다. 그렇지 않다.

리눅스에서, 실제로 두 개의 AIO 구현있다 : io_submit()를 사용

  1. 커널 AIO 등)만을 커널 2.6 지원되는 (또는 실제로 2.5 백 포팅있을 수있다된다. 2.4 그것의 버전.
  2. 커널 본질적으로 관련이없는 glibc는 기능입니다
  3. POSIX의 AIO. 그것은 I/O 호출 디스크를 차단하고 사용자 수준 스레드의 측면에서 POSIX API를 구현합니다.

그래서 간단히 말해, 이미 일반적인 구현이있는 경우 디스크 I/O를위한 다중 쓰레드를 사용한다면, glibc의 구현을 사용하는 것보다는 그것을 사용하는 것이 더 좋다.

실제로 함수의 io_submit() 패밀리를 사용하려는 경우 해당 함수의 제한을 우회하기 위해 많은 작업을해야 할 수도 있습니다.

커널 AIO 파일을 O_DIRECT로 열어야합니다. 차례로 모든 파일 오프셋이 필요하므로 디스크의 블록에 맞게 크기를 읽고 쓰십시오. 대용량 파일 하나만 사용하고 OS의 페이지 캐시와 매우 유사하게 작동하는 경우 일반적으로 문제가되지 않습니다. 임의의 파일을 임의의 오프셋 및 길이로 읽고 쓰려면 지저분 해집니다.

커널 AIO를 사용하게되면, io_getevents()를 사용하지 않고 epoll/select를 사용하여 완료 될 때까지 기다릴 수 있도록 하나 이상의 eventfds를 iocbs와 연결하는 것이 좋습니다.

2

Linux에서 POSIX AIO를 구현하면 사용자가 수행하는 모든 작업에 대해 스레드가 생성됩니다. 이것은 일반적으로 좋지 않으므로 작업 스레드 수를 조정하여 쓰기 작업을 수행하는 것이 좋습니다. 그러면 작업중인 스레드 수를 제어 할 수 있습니다. 다른 말로하면, 당신이 가지고있는 것을 고수하십시오, AIO는 당신에게 아무것도 사지 않을 것입니다.

+0

커널 AIO는이 작업을 수행하지 않지만 버퍼 캐시 등을 우회하기 때문에 덜 유용합니다 (물론 데이터베이스가 원하는 것입니다) – MarkR

관련 문제