2010 Linux Foundation Collaboration Summit Apr 20, 2010

LWN에 재밌는 기사가 떠서 그냥 넘어갈 수가 없었다.
원문은 subscriber만 볼수 있는 시기이기 때문에 1주가 지나고 나면 link를 걸 예정이다.

San Francisco에서 열린 LFCS(Linux Foundation Collaboration Summit)에 관한 요약 기사이다.
이 summit은 barrios 개인적으로는 굉장히 참석해보고 싶은 summit이었지만 여
건이 절대 허락하지 않는 멋쟁이 회사에서 근무하고 있기 때문에 절대 불가능한 일이라
꿈도 꾸지 않는다.

Barrios의 눈길을 단숨에 사로잡은 것은 Graybeards에 관한 기사였다.
요는 커널 개발자들의 젊은피(새로운 피라고 해석하는 것이 더 좋을 것 같다.)가 수혈되지 않는
다는 것에 관한 토론이었다.

하지만 결론은 그렇지 않다는 것이다. 매 커널 릴리즈 주기마다 1000명 이상의 개발자들이
관계하고 있고 그 중의 상당 부분이 처음으로 contribution을 하는 사람들이며 그 중에
20%정도는 barrios와 같이 취미(돈을 받지 않고 자신이 원해서 contribution하는)로
즐기는 사람이라고 말하고 있으며 오히려 contributor중 일부는 다른 application project로
발을 돌리는 것이 차라리 나을 것이라고 말한 것을 들은적까지 있다고 말할 정도로 많은 개발자들이
충원되고 있고 발전하고 있다는 것이다.

하지만 글에 link되어 있는 다른 기사에서는 http://www.jfplayhouse.com/2010/04/why-linux-is-not-attracting-young.html 좀 다른 말을 하고 있다.
새로운 피들이 모이지 않는 이유가 Linux는 이미 corporation stakeholder에 의해 점유되어
발전되고 있다고 말하고 있으며, 이러한 가운데 개인이 취미로 활동하는 작은 부분(ex, webcam driver)에서
얻을 수 있는 만족감이 크지 않다는 것이다. 하지만 barrios는 그렇게 생각하지 않는다.
Mainline kernel community에서는 대부분 그들만의 무대가 있다. 각자의 무대에서 각자의 분야에
집중하다 보면 자연스레 충분한 만족할 수 있다. 물론 개인별로 어느 정도의 만족을 느껴야만 자신이
그 프로젝트에서 큰 contribution을 하고 있다고 느끼는지는 모르겠지만.

하지만 Linux kernel이 이미 돈을 받으며 contribution하고 있는 full-time developer들의 비중이
크다는 것은 부정하지 않는다. 그들이 paid full-time developer가 된 것은 알이 먼저인지 닭이 먼저인지
문제이긴 하지만. 이로 인해 사실 부정적인 영향도 있는 것도 사실이다. 하지만 전체로 보았을 때 긍정적인
면이 훨씬 많기 때문에 지금까지 그래왔듯이 Linux kernel은 잘 진화하고 있는 것이라고 생각한다.

또 다른 얘기로는 Andrew Morton이 말한 kernel core developer들의 경험치와 자신감이 쌓여가며,
점점 더 복잡한 코드들을 넣고 있다는 것이다. 이로 인해 커널 개발의 진입장벽은 점점 높아지며
그로 인해 복잡한 코드들을 유지보수하기 어려워질 것이라는 이슈가 있다.

이것도 정말 공감한다. 지금 리눅스 커널은 barrios가 linux를 보기 시작한 몇년전에 비해 너무나도
급변하고 있으며 너무나도 복잡해지고 있다. 또한 점점 많은 feature들이 들어가며 알아야 할 것들이
너무 많아지고 있는 추세이다. 이는 새로운 커널 개발자들의 진입을 저해하기에 안성맞춤이다.
최근 몇년 전가지는 훌륭한 커널 서적들이 많았으나, 최근 주춤하는 시기에 커널은 급변했고,
저자들은 black hole(Robert Love)로 들어갔거나, 박사학위 준비중에 바쁘거나(Mel),
먹고 사느라 힘들기(Jonathan) 때문에 Gap을 채워줄 훌륭한 material들이 절대 부족하다.
다행스러운 것은 kernel의 document들과 source code들의 주석, git등이 점점 잘 되어가고 있다는
것이다.

