Toward better direct I/O scalability Apr 23, 2008

http://lwn.net/Articles/275808/

요즘 linux-mm쪽에서 nick 아저씨하고 계속해서 얘기가 진행중인 topic인데 lwn에 보니 정리가 잘 되어 있네요.

요는

linuxCPU-intensivework에서 scalability가 계속해서 향상되고 있는데 반해 database-heavy workload의 경우에는 그렇지가 못하다는 데서 문제가 시작되었네요.

DB와 같은 app들은 리눅스의 page cache policy를 피하기 위해 direct I/O를 사용하게 되고, 그렇게 되면 커널의 입장에서는 읽은 데이터를 user의 메모리에 바로 써주어야 하는데 그렇게 하기 위해선 해당 프로세스의 page table에 먼제 페이지 프레임들을 고정시켜야 합니다. 그것을 하기 위해서 get_user_pages API를 사용해왔고.

근데 이 함수를 사용하려면 mm에 세마포어를 하나 잡고 사용해야 하는데 두개 이상의 프로세스가 경쟁을 하기 시작하면 scalability가 확 떨어져 버리는 단점이 생깁니다.

그래서 nick이 곰곰히 생각해보니 lock을 줄일 수 있는 point도 몇몇 있고 페이지 테이블 엔트리의 하위 12bit를 사용하여 필요한 정보를 저장하고 그것을 바탕으로 처리를 하니 전체적으로 10%의 성능 향상을 보였다네요.

Anyway, server 단에서 일을 하니 DB와 같은 것들에 문제점을 찾게 되고 어떻게 보면 사소할 수도 있지만(lock을 줄여 나가는 것) 또한 특정 상황에서는 도움이 안될 수도 있는 작은 패치일 수도 있지만 조금씩 성능을 개선해나가는 구루의 면모를 볼 수 있습니다.

꼬랑지)

패치 메일만 받고서는 뭔 내용인지 사실 잘 몰랐는데 lwn을 보니 확 이해가 되네요. 역시 Jonathan Corbet은 정리의 아버지~~

지난번 ticket spinlock(http://lwn.net/Articles/267968/)에 대해서도 원저자인 nick보다 더 훌륭한 설명을 하여 nick에게 칭잔을 받은 적도 있는데..

정리는 이렇게 하는 것이다를 보여주네요..ㅎㅎ