이 말고도 이번 Summit에서는 Google의 Open Source Program Manager인 Chris DiBona의 talk도
있었다. 구글은 Open Source Developer의 black hole이라는 평판을 들을 정도로 한번 구글로 입사한
개발자들은 Open Source Community에서 모습을 감추는 경우가 종종 있다.(이것에 대해서는 구글 나름데로
이유가 있는데 다음에 기회가 되며 얘기하기로 하고..) 이번 talk에서 Chris는 구글이 Open Source 진영에
얼마나 많은 contribution을 하고 있는가를 설명하며 사과를 해야하는 입장이 아니라 오히려 칭찬받아야 하는
입장이라고 말한다고 전하고 있다. 하지만 많은 사람들이 수긍하는 분위기는 아니었던 것 같다.
Android에 관해서는 자신들의 코드를 upstream에 merge시킬 메조키스트가
필요하다고 말하고 있다. 이 말에서 늬앙스는 mainline kernel의 upstream에 merge시키는 프로세스와
따가운 시선들(many reviewers)을 다 극복하고 자신의 에너지를 쏟아 부어 그 안에서 보람을
느끼는 사람이 없다는 것이다. Barrios는 거꾸로 메조키스트를 언급한 것을 보면 구글 내부적으로 그러한
일을 못하게 하지는 않지만 누군가 총대를 매고 하지 않는 한 굳이 시간과 노력을 당분간은 들이고 싶지
않겠다는 뜻으로 해석한다. 어쨌든 그의 talk은 성공적이지 못했다고 전하고 있으며, 더욱 중요한 것은
성공적이지 못한 talk 대신에 그의 세션을 참석했던 모든 사람에게 Nexus One phone을 주었다는 것이다.
이것은 많은 blame들을 잠재우는 데 크게 한 몫 했다는 후문이다. 이게 오늘의 Point이다. 대인배 구글.
원래 barrios와 같이 소심한 엔지니어들은 이런 사소한(?) 것 하나하나에도 마음이 휘둘리기 쉽상이다. -_-;;

세션이 끝나고 Jonathan은 따로 Android 커널 개발자들을 만났다고 한다. 이들의 얘기는
Chris의 얘기는와는 또 달랐다고 한다. 그들은 굉장히 여느 embedded systems developer와
같았으며 즉, 언제나 상품 개발 주기는 매우 짧고, 시간은 항상 부족하고 해서 upstream에 source를
merge시킬 엄두를 못내고 있다고 한다.(이 말에 절대 "우리도"라고 동조하지 말자. 우리는 시간이
없어서가 아니라 우선 가장 크게는 "mind가 안되어 있고" 둘째로 "내공"이 부족하다.
솔직히 인정할 건 인정하자.엔지니어니까)이 부분은 barrios도 상당부분 공감한다.

하여튼 Android 커널 개발자들은 점점 외톨이가 되가고 있음을 느끼고 있으며 그것은
그들을 좌절시킨다고 느끼고 있다고 전하고 있다. Jonathan은 이 시점에서 Android 커널 개발자들이
community가 그들과 소통하려고 하고 있는 것을 들어왔고 잘 이해하고 있다고 말하며,
이번 기회를 발판으로 그들의 merge 시도를 좀더 도와줘야 하는 시점이라고 말하고 있다.

Barrios야 예전부터 android kernel의 입봉을 원하고 있었기 때문엔 당연히 그런 시점이 오면
절대적으로 support할 것이다.^^

Problem of direct reclaim page writeback Apr 19, 2010

오랜만이다. 이렇게 블로깅을 하는 것은.
이유야 여러가지가 있지만 구구절절 말할만한 상황은 아니고.

그동안 mainline에는 재미있는 일이 너무나도 많았다.
그 많은 것을 다 같이 공유하고 싶은 마음이 큰데 시간과 barrios의
게으름이 허락치 않는다. 가장 최근에 벌어지는 이슈에 대해서만 먼저
한번 얘기해보자. (나머지는 차차 기회가 있겠지)

http://lkml.org/lkml/2010/4/12/366

지금 barrios가 가장 관심을 가지고 있는 issue는 direct reclaim의
page write back문제이다. 다들 잘 알고 있겠지만 kernel은 OOM 상황을
막기 위해 시스템의 process들의 귀중한 시간을 훔친다. 즉, 하찮은 커널이
무대의 주인공인 프로세스들의 context에서 프로세스를 위해 일을 하는 것이 아니라,
메모리를 회수하기 위해 귀중한 프로세스의 resource를 것도 많이 사용한다는 것이다.

이 자체가 썩 유쾌하지 못한 상황이긴 하지만 kernel 입장에서는 어쩔수가 없다.
프로세스를 죽이는 것 보다야 낫지 않는가.

어쨌든, 지금 이슈는 이 direct reclaim path에서 stack overflow가
발생한다는 것이다. 이 문제를 제일 먼저 report한 이는 xfs의 maintainer라고
볼 수 있는 Dave Chinner이다.

Depth Size Location (47 entries)
----- ---- --------
0) 7568 16 mempool_alloc_slab+0x16/0x20
1) 7552 144 mempool_alloc+0x65/0x140
2) 7408 96 get_request+0x124/0x370
3) 7312 144 get_request_wait+0x29/0x1b0
4) 7168 96 __make_request+0x9b/0x490
5) 7072 208 generic_make_request+0x3df/0x4d0
6) 6864 80 submit_bio+0x7c/0x100
7) 6784 96 _xfs_buf_ioapply+0x128/0x2c0 [xfs]
....
32) 3184 64 xfs_vm_writepage+0xab/0x160 [xfs]
33) 3120 384 shrink_page_list+0x65e/0x840
34) 2736 528 shrink_zone+0x63f/0xe10
35) 2208 112 do_try_to_free_pages+0xc2/0x3c0
36) 2096 128 try_to_free_pages+0x77/0x80
37) 1968 240 __alloc_pages_nodemask+0x3e4/0x710
38) 1728 48 alloc_pages_current+0x8c/0xe0
39) 1680 16 __get_free_pages+0xe/0x50
40) 1664 48 __pollwait+0xca/0x110
41) 1616 32 unix_poll+0x28/0xc0
42) 1584 16 sock_poll+0x1d/0x20
43) 1568 912 do_select+0x3d6/0x700
44) 656 416 core_sys_select+0x18c/0x2c0
45) 240 112 sys_select+0x4f/0x110
46) 128 128 system_call_fastpath+0x16/0x1b

위의 로그를 살펴보면 direct reclaim path전까지 3.1K정도의
stack이 사용되어졌으며 XFS가 3.5K를 사용하는 것을 볼 수 있다.
다음 block layer와 몇가지 더 하면 금방 8K가 바닥이 나버린다.
XFS가 3.5K를 사용하는 것도 크지만 direct reclaim path만도
대략 1.1K나 사용하고 있다. 불과 함수 몇개가 말이다.

이 report는 또 다른 문제를 언급하고 있다. VM의 reclaim으로 인해
발생하는 I/O와 flusher가 발생시키는 I/O가 섞여 결국 random write가
발생하게 되고 이는 reclaimer와 flusher의 throughput을 떨어뜨리게
될 것이다.

이를 해결하기 위해 Dave가 제안한 것은 direct reclaim path에서
아예 writeback을 하지 말자는것이다. 굉장히 공격적인 방법이다.
그러므로 해당 thread는 현재 74개의 메일들로 토론이 진행되고 있다.

처음 토론이 진행되었던 것은 lumpy reclaim 문제이다.
Mel의 lumpy reclaim은 LRU distance와는 관계없이 특정 상황이 되면
lru list에 있던 페이지들에 물리적으로 근접해 있는 페이지들을 회수하여
big order contiguous page들을 만들어 내는 것이다. 이때 필요에
따라 우리는 dirty page들을 flush해야 하는 상황이 필연적으로 발생한다.
그런데 pageout을 생략하게 되면 그러한 lumpy reclaim이 직접적으로 타격을
받게 되는 것이다.

그래서 Mel과 Kosaki는 stack diet를 시도하고 있고, 반면 그것이 근본적인
해결책이 아니라고 사람들도 있다. barrios도 처음에는 전자의 편에 있었지만
좀더 생각해보니 후자가 더 좋을 것이라고 생각한다. 위의 로그를 보면
direct reclaim path도 stack을 많이 사용하였지만 XFS 또한 많이 사용하였다.
그리고 direct reclaim path전에도 무시하지 못한다.
결국 stack diet를 해서 어느 한 곳을 줄여봐야 모든 곳을 줄이지 못하면 언젠가
다시 이 문제를 만나게 될 것이라고 생각한다(우리는 함수가 nesting되는 경우나
다른 함수들을 통해서 호출되는 경우도 생각해야 한다. 위에서 보는 log의 사용량이
절대 worst case가 될 수 없다는 것이다.) 또한 barrios는 앞으로 reclaim path를
수정할때마다 stack 사용량을 일일이 계산하며(ie, 걱정하며 :)) coding하고 싶지 않다.

그렇다고 direct reclaim path에서 I/O를 하지 않게 되면 우리는 보다 많은
OOM을 만나게 될 것이다. 사실 direct reclaim path에서의 writeback은
process들의 progress를 다소 완화시켜주는 역할도 하기 때문이다.

이 와중 Andrew Morton은 양심고백을 하나 하였다.
사실 direct reclaim path에서의 write가 어느날 갑자기 심해졌다는 것이다.
아마 2.6.16 근처였던 것으로 기억하며 아무도 그 문제에 대해서 fix하려고
시도하지 않았다는 것이다. 또한 writeback을 다른 곳으로 돌리는 것은
2.5.10에 시도되었었지만 그리 효과가 없었다고 말하며 address_space를
pinning할 수 없어 writearound 자체가 구현하기 쉽지 않다고 말하고 있다.

Dave의 patch에 관해서는 flusher는 target zone을 고려하지 않고 있어
잘못된 페이지들만을 계속해서 flush하는 상황이 발생하며 이는 system을
livelockable하게 만들수도 있다고 한다. 여기에 barrios는 한가지 더 우려가
되는 것은 LRU distance와 상관없는 페이지들을 대거 writeout함으로써
이어지는 write-merge등에 손해를 볼 수 있고, working set들이 밀려나가게
되어버리는 일도 발생할 수 있다고 생각한다.

Andrew는 I/O pattern 문제를 해결하기 위해서 이전에 언급했던
"왜 갑자기 direct reclaim path에서 많은 I/O가 발생하기 시작하였나?
우리가 그 문제를 피할수는 없는 것인가?" 부터 생각해야 하며
Stack Overflow문제를 풀기 위해서는 자신없어하며 target page를
다른 쓰레드에게 패스하여 해당 쓰레드와 동기를 맞추면 어떨까 한다.

현재까지 이 문제에 대한 별다른 해결책이 없어 보이는 가운데
James Bottomley는 이번 MM summit과 FS summit이 함께 열리기 때문에
그때까지도 문제가 해결이 되지 않으면 그 자리에서 안건을 올려 한번 얘기해보자고
하고 이에 다른 개발자들은 이 제안에 환영하고 있다. 그 이유는 이미 FS 개발자들에게
random I/O 문제는 consensus를 이룬 문제이며, 정말 문제는 MM guys들이
이 문제를 이해하지 못하고 있다고 생각하고 있기 때문이다. 사실 MM guys들이
이해를 못하고 있는 것이 아니라, 어떻게든 많은 부분을 수정하지 않고 고쳐보려고
하는 것이다. -_-;; 하지만 barrios의 생각으론 FS guys들의 의견에 전적으로
동의한다. 간만에 MM summit이 열리는데 재밌는 안건이 될 것이다.
비록 참석은 못하더라도 재밌는 토론거리가 될 것 같다.